Você está na página 1de 2

Law of Demeter

A lei de Demeter um conjunto de regras para construir sistemas visando baixo acoplamento, tambm conhecida como Princpio do menor Conhecimento e Fale somente com os amigos. Apesar do nome, Demeter no foi o autor, Demeter o nome do projeto conduzido pela universidade Northeasterns University em 1987 liderado pelo Dr. Karl Lieberherr. Foi projeto Demeter que as leis foram criadas e por isto o nome. Em linhas gerais, as regras so: Cada unidade deveria somente utilizar um conjunto limitado de unidades de outras unidades: somente unidades fortemente relacionadas com a unidade corrente. Cada unidade deveria falar somente com seus amigos e no com estrangeiros.

Em orientao a objetos, definido que uma unidade=mtodo de um objeto, a lei traduzida da seguinte forma: Um mtodo M de um objeto O somente poderia acessar mtodos de outros objetos que sigam as diretrizes: Seja parmetro de M Um objeto que M criou Um mtodo do prprio objeto O Objeto diretamente relacionado com o objeto O Uma varivel global acessvel pelo objeto O

Para no ficar muito abstrato, vamos aos exemplos: Seja parmetro de M: 1 public class A{ 2 public void FazAlgumaCoisa(B parametro){ 3 parametro.FazOutraCoisa();} 4} Um objeto que M criou: 1 public class A{ 2 public void FazAlgumaCoisa(){ 3 B objetoB = new B(); 4 B.FazOutraCoisa();} 5 } Um mtodo do prprio objeto O 1 public class A{ 2 private void FazOutraCoisa(){ 3 //faz algo} 4 public void FazAlgumaCoisa(){ 5 FazOutraCoisa();} 6} Objeto diretamente relacionados com o objeto O

01 public class B{ 02 public void FazOutraCoisa(){ 03 //Faz algo} 04 } 05 public class A{ 06 private B _objetoB; 07 08 09 10 } A(){_objetoB = new B();} public void FazAlgumaCoisa(){ _objetoB.FazOutraCoisa();}

Um dos grandes problemas que temos na manuteno de sistemas OO o alto acoplamento, ou seja, nossos objetos falam com muitos objetos, e quando isto acontece, se eu alterar um objeto no sistema, posso ter efeitos colaterais nos chamadores. A lei de Demeter como vimos, ajuda a diminuir este acoplamento. Algo do tipo 01 public class C{ 02 public void FazMaisOutraCoisa(){ 03 //Faz algo} 04 } 05 06 public class B{ 07 public C FazOutraCoisa(){ 08 return new C();} 09 } 10 public class A{ 11 12 13 14 15 } private B _objetoB; A(){_objetoB = new B();} public void FazAlgumaCoisa(){ _objetoB.FazOutraCoisa().FazMaisOutraCoisa();}

fere a lei de Demeter, pois no estou mais falando com um amigo e sim com o mtodo de C que o objeto de retorno de B, o estrangeiro. Agora nossa classe A tem acoplamento com B e C. Se alterar algo em C, tenho efeitos em A. Sacaram ao que leva a lei de Demeter? Um dos princpios de orientao a objetos que leva a concordncia com a lei de Demeter, o princpio da responsabilidade exclusiva do S.O.L.I.D. Porque digo isto? Simples, quando meu mtodo comea a usar muitos recursos de outro objeto, em vez do prprio objeto ao qual pertence, provavelmente este mtodo est no local errado, resumindo, no faz parte das responsabilidades do objeto que est. Outro princpio interessante de OO que ajuda a atingir a lei o Tell dont ask, mas este deixo para vocs lerem nas referncias deste post. Concordam com Lei, o que acham?

Você também pode gostar