quarta-feira, 8 de abril de 2009

Lei de Demeter para Funções

A Lei de Demeter para Funções basicamente determina que qualquer método de um objeto só deve chamar métodos que pertença:

1. Ao próprio objeto;
2. A qualquer um dos parâmetros recebidos;
3. A qualquer objeto instanciado dentro do método; ou,
4. A qualquer objeto componente direto do método.

Isso garante o mínimo de acoplagem possível. Um método acessa apenas métodos de objetos diretamente ligados a ele, e só.

Considere a classe:

class Usuario {
...

private Msg mensagem;

private String getNome() {...}

public void parabens(Emitente em) {

/*
* Pela 1ª regra, o método parabens pode acessar
* outro método que pertença ao próprio objeto.
*/
String nome = getNome();

/*
* Pela 2ª regra, o método parabens pode acessar
* métodos de objetos recebidos por parâmetro.
*/
Assinatura ass = em.getAssinatura();

/*
* Pela 3ª regra, o método parabens pode acessar
* métodos de objetos que ele próprio criou.
*/
mensagem = new MsgAniversario();
mensagem.setPara(nome);
mensagem.assine(ass);

/*
* Pela 4ª regra, o método parabens pode acessar
* métodos de objetos que pertença diretamente a
* ele.
*/
Email email = new Email();
email.setConteudo(mensagem);
email.envie();

}
}

Dessa forma, qualquer acesso a métodos dentro de parabéns que não se encaixasse a estas quatro regras deveriam ser revistos, o que levará a escrita de uma boa quantidade de métodos e classes Wrappers pra simplesmente passar requisições a diante.

No caso acima, se o método parabéns não fosse o responsável por criar a mensagem do usuário, então, ele não poderia acessar o objeto mensagem diretamente, ao invés, ele deveria delegar a alguém a obtenção da instância de mensagem. Por exemplo:

getMensagem().setPara(nome);
getMensagem().assine(ass);

Dessa forma, escrevendo dentro do objeto um método getMensagem() estaríamos nos encaixando na 1ª regra.

Law Of Demeter
http://en.wikipedia.org/wiki/Law_of_Demeter

The Pragmatic Programmer
Adrew Hunt, David Thomas
http://www.pragprog.com/the-pragmatic-programmer

Nenhum comentário: