| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 13:32:46
|
wellington7
JavaEvangelist
![[Avatar]](/images/avatar/b80d1ec3ddec44d03ab7b4d32a6ae480.jpg)
Membro desde: 16/03/2007 14:03:02
Mensagens: 333
Offline
|
Pra quem tem mais experiência aí, vcs consideram um erro quando em alguma parte do código vc tem uma chamada de métodos neste estilo:
//cor do tijolo da casa do prefeito
Color corTijolo = prefeito.getCidade().getBairro().getRua().getCasa().getParede().getTijolo().getCor();
Parece estar bem encapsulado, mas parece estar um tanto porco tb.. sei lá.. não sei outro modo interessante de fazer isso.. O que me dizem?
|
"Faça por onde que eu te ajudarei"
Idéias que você deveria conhecer:
Lombok
SSCCE |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 13:42:52
|
ddduran
Virtual Machine Man
![[Avatar]](/images/avatar/1239f1a40e317d2de113e7ca17f52464.jpg)
Membro desde: 13/11/2006 16:44:54
Mensagens: 523
Offline
|
isso não é um problema de encapsulamento, ne?
você poderia ter seus atributos sem encapsulamento e daria na mesma
Color corTijolo = prefeito.cidade.bairro.rua.casa.parede.tjolo.cor;
ok?
isso ai ta mais pra POG, será que vai dar um NullPointer ai?
qual deles está nulo?
há uma convesão (não vou achar referencia pra isso) que diz que quando você navega mais de 2 niveis há algo errado na sua modelagem ou
você deveria quebrar a linha fazendo algo como
rua = prefeito.getCidade().getBairro().getRua();
tijolo = rua.getCasa().getParede().getTijolo();
Color corTijolo = tijolo.getCor();
enfim, quando você faz uma coisa dessas você tem que no minio rever sua logica ou modelagem
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 13:45:35
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Só reforçando a ideia: encapsulamento nunca é porco. Todo o objetivo de OO é encapsular.
Encapsular dados, comportamentos, dependências, algoritmos, decisões, etc...
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 13:50:10
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Se você usasse uma linguagem que retornasse null quando você chamasse um método sobre um objeto null, até seria razoável. (Não sei se o Objective-C ou o Smalltalk são assim). Por exemplo, digamos que o prefeito não tenha casa; então getCasa() retorna null. Se você usasse uma linguagem dessas, então null.getParede() retornaria null em vez de provocar um null pointer exception, e null.getTijolo() retornaria null, e null.getCor() retornaria null, ou seja, a cor da casa do prefeito é null porque o prefeito não tem casa.
O problema é que se qualquer um desses métodos retornar null, você vai ter um null pointer exception medonho em vez de você ter uma resposta "null", que é o razoável nesse caso.
Neste caso, você deveria criar um objeto especial para cada uma dessas classes (digamos CidadeNull, BairroNull, RuaNull etc.) para substituir o null. Por exemplo, RuaNull (um objeto da classe Rua, de preferência declarado como "static" para permitir comparação com "==" em vez de equals) poderia retornar para getCasa() o valor CasaNull. CasaNull pode retornar para getParede o valor ParedeNull. E assim por diante. É que nem sempre você pode controlar todas as classes. No seu caso, não podemos ter um Color que seja "null" porque ela é uma classe java.awt.Color; se ela não for final, podemos derivar uma classe Cor de java.awt.Color que tenha esse objeto especial CorNull.
This message was edited 2 times. Last update was at 16/10/2007 13:54:58
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 14:27:07
|
Giulliano
GUJ Master
![[Avatar]](/images/avatar/7f5a17b792b687fc4c227a5c5e569dd8.jpg)
Membro desde: 14/11/2006 19:29:38
Mensagens: 1627
Localização: São Paulo
Offline
|
Embora não esteja errado...ficou estranho....todos devem concordar com isso (eu acho... :D) Mas se vc fizesse, APENAS COMO EXEMPLO: nesse caso vc faria prefeito.getCasaPrefeito.getcor(); fica mais bonitinho né...
This message was edited 1 time. Last update was at 16/10/2007 14:28:41
|
Oracle Certified Master, Java EE 5 Enterprise Architect
Oracle Certified Professional Java Programmer
GiuLLianO MoRRoNi
<UnTouChAbLe> |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 14:37:32
|
wellington7
JavaEvangelist
![[Avatar]](/images/avatar/b80d1ec3ddec44d03ab7b4d32a6ae480.jpg)
Membro desde: 16/03/2007 14:03:02
Mensagens: 333
Offline
|
No caso então a melhor solução é simplesmente quebrar em mais linhas?
conforme o ddduran:
rua = prefeito.getCidade().getBairro().getRua();
tijolo = rua.getCasa().getParede().getTijolo();
Color corTijolo = tijolo.getCor();
Ou, facilitando a manutenção, apesar de aumentar o código:
cidade = prefeito.getCidade();
bairro = cidade.getBairro();
rua = bairro.getRua();
casa = rua.getCasa();
parede = casa.getParede();
tijolo = parede.getTijolo();
Color corTijolo = tijolo.getCor();
Talvez ficaria melhor essa segunda opção, escrita dentro de um método 'private getCorTijolo()' colocado na classe onde estou escrevendo isso tudo, correto?
|
"Faça por onde que eu te ajudarei"
Idéias que você deveria conhecer:
Lombok
SSCCE |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 14:48:41
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Não sei se a solução é "quebrar em mais linhas". Acho que você poderia usar o "pattern" do "Null Object" que lhe expliquei para poder contornar esses problemas chatos do tipo "como o prefeito não tem casa, então eu tenho um null pointer exception, em vez de saber que a cor é null porque o prefeito não tem casa".
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 14:51:48
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
wellington7 wrote:Pra quem tem mais experiência aí, vcs consideram um erro quando em alguma parte do código vc tem uma chamada de métodos neste estilo:
//cor do tijolo da casa do prefeito
Color corTijolo = prefeito.getCidade().getBairro().getRua().getCasa().getParede().getTijolo().getCor();
Parece estar bem encapsulado, mas parece estar um tanto porco tb.. sei lá.. não sei outro modo interessante de fazer isso.. O que me dizem?
Quando eu olho algo desse tipo eu lembro de xpath
/cidade/bairro/rua/casa/parede/tijolo/cor
ou, se der pra simplificar
//tijolo/cor
Agora... essa 'montoeira' de métodos poderia funcionar sem null pointer exception se vc garantir que nenhum método retorna null. Se o prefeito não pudesse e não tivesse uma casa, ele poderia lançar uma 'CasaNotFoundException'.
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 14:55:04
|
rodolfogs8
Java Ninja
![[Avatar]](/images/avatar/5c3b44401b674811b5e8088e1a24e7a5.jpg)
Membro desde: 20/01/2007 02:11:39
Mensagens: 273
Localização: Interlagos - SP
Offline
|
Nao acho que seria porco mas poderia dar uma reduzida, nao que esteja errado somente poderia ser menor se parar para pensar....mas nao esta errado nao....
|
Rodolfo(-_-)ZZzzzZZzzzZzzzz....
Saw III |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 14:58:08
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 15:15:18
|
ddduran
Virtual Machine Man
![[Avatar]](/images/avatar/1239f1a40e317d2de113e7ca17f52464.jpg)
Membro desde: 13/11/2006 16:44:54
Mensagens: 523
Offline
|
ptz cara, sinceramente esse negocio do null não me agrada muito, você ja usou isso?
acho que o negocio é quando você tiver a necessidade de navegar tanto entre seus objetos é rever sua modelagem ou fazer alguma fabrica
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 15:20:55
|
Leonardo3001
GUJ Ranger
Membro desde: 04/07/2007 18:28:58
Mensagens: 975
Offline
|
wellington7 wrote:Pra quem tem mais experiência aí, vcs consideram um erro quando em alguma parte do código vc tem uma chamada de métodos neste estilo:
//cor do tijolo da casa do prefeito
Color corTijolo = prefeito.getCidade().getBairro().getRua().getCasa().getParede().getTijolo().getCor();
Parece estar bem encapsulado, mas parece estar um tanto porco tb.. sei lá.. não sei outro modo interessante de fazer isso.. O que me dizem?
Na minha opinião, melhor fazer prefeito.getCorTijolo(), e por dentro desse método, você faz o aninhamento de métodos necessários (e cria exceções apropriadas caso algum erro ocorra). A razão disso é que você oculta o esquema navegacional para o cliente da interface, pois a navegação pode mudar com o tempo.
Além disso, o exemplo não é muito adequado. Imagine que um objeto Cidade seja retornado chamando prefeito.getCidade(): ao invocar getBairro() nesse objeto, quantos objetos Bairro deveriam ser retornados? Vários, pois uma cidade é um conjunto de vários bairros, e aí o restante dos métodos estariam inválidos pois não posso invocá-los em uma Collection ou em um Array. Se for pra retornar um, significa que o objeto Cidade conhece o objeto Prefeito, e aí a acoplamento está perigosamente alto.
Pense nisso.
|
Leonardo Veríssimo
-------------------------------------------------
Objectzilla |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 16:15:25
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Existem duas possibilidades. A primeira é a que você está usando Fluent Interface: http://martinfowler.com/bliki/FluentInterface.html
A segunda é que você está querendo fazer um código OO normal em Java, neste caso está quebrando a Lei de Deméter: http://en.wikipedia.org/wiki/Law_of_Demeter
E é sempre bom lembrar: get/set e encapsulamento têm muito pouco a ver um com o outro.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 17:02:07
|
Giulliano
GUJ Master
![[Avatar]](/images/avatar/7f5a17b792b687fc4c227a5c5e569dd8.jpg)
Membro desde: 14/11/2006 19:29:38
Mensagens: 1627
Localização: São Paulo
Offline
|
Segundo a Lei de Demeter acho que a minha idéia foi a mais próxima...onde casa tem coisas de casa e prefeito tem coisas de prefeito...se precisar de alguma coisa sobre a casa do prefeito...vc acessa através da instância casa dentro do prefeito (prefeito TEM-UM casa)
|
Oracle Certified Master, Java EE 5 Enterprise Architect
Oracle Certified Professional Java Programmer
GiuLLianO MoRRoNi
<UnTouChAbLe> |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/10/2007 18:14:55
|
TheMask
JavaBaby
![[Avatar]](/images/avatar/e6abb6620be44e2035008f84888a43b1.jpg)
Membro desde: 14/04/2006 19:28:16
Mensagens: 79
Offline
|
Neste caso, recomendo a leitura deste post.
|
**** Demaaaaaaais ****
 |
|
|
 |
|
|