Emergência: Como um bom design surge naturalmente
Introdução
Imagine que você está construindo um LEGO gigante. Se você apenas sair encaixando peças sem critério, logo vai acabar com algo frágil e confuso. Mas se seguir algumas regras básicas, sem perceber, você criará uma estrutura bem planejada e funcional. Isso é a "Emergência" no código: um bom design que surge naturalmente a partir de boas práticas.
Robert C. Martin (Uncle Bob) fala disso no capítulo 12 do Clean Code, destacando quatro princípios que levam a um código simples e bem estruturado.
Os 4 pilares de um design emergente
1. Passe em todos os testes ✅
Código bom é código confiável. Se você escreve testes automatizados e garante que tudo está funcionando, já está no caminho certo. Como o Filipe Deschamps disse nesse video onde utilizar testes, faz com que você programe mais rapido.
Exemplo: Se você altera uma função e ela quebra outra parte do sistema, sem testes você nem percebe. Com testes, o erro é detectado na hora. Além de conseguir testar tudo que você esta fazendo sem depender de uma interface.
Código sem testes:
public int somar(int a, int b) {
return a + b;
}
Código com testes:
@Test
public void testSomar() {
assertEquals(5, somar(2, 3));
}
2. Elimine duplicidades 🚀
A repetição é o maior inimigo do código limpo. Sempre que vê algo duplicado, é um sinal de que pode haver uma abstração melhor.
Código com duplicação:
public double calcularDescontoClienteOuro(double valor) {
return valor * 0.9;
}
public double calcularDescontoClientePrata(double valor) {
return valor * 0.95;
}
Código refatorado:
public double calcularDesconto(double valor, double taxa) {
return valor * taxa;
}
3. Expresse claramente sua intenção 💡
Seu código deve ser legível como um livro. Nomes significativos, estrutura clara e pouca necessidade de comentários excessivos.
Exemplo ruim:
int c = 10; // Quantidade de clientes ativos
Exemplo bom:
int clientesAtivos = 10;
Outro exemplo ruim:
public void p() {
for (int i = 0; i < lista.size(); i++) {
System.out.println(lista.get(i));
}
}
Refatorado para melhor clareza:
public void imprimirListaClientes(List<String> clientes) {
for (String cliente : clientes) {
System.out.println(cliente);
}
}
4. Mantenha o código pequeno e simples 📦
Classes e métodos devem ser curtos. Menos é mais. Se seu método precisa de um manual para ser entendido, ele está grande demais.
Código grande e confuso:
public void processarPedido(Pedido pedido) {
if (pedido.isPago()) {
if (pedido.getCliente().isVip()) {
aplicarDescontoVip(pedido);
}
gerarNotaFiscal(pedido);
enviarEmailConfirmacao(pedido);
}
}
Código refatorado:
public void processarPedido(Pedido pedido) {
if (!pedido.isPago()) return;
aplicarDescontosSeNecessario(pedido);
gerarNotaFiscal(pedido);
enviarEmailConfirmacao(pedido);
}
private void aplicarDescontosSeNecessario(Pedido pedido) {
if (pedido.getCliente().isVip()) {
aplicarDescontoVip(pedido);
}
}
Por que "Emergência"?
O nome do capítulo não é à toa. Assim como um jardim bem cuidado floresce sem precisar ser desenhado folha por folha, um design bem feito emerge naturalmente quando aplicamos essas boas práticas.
Conclusão
Seguir esses princípios não garante que seu software será perfeito, mas evita que ele vire um Frankenstein de código. Quanto mais você pratica, mais intuitivo fica escrever código limpo.
Se quiser um resumo visual com exemplos e boa explicação, confere esse vídeo do Felipe Gavilan Programa: LINK