O documento discute o Princípio da Lei de Demeter (LOD), que promove baixo acoplamento entre classes limitando o conhecimento de cada classe. O texto apresenta um exemplo de violação desse princípio e como corrigi-lo removendo a dependência direta entre as classes Jornaleiro e Carteira.
1. Engenharia de software centrada em métodos ágeis – Turma 2
Disciplina: Programação Orientado a Objeto
Professor: Edgar Davidson Data: 15/06/2011
Grupo: Gladson Otavio
Emerson Roger
Princípio Law Of Demeter (LOD)
Lei de demeter
Princípio
A lei de Demeter é um conjunto de regras para construir sistemas
visando baixo acoplamento, também conhecida como Princípio do menor
Conhecimento e fale somente com os amigos.
Aspecto Gerais
• Cada unidade deveria somente utilizar um conjunto limitado de unidades de
outras unidades.
• Cada unidade deveria falar somente com seus amigos e não com
estrangeiros.
Em orientação a objeto
Um método M de um objeto O somente poderia acessar métodos de outros
objetos que sigam as diretrizes:
Seja parâmetro de M
Um objeto que M criou
Um método do próprio objeto O
Objeto diretamente relacionado com o objeto O
Uma variável global acessível pelo objeto O
Infringindo o princípio
Analisando o diagrama de classe abaixo, temos três classes que mantem
relacionamentos entre si, mas a clsse jornaleiro mantem dependência indesejada com
a classe carteira, causado pelo método coletarPagamento, quebrando o principio de
lod.
public void coletarPagamento(){
for (Cliente cliente : clientes) {
if (cliente.getMinhacarteira().getValor()>= nota) {
cliente.getMinhacarteira().subtractValor(nota);
fundoColeta += nota;
}
else {
System.out.println("Sem dinheiro");
}
}
}
2. A finalidade do método coletar pagamento, é coletar pagamento dos clientes por
produtos ou serviços oferecido pela classe jornaleiro,mas perceba que dentro do
método, a classe jornaleiro acessa a classe carteira que mantem associação apenas
com cliente,passando a conhecer tudo que tem na carteira do cliente, ou seja na
classe carteira, coisa que somente o cliente deve saber. Analise o diagrama abaixo e
perceba o forte acoplamento criado,pois foi criado uma depenência com aclasse
carteira.
Solução
1º Para resolver este problema, temos que remover o método
getMinhacarteira() da classe cliente e criar um método getfazerPagamento,
agora o cliente recebe a nota e faz o pagamento para o jornaleiro, cenário que
acontence no mundo real. Vamos verificar o código criado.
public double getFazerPagamento(double nota) {
double valorPago = 0
if (minhacarteira.getValor() >= nota) {
minhacarteira.subtractValor(nota);
valorPago = nota;
}
return valorPago;
}
2º Agora, também é preciso modificar o método coletarPagamento() da classe
jornaleiro, pois ele não acessa mais a classe carteira para retirar a pagamento que lhe
é devido.Vamos analisar a modificação feita na método:
3. public void coletarPagamento(){
for (Cliente cliente : clientes) {
double pagamento = cliente.getFazerPagamento(nota);
if (pagamento !=0) {
fundoColeta += pagamento;
}
}
}
Perceba que agora, dentro do método há uma variável pagamento que recebe o
método fazerPagamento(nota) da classe cliente, desta maneira o jornaleiro sequer tem
conhecimento das informções da classe carteira, alias ele nem precisa saber se o
cliente tem uma carteira.
Agora atende ao principio (lod) lei de demeter,veja que a dependência da classe
jornaleiro com a classe carteira foi removida
Conclusão
Este princípio é muito importante para manter baixo acoplamento entre as
classes, mas é preciso arquitetar bem o projeto para que não seja criado muitos
métodos na classe, causando uma baixa coesão . Este princípio não é aplicado a
todos os projetos, pois haverão casos onde a regra de negócio exige que várias
classes precisam conhecer outras calsses.