Extrair Subclasse.
Uma classe tem funcionalidades que são usadas apenas em certos casos.
Crie uma subclasse e use-a nesses casos.
##Example
##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
-
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().