Na semana passada tivemos uma discussão bem interessante na Globo.com sobre Lei de Demeter e ruby. Basicamente a questão era: faz sentido se aplicar a Lei de Demeter quando se está usando uma linguagem dinâmica como ruby?
(Para entender o que é a Lei de Demeter, vale a leitura do artigo na Wikipedia).
Ao seguir a lei de Demeter o código escrito tende a ter um acoplamento mais baixo e, portanto, é mais fácil de manter e evoluir. Por outro lado, quando a lei é violada, o acoplamento aumenta. Isso independe se a linguagem utilizada é dinâmica ou não. Ao enviar uma mensagem para um colaborador do colaborador você está aumentando o acomplamento.
Na minha opinião, a questão correta para se discutir é somente: faz sentido aplicar a Lei de Demeter? E, nesse caso, a resposta é a já manjada “depende”.
Assim, sem nenhum contexto, aplicar Demeter faz sentido. Acoplamento baixo é algo desejável. Mas, dependendo do caso, o custo de aplicar a lei pode não compensar. Por exemplo, se o modelo de domínio é muito simples, com pouquíssimas regras de negócio, podemos ser mais pragmáticos, não aplicando a lei, sem que isso tenha maiores consequências.
Como quase tudo que fazemos no nosso dia a dia, trata-se de uma questão de entender o conceito e pesar seus prós e contras dentro de um contexto para então decidir o que fazer.
Guilherme,
Realmente não consigo ver UMA ÚNICA razão ou relacão entre violar Demeter e linguagem dinâmica. Ainda trabalhamos com objetos e mensagens em Ruby, e pelas mesmas razões que você apresentou podemos violar em Java, C# e etc…
Vou te falar que antigamente eu era mais flexível com isso, porém, vejo atualmente que um monte de pequenos deslizes em design incremental podem deixar seu sistema altamente acoplado. Veja a minha apresentação no Dev In Sampa que falo sobre isso.
http://agaelebe.blip.tv/file/2916385/
Eu concordo totalmente contigo no que diz respeiro a não sermos xiitas com as coisas, mas eu ainda acredito que não aplicar Demeter pode significar o mesmo que deixar uma variável pública e depois esconde-la somente se for necessário mais tarde. É um pouco exagerada a minha comparação, mas eu acho que information e implementation hidding são aspectos um pouco críticos. Em fim, isso é apenas a minha opinião.
Grande abraço!!!
Também não consegui observar como uma linguagem dinâmica como Ruby poderia se beneficiar em não aplicar a Lei de Demeter.
E, no caso geral, reforçando o que o Rodrigo e o Emerson já observaram, uma pequena “janela quebrada” (como uma violação desnecessária da Lei de Demeter) hoje pode acabar por complicar o sistema inteiro amanhã.
Abracos!