Logotipo do ConstructiCat
CodeBust.
Explorar a seção ▾

Ocultar Delegação.

Problema

O cliente obtém o objeto B a partir de um campo ou método do objeto A. Em seguida, o cliente chama um método do objeto B.

Solução

Crie um novo método na classe A que delega a chamada ao objeto B. Agora o cliente não conhece a classe B nem depende dela.

##Exemplo

Antes
manager = person.getDepartment().getManager();
Depois
manager = person.getManager();

class Person {
  Department getDepartment() { return department; }
  Person getManager() { return department.getManager(); }
}

##Por que refatorar

Para começar, vejamos a terminologia:

  • O Servidor é o objeto ao qual o cliente tem acesso direto.

  • O Delegado é o objeto final que contém a funcionalidade necessária ao cliente.

Uma cadeia de chamadas surge quando um cliente solicita um objeto a outro objeto, então esse segundo objeto solicita outro, e assim por diante. Essas sequências de chamadas envolvem o cliente na navegação pela estrutura de classes. Quaisquer alterações nessas inter-relações exigirão alterações do lado do cliente.

##Benefícios

  • Oculta a delegação do cliente. Quanto menos o código cliente precisar saber sobre os detalhes das relações entre objetos, mais fácil será fazer alterações no seu programa.

##Como refatorar

  1. Para cada método da classe-delegada chamado pelo cliente, crie um método na classe-servidora que delega a chamada à classe-delegada.

  2. Altere o código cliente para que ele chame os métodos da classe-servidora.

  3. Se suas alterações liberarem o cliente da necessidade da classe-delegada, você poderá remover da classe-servidora o método de acesso à classe-delegada (o método que originalmente era usado para obter a classe-delegada).