Refatoração de código Java: a arte de transformar "bagunça" em doce
Você já abriu seu antigo projeto Java e sentiu que ia chorar? Classes do tamanho de "Guerra e Paz", métodos com cinco níveis de aninhamento e variáveis com nomes como a1, temp2 e resultFinalReallyFinal. Familiar? Bem-vindo ao mundo do "código com cheiro" (code smell).
Mas não se apresse em deletar tudo e reescrever do zero. Existe um caminho mais elegante — a refatoração de código Java. Não se trata de "reescrever do zero", mas sim de tornar o código mais limpo, compreensível e seguro para mudanças, sem quebrar seu comportamento. Neste artigo, vamos explorar quando vale a pena fazer a refatoração, quando é melhor deixar tudo como está, e mostrar com exemplos concretos como fazer isso corretamente.
Quando a refatoração de código Java é necessária? Sinais de "código ruim"
Refatoração não é um hobby ou uma diversão para sexta à noite. É um investimento no futuro do projeto. Mas como saber que é hora de agir? Aqui estão alguns sinais claros:
- Método-monstro (Long Method). Se o método tem mais de 20–30 linhas e você não consegue entender o que ele faz sem rolar a tela para cima e para baixo — isso é um sinal de alerta.
- Classe-deus (God Object). Uma classe que sabe tudo e faz tudo: trabalha com o banco de dados, desenha a UI e escreve logs. Essa classe viola o princípio da responsabilidade única (SRP).
- Duplicação de código (Duplicated Code). Você copiou o mesmo bloco de código em três lugares diferentes? Quando precisar alterar a lógica, você com certeza esquecerá de corrigir pelo menos um deles.
- Estruturas condicionais complexas (Maníaco por Switch/if-else). Ramificações com 10+ condições, que crescem a cada novo requisito — um forte candidato a ser substituído por polimorfismo.
- Cheiro de "Classe Preguiçosa" (Lazy Class). Uma classe que faz muito pouco para justificar sua existência. Geralmente surge após uma refatoração mal-sucedida ou "para o futuro".
Se você reconheceu seu código em pelo menos um dos pontos — ótimo! Significa que há espaço para crescer. Se reconheceu em todos — não entre em pânico, vamos consertar tudo.
Quando NÃO fazer refatoração de código Java
Sim, existem situações em que é melhor manter as mãos longe da IDE:
- O código funciona e não está sendo mexido. Se o projeto precisa ser entregue amanhã e hoje você decidiu "embelezar" — pare. Refatoração sem testes é roleta-russa.
- Não há testes automatizados. Você não conseguirá provar que, após as alterações, o código se comporta da mesma forma. Sem testes, a refatoração se torna "refatoração às cegas".
- Uma reestruturação completa está planejada. Se em um mês você vai migrar para microsserviços, não precisa polir o monolito. Foque no que é importante agora.
Exemplos práticos de refatoração de código Java
1. Eliminando Long Method: extraindo método
Imagine que você tem um método que calcula o desconto e, ao mesmo tempo, verifica se o cliente é VIP:
public double calculatePrice(double basePrice, String clientType) { double discount = 0.0; if (clientType.equals("VIP")) { discount = 0.2; // logando cliente VIP System.out.println("VIP client detected!"); } else if (clientType.equals("REGULAR")) { discount = 0.1; } else { discount = 0.05; } // mais 20 linhas de código com verificações... return basePrice * (1 - discount);}Este é o clássico "método-canivete suíço". Extraímos a lógica de cálculo do desconto para um método privado separado:
public double calculatePrice(double basePrice, String clientType) { double discount = getDiscountForClientType(clientType); logClientIfVip(clientType); return basePrice * (1 - discount);}
private