Encapsulamento vantajoso ou porco?  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
wellington7
JavaEvangelist
[Avatar]

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
  • ddduran
    Virtual Machine Man
    [Avatar]

    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

    sergiotaborda
    GUJ Expert
    [Avatar]

    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
    [WWW]
    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

    [WWW]
    Giulliano
    GUJ Master
    [Avatar]

    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>
    [Email] [WWW] [MSN]
    wellington7
    JavaEvangelist
    [Avatar]

    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
  • 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".
    [WWW]
    peczenyj
    Moderador
    [Avatar]

    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.'
    [WWW]
    rodolfogs8
    Java Ninja
    [Avatar]

    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
    aim icon
    thingol
    Moderador

    Membro desde: 29/07/2004 16:10:13
    Mensagens: 17543
    Offline

    [WWW]
    ddduran
    Virtual Machine Man
    [Avatar]

    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
    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
    [WWW]
    pcalcado
    Moderador
    [Avatar]

    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
    [Email] [WWW] [Yahoo!] [MSN]
    Giulliano
    GUJ Master
    [Avatar]

    Membro desde: 14/11/2006 19:29:38
    Mensagens: 1627
    Localização: São Paulo
    Offline

    pcalcado wrote: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.


    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>
    [Email] [WWW] [MSN]
    TheMask
    JavaBaby
    [Avatar]

    Membro desde: 14/04/2006 19:28:16
    Mensagens: 79
    Offline

    pcalcado wrote:... 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 ...


    Neste caso, recomendo a leitura deste post.

    **** Demaaaaaaais ****
     
    Índice dos Fóruns » Arquitetura de Sistemas
    Ir para:   
    Powered by JForum 2.1.8 © JForum Team