A refatoração é uma alteração feita na estrutura interna do programa para torná-lo melhor entendido e menos custoso de ser modificado sem alterar seu comportamento funcional (FOWLER, 2004).
A refatoração surgiu a partir do reconhecimento de Ward Cunningham e Kent Beck, que trabalharam com SmallTalk, em 1980, e posteriormente foi sendo adotado para outras linguagens. Era muito utilizado pelos desenvolvedores de frameworks (FOWLER, 2004).
Por que devemos refatorar?
Para Martin Fowler (FOWLER, 2004), a refatoração não é a cura para todos os problemas, mas pode ser considerada uma ferramenta valiosa (um alicate de prata) que lhe ajuda a manter seu código seguro. Mas, ele destaca outros propósitos que devem ser observados:
- Melhora o projeto de software;
- Torna o software mais fácil de entender;
- Ajuda a encontra falhas;
- Ajuda a programa mais rapidamente.
Quando devemos refatorar?
A refatoração é algo que devemos realizar todo o tempo em pequenas doses. E devemos aproveitar as oportunidades para aplicar a refatoração, sempre quando acrescentamos funções, consertamos uma falha ou enquanto revisamos o código (FOWLER, 2004).
Quem teve a experiência de pegar um código da faculdade e dar uma olhada, sabe que surge aquele pensamento “Quem fez isso?” e logo vem a resposta “fui eu”. Nesse caso, é uma ótima oportunidade para aplicar a refatoração.
Se tem problemas de entendimento do seu código, mesmo com os comentários, a sua lógica está duplicada, tem necessidade constante de incluir novas funcionalidades, as lógicas condicionais são complexas, então, está na hora de refatorar. Não existe tempo ideal ou alocação de atividade pelo gerente de projetos para realizar a refatoração.
Não faltam motivos para realizar a refatoração, você verá que refatora seu código sem saber. Entretanto, Martin Fowler, define alguns situações que causam “maus cheiros” durante e depois do desenvolvimento. Na Tabela 01, veremos essa situações.
Tabela 01 – Relação do problema e a refatoração sugerida (FOWLER, 2004).
Situações | Métodos de Refatoração |
---|---|
Alteração divergente | Extrair Classe |
Biblioteca de classes incompleta | Introduzir Método Externo, Introduzir Extensão Local. |
Cadeias de mensagens | Ocultar Delegação |
Campo temporário | Extrair Classe, Introduzir Objeto Nulo |
Cirurgia com rifle | Mover Método, Mover Campo, Internalizar Classe |
Classe Ociosa | Internalizar Classe, Condensar Hierarquia |
Classes alternativas com interfaces diferentes | Renomear Método, Mover Método. |
Classes de dados | Mover Método, Encapsular Campo, Encapsular Coleção. |
Classes grandes | Extrair Classe, Extrair Subclasse, Extrair Interface, Substituir Atributo por Objeto |
Código duplicado | Extrair Método, Extrair Classe, Subir Método na Hierarquia, Criar um Método Padrão. |
Comandos switch | Substituir Comando Condicional por Polimorfismo, Substituir Enumeração por Subclasses, Substituir Enumeração pelo Padrão State/Strategy, Substituir Parâmetros por Métodos Explícitos, Introduzir Objeto Nulo. |
Comentários | Extrair Método, Introduzir Asserção. |
Generalidade especulativa | Condensar Hierarquia, Internalizar Classe, Remover Parâmetro, Renomear Método. |
Grupos de dados | Extrair Classe, Introduzir Objeto Parâmetro, Preservar o Objeto Inteiro. |
Herança recusada | Substituir Herança por Delegação |
Hierarquias paralelas de herança | Mover Método, Mover Campo. |
Intermediário | Remover Intermediário, Internalizar Método, Substituir Delegação por Herança. |
Intimidade inadequada | Mover Método, Mover Campo, Transformar Associação Bidirecional em Unidirecional, Substituir Herança por Delegação, Ocultar Delegação. |
Inveja dos dados | Mover Método, Mover Campo, Extrair Método. |
Lista de parâmetros longa | Substituir Parâmetro por Método, Introduzir Objeto Parâmetro, Preservar o Objeto Inteiro. |
Método longo | Extrair Método, Substituir Variável Temporária por Consulta, Substituir Método por Objeto Método, Decompor Condicional. |
Obsessão primitiva | Substituir Atributo por Objeto, Extrair Classe, Introduzir Objeto Parâmetro, Substituir Vetor por Objeto, Substituir Enumeração por Subclasses, Substituir Enumeração pelo padrão State/Strategy. |
Como pudemos ver na Tabela 01, existem diversos métodos de refatoração. Neste post, fizemos uma breve apresentação do que é refatoração, seus possíveis métodos e quando devemos utilizar.
No próximo post, Conheça os métodos mais utilizados para refatorar seu código, abordaremos com exemplos práticos os métodos mais utilizados.
Referências
FOWLER, Martin. Refatoração: aperfeiçoando o projeto do código existente. Porto Alegre: Bookman, 2004.