DEV Community

Gustavo Inocencio
Gustavo Inocencio

Posted on

Lei de Demeter

A Lei de Demeter ou principio do conhecimento minimo é uma diretriz de desenvolvimento de software, particularmente de sistemas que utilizam a programação orientada a objetos.
— Wikipedia

Esta lei foi proposta por Ian Holland em 1987. Holland e seus colegas estavam programando um sistema chamado Demeter usando programação orientada a objetos. Durante o desenvolvimento do sistema, eles perceberam que o código que atendia a uma série de regras era menos acoplado.

A Lei de Demeter exige que um método m de um objeto O só pode invocar os métodos dos seguintes tipos de objetos:

  • O próprio.
  • parâmetros de m.
  • Quaisquer objetos criados / instanciados em m.
  • Objetos componentes diretos de O.
  • Uma variável global, acessível por O, no escopo de m.

Em resumo, todas as regras acima podem ser resumidas dizendo que você deve evitar invocar métodos de um objeto retornado por outro método. Em linguagens orientadas a objetos modernas, o identificador usado é ponto ou ->. Portanto, a lei de Demeter é violada quando o código tem mais de uma etapa entre as classes.

Um exemplo de código em que a lei de Demeter é violada é apresentado a seguir:

const data = cliente.ultimoPedido.dadosPedido.dataEmissao

Nesse caso é conhecido a estrutura interna do objeto ultimoPedido. O problema nisso é que em uma modificação da classe ultimoPedido, as propriedades podem não existir mais e assim ocorrerá uma quebra no sistema, um chamado a uma propriedade nula.

Nesse caso o ideal é que seja feito na classe ultimoPedido um getDataEmissao para ser usado em outras classes.

const data = ultimoPedido.getDataEmissao()

Assim, mesmo que se modifique a classe ultimoPedido o método ainda existe e vai retornar a informação necessária.

Principais Vantagens

  • Dependências entre classes e acoplamento são reduzidas.
  • Classes podem ser reutilizadas com facilidade.
  • Código é mais fácil de testar.
  • Código é mais fácil de manter e flexível para mudanças.

Discussion (1)

Collapse
eduardoklosowski profile image
Eduardo Klosowski

Interessante, nunca tinha ouvido falar dessa lei e gostei da ideia.