Lei de Deméter (LoD)
Definição
A Lei de Deméter (Law of Demeter - LoD) é uma diretriz de design que sugere que um módulo deve conhecer o mínimo possível sobre os outros módulos com os quais interage.
Em termos práticos, uma função ou método deve chamar apenas métodos de:
- Si mesmo
- Parâmetros recebidos
- Objetos que ela cria diretamente
- Seus atributos diretos
Ou seja, evite acessar objetos “de objetos” (ex:
pedido.cliente.endereco.cidade
), pois isso cria dependências
frágeis e acoplamento excessivo.
Por que é importante
A Lei de Deméter promove encapsulamento e reduz o acoplamento. Quando uma parte do sistema depende da estrutura interna de outra, qualquer mudança na hierarquia de objetos pode quebrar o código.
Respeitar essa lei ajuda a manter os módulos mais autônomos e menos sensíveis a alterações estruturais, facilitando refatorações e evoluções de sistema.
Exemplo prático (Python)
Este exemplo viola a Lei de Deméter ao acessar uma cadeia de objetos internos:
# Violação da LoD
cidade = pedido.cliente.endereco.cidade
Aqui, a função depende da estrutura interna de cliente
e
endereco
, que pode mudar a qualquer momento. Para respeitar a
LoD, delegamos essa responsabilidade para a própria classe
Pedido
:
class Pedido:
def __init__(self, cliente):
self.cliente = cliente
def obter_cidade_do_cliente(self):
return self.cliente.obter_cidade()
class Cliente:
def __init__(self, endereco):
self.endereco = endereco
def obter_cidade(self):
return self.endereco.cidade
Agora, quem precisa da cidade chama apenas:
cidade = pedido.obter_cidade_do_cliente()
Dessa forma, a classe que consome o dado não precisa conhecer a estrutura
de Cliente
nem de Endereco
— apenas confia na
interface pública de Pedido
.