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

Extrair Subclasse.

Problema

Uma classe tem funcionalidades que são usadas apenas em certos casos.

Solução

Crie uma subclasse e use-a nesses casos.

##Exemplo

Antes
class JobItem {
  int unitPrice;
  int quantity;
  Employee employee;

  int getUnitPrice() {
    return employee != null ? employee.getRate() : unitPrice;
  }
}
Depois
class JobItem {
  int unitPrice;
  int quantity;

  int getUnitPrice() { return unitPrice; }
}
class LaborItem extends JobItem {
  Employee employee;

  int getUnitPrice() { return employee.getRate(); }
}

##Por que refatorar

Sua classe principal tem métodos e campos para implementar um certo caso de uso raro da classe. Embora o caso seja raro, a classe é responsável por ele e seria errado mover todos os campos e métodos associados para uma classe inteiramente separada. Mas eles poderiam ser movidos para uma subclasse, que é exatamente o que faremos com a ajuda desta técnica de refatoração.

##Benefícios

  • Cria uma subclasse de forma rápida e fácil.

  • Você pode criar várias subclasses separadas se a sua classe principal estiver atualmente implementando mais de um desses casos especiais.

##Como refatorar

  1. Crie uma nova subclasse a partir da classe de interesse.

  2. Se você precisar de dados adicionais para criar objetos da subclasse, crie um construtor e adicione a ele os parâmetros necessários. Não se esqueça de chamar a implementação do construtor da classe pai.

  3. Encontre todas as chamadas ao construtor da classe pai. Quando a funcionalidade de uma subclasse for necessária, substitua o construtor da classe pai pelo construtor da subclasse.

  4. Mova os métodos e campos necessários da classe pai para a subclasse. Faça isso por meio de Descer Método e Descer Campo. É mais simples começar movendo primeiro os métodos. Dessa forma, os campos permanecem acessíveis durante todo o processo: a partir da classe pai antes da movimentação e a partir da própria subclasse após a conclusão da movimentação.

  5. Depois que a subclasse estiver pronta, encontre todos os campos antigos que controlavam a escolha da funcionalidade. Exclua esses campos usando polimorfismo para substituir todos os operadores nos quais os campos eram usados. Um exemplo simples: na classe Car, você tinha o campo isElectricCar e, dependendo dele, no método refuel() o carro era abastecido com combustível ou carregado com eletricidade. Após a refatoração, o campo isElectricCar é removido e as classes Car e ElectricCar terão suas próprias implementações do método refuel().