Vc conhece a Lei de Demeter?
- #Java
A lei de Demeter é um princípio de programação que se concentra em reduzir o acoplamento entre objetos em um programa. Isso é alcançado através da limitação das interações entre objetos, de modo que cada objeto conheça apenas seus objetos imediatamente relacionados. Em outras palavras, um objeto deve evitar chamar métodos ou acessar propriedades de outros objetos que não estejam diretamente relacionados a ele.
Essa abordagem promove uma melhor mantenabilidade do código e torna as mudanças no programa menos propensas a causar efeitos colaterais inesperados. A Lei de Demeter é frequentemente resumida pela seguinte frase: "Só fale com seus amigos imediatos".
Por exemplo, suponha que temos um objeto "A" que possui um objeto "B", que por sua vez possui um objeto "C". Se "A" precisar acessar uma propriedade de "C", ele deve fazê-lo através de "B", em vez de chamar diretamente "C". Isso ajuda a garantir que "A" não precise conhecer todos os detalhes de "C" e evita o acoplamento desnecessário entre objetos.
A Lei de Demeter é uma técnica útil para promover a modularidade do código e tornar os programas mais fáceis de entender e manter. Além disso, pode ser usado para melhorar o desempenho do programa, reduzindo a quantidade de objetos que precisam ser criados e acessados.
Um exemplo em Java explicando o conceito está descrito abaixo:
Imagine que temos três classes: Cliente
, Pedido
e ItemPedido
. A classe Cliente
possui uma lista de pedidos, e cada pedido possui uma lista de itens. O objetivo é imprimir o nome do cliente e a quantidade total de itens em todos os pedidos dele. Em vez de acessar diretamente os itens dos pedidos de um cliente, podemos usar a Lei de Demeter para tornar o código mais modular e fácil de entender. Uma solução seria adicionar um método na classe Cliente
que retorna a quantidade total de itens em seus pedidos:
public class Cliente {
private List<Pedido> pedidos;
public Cliente(List<Pedido> pedidos) {
this.pedidos = pedidos;
}
public int getQuantidadeTotalItens() {
int quantidadeTotal = 0;
for (Pedido pedido : pedidos) {
quantidadeTotal += pedido.getQuantidadeTotalItens();
}
return quantidadeTotal;
}
}
Em seguida, adicionamos um método similar na classe Pedido
que retorna a quantidade total de itens nele:
public class Pedido {
private List<ItemPedido> itens;
public Pedido(List<ItemPedido> itens) {
this.itens = itens;
}
public int getQuantidadeTotalItens() {
int quantidadeTotal = 0;
for (ItemPedido item : itens) {
quantidadeTotal += item.getQuantidade();
}
return quantidadeTotal;
}
}
E finalmente, adicionamos o método getNome()
na classe Cliente para retornar o nome do cliente:
public class Cliente {
private String nome;
private List<Pedido> pedidos;
public Cliente(String nome, List<Pedido> pedidos) {
this.nome = nome;
this.pedidos = pedidos;
}
public int getQuantidadeTotalItens() {
int quantidadeTotal = 0;
for (Pedido pedido : pedidos) {
quantidadeTotal += pedido.getQuantidadeTotalItens();
}
return quantidadeTotal;
}
public String getNome() {
return nome;
}
}
Assim, podemos imprimir o nome do cliente e a quantidade total de itens em seus pedidos da seguinte forma:
Cliente cliente = new Cliente("João", Arrays.asList(
new Pedido(Arrays.asList(new ItemPedido(2), new ItemPedido(3))),
new Pedido(Arrays.asList(new ItemPedido(1), new ItemPedido(5), new ItemPedido(2)))
));
System.out.println(cliente.getNome() + " - " + cliente.getQuantidadeTotalItens() + " itens");
Esse exemplo ilustra como a Lei de Demeter pode ser aplicada para tornar o código mais modular e fácil de entender.
Referências:
[1] https://www.careerfaqs.com.au/news/news-and-views/how-to-respond-to-a-confusing-email-template
[2] https://www.grammarly.com/blog/how-to-ask-for-clarification/
[3] https://learningenglish.voanews.com/a/how-to-ask-for-clarification/4726030.html
[4] https://www.infoworld.com/article/3136224/demystifying-the-law-of-demeter-principle.html
[5] https://www.youtube.com/watch?v=bxlkbS_qiXg
[6] https://medium.com/vattenfall-tech/the-law-of-demeter-by-example-fd7adbf0c324