Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como respeitar a Lei de Demeter com objetos complexos

Para evitar os encadeamentos new A().getB().getC() e respeitar a Lei de Demeter basta eu fazer um um redirecionamento para a classe responsável?

Suponhamos um objeto complexo que por algum motivo eu precise acessar os atributos da classe que compõe esta classe principal. Eu tenho que replicar os atributos das 'filhas' na classe principal, fazendo o redirecionamento para a classe responsável e manter assim o encapsulamento?

Acho que fica mais fácil de entender dando um exemplo em código. Este exemplo abaixo respeita a Lei de Demeter e as boas práticas em progamação OO?

public class A {
    private Map<Integer, B> mapa;

    public A(Map<Integer, B> mapaDeB) {
        this.mapa = mapaDeB;
    }

    public String getNomeB(int idB) {
        return this.mapa.get(idB).getNome();
    }

    public void setNomeB(int idB, String nomeB) {
        this.mapa.get(idB).setNome(nomeB);
    }

    public String getNomeC(int idC) {
        return this.mapa.get(idC).getNomeC();
    }

    public void setNomeC(int idB, String nomeB) {
        this.mapa.get(idB).setNomeC(nomeB);
    }
}
public class B {
       private int id;
       private String nome;
       private C c;

       public B(int id, String nome, C c) {
            super();
            this.id = id;
            this.nome = nome;
            this.c = c;
       }    

       public int getId() {
             return id;
       }


       // da propria instancia
       public String getNome() {
             return this.nome;
       }
       public void setNome(String nome) {
             this.nome = nome;
       }


       // da instancia da classe que compoe B
       public String getNomeC() {
             return this.c.getNome();
       }
       public void setNomeC(String nomeC) {
             this.c.setNome(nomeC);
       }
}
public class C {
    public C() {}

    public C(int id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    private int id;
    private String nome;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
public class Teste{
    public static void main(String[] args) {
        Map<Integer, B> mapaDeB = new HashMap<Integer, B>();

        C c1 = new C(1, "c1");

        B b1 = new B(1,"b1", c1);
        mapaDeB.put(b1.getId(), b1); 

        A a1 = new A(mapaDeB);

        // acessando e alterando valores de B pelo A
        System.out.println("nome B: " + a1.getNomeB(b1.getId()));
        a1.setNomeB(1, "b1 foi alterado");
        System.out.println("nome B: " + a1.getNomeB(b1.getId()));

        // acessando e alterando valores de C pelo A
        System.out.println("nome C: " + a1.getNomeC(c1.getId()));
        a1.setNomeC(1, "c1 foi alterado");
        System.out.println("nome C: " + a1.getNomeC(c1.getId()));
    }
}
2 respostas
solução!

Olá, tudo bem ??

Pelo que li, você está respeitando sim e principio muito bem.

Oi, Matheus! Obrigado pelo retorno.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software