Refatoração, explicada de forma simples
Refatorar é arrumar um código que já existe sem construir nada novo. Você pega a versão bagunçada e transforma em algo legível e simples de manter.
Muita gente acha que refatorar é limpar tudo de uma vez. Não é. E definitivamente não é refazer as coisas por refazer.
Refatoração é um conjunto de mudanças pequenas que mantêm o comportamento idêntico e deixam o código muito melhor organizado.
O que é de fato
Mudar a estrutura interna do código sem mudar o que ele faz pro usuário.
O objetivo é:
- Melhorar qualidade e legibilidade
- Reduzir complexidade
- Deixar a arquitetura mais simples e clara
- Às vezes ganhar performance no caminho
Você chega lá através de muitas micro-refatorações: mudanças pequenas e pontuais que preservam o comportamento uma a uma.
Por que se dar ao trabalho
Normalmente você decide refatorar quando esbarra em code smells:
- Métodos muito longos
- Código duplicado
- Comentários que só existem porque o código não está claro
- Variáveis mal nomeadas
Resolver isso deixa o código mais fácil de entender, mais fácil de manter e estender, e de vez em quando mais rápido.
Mas o maior motivo não é nenhum desses. O maior motivo é econômico.
Quando você bate esses objetivos, construir software fica mais barato. O motivo real é produtividade, e produtividade vira resultado pra empresa ou pro produto.
Essa, aliás, é a versão que todo gestor quer ouvir. Se você tá pedindo tempo pra refatorar e vendendo isso como capricho de artesão, tá tornando o argumento mais difícil do que precisa ser.
O que atrapalha
Refatorar não é só cutucar código. Existem obstáculos reais.
Entender o sistema. Você precisa saber como o código está estruturado e como as peças se conectam. Não dá pra mudar com segurança aquilo que você não consegue acompanhar.
Preservar a arquitetura. Não adianta deixar bonito e quebrar a lógica por baixo.
Ter as ferramentas certas. Você precisa conseguir enxergar dependências, caminhos de execução e o impacto de uma mudança.
Testes vêm primeiro
Antes de começar, tenha testes automatizados, principalmente testes unitários. São eles que impedem você de quebrar alguma coisa no caminho.
O ciclo é simples:
- Faz uma mudança pequena
- Roda os testes
- Confere se tudo continua funcionando
- Repete até o código ficar do jeito que você quer
Quanto mais rápidos os testes, melhor isso funciona. É exatamente por isso que métodos ágeis como Extreme Programming empurram testes e refatoração contínua juntos. Não são duas práticas. Uma torna a outra possível.
Técnicas comuns
Existe um catálogo bem documentado dessas técnicas. O Refactoring Guru tem bons exemplos de cada uma, e o livro do Martin Fowler é a referência original.
Algumas das mais usadas:
- Extrair condicional: transformar uma condição grande numa constante nomeada
- Generalizar tipo: criar tipos mais abrangentes pra permitir reuso
- Extrair classe: mover parte da lógica pra uma classe própria
- Extrair método: quebrar um método longo em pedaços
- Mover método: colocar o método na classe onde ele realmente pertence
- Renomear método: fazer o nome dizer o que ele faz
- Remover código morto: apagar o que não é mais usado
O último é o mais fácil e o mais evitado. Apaga. Tá no controle de versão.
Um pouco de história
O termo apareceu pela primeira vez em 1990, num artigo de William Opdyke e Ralph Johnson. Mas foi o livro do Martin Fowler, publicado em 1999 e atualizado em 2018, que tornou a prática popular.
Resumindo
Refatoração mantém o que funciona e melhora o que está por baixo.
Não é maratona de faxina. São muitas mudanças pequenas e constantes. Quando isso vira parte do dia em vez de um projeto pelo qual você precisa pedir permissão, o código fica limpo e continua fácil de evoluir.
Obrigado por ler até aqui.