ConstructiCat Logo
CodeBust.
Browse section ▾

Formar Método Template.

Problem

Suas subclasses implementam algoritmos que contêm etapas semelhantes na mesma ordem.

Solution

Mova a estrutura do algoritmo e as etapas idênticas para uma superclasse, e deixe a implementação das etapas diferentes nas subclasses.

##Example

Antes
Site ResidentialSite +getBillableAmount() LifelineSite +getBillableAmount() $base = $this->units * $this->rate;$tax = $base * Site::TAX_RATE;return $base + $tax; $base = $this->units * $this->rate * 0.5;$tax = $base * Site::TAX_RATE * 0.2;return $base + $tax;
Depois
Site getBillableAmount()getBaseAmount()getTaxAmount() ResidentialSite getBaseAmount()getTaxAmount() LifelineSite getBaseAmount()getTaxAmount() return $this->getBaseAmount() + $this->getTaxAmount();

##Why Refactor

As subclasses são desenvolvidas em paralelo, às vezes por pessoas diferentes, o que leva à duplicação de código, a erros e a dificuldades na manutenção do código, já que cada alteração precisa ser feita em todas as subclasses.

##Benefits

  • A duplicação de código nem sempre se refere a casos de simples copiar/colar. Muitas vezes a duplicação ocorre em um nível mais alto, como quando você tem um método para ordenar números e um método para ordenar coleções de objetos que se diferenciam apenas pela comparação dos elementos. Criar um método template elimina essa duplicação ao mesclar as etapas compartilhadas do algoritmo em uma superclasse e deixar apenas as diferenças nas subclasses.

  • Formar um método template é um exemplo do Princípio Aberto/Fechado em ação. Quando surge uma nova versão do algoritmo, você só precisa criar uma nova subclasse; nenhuma alteração no código existente é necessária.

##How to Refactor

  1. Divida os algoritmos das subclasses em suas partes constituintes, descritas em métodos separados. Extrair Método pode ajudar com isso.

  2. Os métodos resultantes que forem idênticos para todas as subclasses podem ser movidos para uma superclasse via Subir Método.

  3. Os métodos não semelhantes podem receber nomes consistentes via Renomear Método.

  4. Mova as assinaturas dos métodos não semelhantes para uma superclasse como abstratas usando Subir Método. Deixe suas implementações nas subclasses.

  5. E, por fim, suba o método principal do algoritmo para a superclasse. Agora ele deve funcionar com as etapas do método descritas na superclasse, tanto as reais quanto as abstratas.