Extrair Subclasse.
Uma classe tem funcionalidades que são usadas apenas em certos casos.
Crie uma subclasse e use-a nesses casos.
##Exemplo
class JobItem {
int unitPrice;
int quantity;
Employee employee;
int getUnitPrice() {
return employee != null ? employee.getRate() : unitPrice;
}
}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
-
Crie uma nova subclasse a partir da classe de interesse.
-
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.
-
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.
-
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.
-
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
isElectricCare, dependendo dele, no métodorefuel()o carro era abastecido com combustível ou carregado com eletricidade. Após a refatoração, o campoisElectricCaré removido e as classesCareElectricCarterão suas próprias implementações do métodorefuel().