Java/Arquitetura/SOLID
Java⏱ ~2 min de leitura

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.

Exemplo.java
// ❌ 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!"); }
}
💡 Dica pro

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.

Recompensa+50 XP+exercícios