SOLID
Os 5 princípios do design orientado a objetos
SOLID é um acrônimo de cinco princípios de design orientado a objetos que tornam o código mais legível, flexível, testável e fácil de manter. Foram popularizados por Robert C. Martin (Uncle Bob) e são a base do clean code em Java.
S — Single Responsibility: uma classe deve ter apenas um motivo para mudar. O — Open/Closed: aberto para extensão, fechado para modificação (adicione comportamento sem alterar o código existente). L — Liskov Substitution: subclasses devem poder substituir a superclasse sem quebrar o sistema. I — Interface Segregation: interfaces específicas são melhores que uma interface genérica grande. D — Dependency Inversion: módulos de alto nível não devem depender de módulos de baixo nível — ambos devem depender de abstrações.
Violações de SOLID resultam em código que é difícil de testar, difícil de mudar (qualquer alteração quebra outras partes) e difícil de entender. Seguir esses princípios é a base para arquiteturas escaláveis como Clean Architecture.
// ❌ Violação de SRP: uma classe faz tudo
class RelatorioGodClass {
void calcularDados() { /* lógica de cálculo */ }
void formatarHTML() { /* lógica de formatação */ }
void salvarNoBanco() { /* lógica de persistência */ }
void enviarEmail() { /* lógica de envio */ }
}
// ✅ SRP: cada classe tem UMA responsabilidade
class CalculadoraRelatorio { Dados calcular(Periodo p) { return null; } }
class FormatterHTML { String formatar(Dados d) { return null; } }
class RepositorioRelatorio { void salvar(Relatorio r) { } }
// ✅ Dependency Inversion: depende de ABSTRAÇÃO
interface Notificador { void notificar(String mensagem); }
class EmailNotificador implements Notificador {
public void notificar(String m) { /* envia email */ }
}
class SMSNotificador implements Notificador {
public void notificar(String m) { /* envia SMS */ }
}
// ServicoPedido não depende de Email ou SMS — depende da interface
class ServicoPedido {
private final Notificador notificador;
ServicoPedido(Notificador n) { this.notificador = n; } // injeção
void confirmar() { notificador.notificar("Pedido confirmado!"); }
}Comece com S (Single Responsibility) — dividir responsabilidades já melhora drasticamente a qualidade. O D (Dependency Inversion) é a base para injeção de dependência no Spring.