ConstructiCat Logo
CodeBust.
Browse section ▾

Extrair Subclasse.

Problem

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

Solution

Crie uma subclasse e use-a nesses casos.

##Example

Antes
Job Item +getTotalPrice()+getUnitPrice()+getEmployee()
Depois
Job Item +getTotalPrice()+getUnitPrice()+getEmployee() Labor Item +getUnitPrice()+getEmployee()

##Why Refactor

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.

##Benefits

  • 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.

##How to Refactor

  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().