Introdução: Por que o código limpo é a chave para o sucesso do projeto
Mais cedo ou mais tarde, todo desenvolvedor encontra código "sujo": nomes de variáveis sem sentido, funções com centenas de linhas, blocos repetidos e números mágicos. Esse código é difícil de ler, complicado de manter e praticamente impossível de estender sem o risco de quebrar toda a aplicação. O livro de Robert Martin "Clean Code" tornou-se a bíblia para programadores que buscam escrever código de qualidade. Neste artigo, vamos analisar os princípios-chave do Clean Code em Java com exemplos práticos que ajudarão você a tornar seu código compreensível, confiável e fácil de manter.
1. Nomenclatura: fale a linguagem do negócio
O nome de uma variável, método ou classe deve responder às perguntas: "O que é isso?" e "Para que serve?". Evite abreviações de uma letra e termos abstratos.
Exemplo ruim
int d; // tempo desde o pedido (em dias)List<String> lst = new ArrayList<>();void prc() { ... }Exemplo bom
int daysSinceOrder;List<String> customerNames = new ArrayList<>();void processPayment() { ... }Recomendações adicionais
- Classes — substantivos:
Order,CustomerRepository. - Métodos — verbos ou pares verbais:
saveOrder(),isValidEmail(). - Evite palavras "ruídos":
Data,Info,Manager— se não agregarem significado.
2. Funções: curtas, claras, uma tarefa
Uma função deve fazer apenas uma coisa e fazê-la bem. O comprimento ideal é de 10 a 15 linhas. Se a função não couber na tela — divida-a.
Exemplo ruim: função canivete suíço
public void processOrder(Order order) { // 1. Validação if (order == null || order.getItems().isEmpty()) { throw new IllegalArgumentException("Invalid order"); } // 2. Cálculo do desconto double discount = 0; if (order.getTotal() > 1000) discount = 0.1; // 3. Salvamento no BD database.save(order); // 4. Envio de email emailService.sendConfirmation(order.getCustomerEmail());}Exemplo bom: separação de responsabilidades
public void processOrder(Order order) { validateOrder(order); applyDiscount(order); persistOrder(order); notifyCustomer(order);}
private void validateOrder(Order order) { if (order == null || order.getItems().isEmpty()) { throw new IllegalArgumentException("Invalid order"); }}
private void applyDiscount(Order order) { if (order.getTotal() > 1000) { order.setDiscount(0.1); }}
private void persistOrder(Order order) { database.save(order);}
private void notifyCustomer(Order order) { emailService.sendConfirmation(order.getCustomerEmail());}3. Evite duplicação (DRY) e números mágicos
Código repetido é o principal inimigo da manutenibilidade. Se você está copiando um bloco de código, é hora de extraí-lo para um método ou constante separada.
Problema: números mágicos
if (age > 18) { ... } // O que é 18? Idade mínima? Limite de desconto?Solução: constantes com nomes
private static final int MINIMUM_DRIVING_AGE = 18;// ...if (age > MINIMUM_DRIVING_AGE) { ... }Exemplo de duplicação
// Ruimdouble totalForFirst = price1 * quantity1 * 0.95;double totalForSecond = price2 * quantity2 * 0.95;
// Bomdouble calculateLineTotal(double price, int quantity) { return price * quantity * 0.95;}double totalForFirst = calculateLineTotal(price1, quantity1);double totalForSecond = calculateLineTotal(price2, quantity2);