Extrair Classe.
Quando uma classe faz o trabalho de duas, surge um desconforto.
Em vez disso, crie uma nova classe e coloque nela os campos e métodos responsáveis pela funcionalidade relevante.
##Example
##Why Refactor
As classes sempre começam claras e fáceis de entender. Elas fazem o seu trabalho e cuidam da própria vida, por assim dizer, sem se intrometer no trabalho de outras classes. Mas, à medida que o programa cresce, um método é adicionado e depois um campo... e, no fim, algumas classes acabam desempenhando mais responsabilidades do que jamais se imaginou.
##Benefits
-
Este método de refatoração ajudará a manter a aderência ao Princípio da Responsabilidade Única. O código das suas classes ficará mais óbvio e compreensível.
-
Classes com responsabilidade única são mais confiáveis e tolerantes a mudanças. Por exemplo, digamos que você tenha uma classe responsável por dez coisas diferentes. Quando você altera essa classe para torná-la melhor em uma coisa, corre o risco de quebrá-la nas outras nove.
##How to Refactor
Antes de começar, decida exatamente como você quer dividir as responsabilidades da classe.
-
Crie uma nova classe para conter a funcionalidade relevante.
-
Crie uma relação entre a classe antiga e a nova. Idealmente, essa relação é unidirecional; isso permite reutilizar a segunda classe sem problemas. No entanto, se você achar que uma relação bidirecional é necessária, ela sempre pode ser estabelecida.
-
Use Mover Campo e Mover Método para cada campo e método que você decidiu mover para a nova classe. Para os métodos, comece pelos privados, a fim de reduzir o risco de cometer um grande número de erros. Tente realocar apenas um pouco de cada vez e teste os resultados após cada movimentação, para evitar um acúmulo de correções de erros bem no final.
Depois de terminar a movimentação, dê mais uma olhada nas classes resultantes. Uma classe antiga com responsabilidades alteradas pode ser renomeada para aumentar a clareza. Verifique novamente se você consegue se livrar de relações bidirecionais entre classes, caso alguma esteja presente.
-
Pense também na acessibilidade à nova classe a partir do exterior. Você pode ocultar a classe completamente do cliente, tornando-a privada e gerenciando-a por meio dos campos da classe antiga. Como alternativa, você pode torná-la pública, permitindo que o cliente altere os valores diretamente. Sua decisão aqui depende de quão seguro é para o comportamento da classe antiga quando mudanças diretas inesperadas são feitas nos valores da nova classe.