AULA 07 MÓDULO 0 qualidade de código ⏱ 55 min

SOLID: os 5 Princípios

Aprenda os 5 princípios que separam código sustentável de código que vira dívida técnica. Com exemplos em JavaScript/TypeScript.

SRPOCPLSPISPDIPdependency injection

O que é SOLID

SOLID é um acrônimo de 5 princípios de design orientado a objetos definidos por Robert C. Martin (Uncle Bob). Seguir esses princípios torna o código mais fácil de manter, testar e estender sem quebrar o que já funciona.

🏗️
por que importa
Código ruim não quebra no dia que você escreve — quebra 6 meses depois quando você precisa mudar algo urgente e tudo que toca, quebra.

S — Single Responsibility

Uma classe deve ter apenas um motivo para mudar. Se uma classe faz autenticação E envia email E salva no banco, ela muda por 3 razões diferentes — qualquer mudança pode quebrar as outras duas.

✗ VIOLAÇÃO
class UserService {
  validateUser() {...}
  sendWelcomeEmail() {...} // responsabilidade diferente!
  saveToDatabase() {...} // responsabilidade diferente!
}
✓ CORRETO
class UserValidator {...}
class UserEmailService {...}
class UserRepository {...}

O, L, I, D

O — Open/Closed
Aberto para extensão, fechado para modificação. Adicione comportamento via herança/composição, não editando a classe existente.
L — Liskov Substitution
Subclasses devem ser substituíveis por suas classes base sem quebrar o programa.
I — Interface Segregation
Clientes não devem depender de interfaces que não usam. Prefira interfaces menores e específicas.
D — Dependency Inversion
Dependa de abstrações, não de implementações concretas. Injete dependências.
javascript
// D — Dependency Inversion: injete a abstração

// ✗ Errado — depende da implementação concreta
class OrderService {
  constructor() {
    this.emailer = new GmailSender() // acoplado!
  }
}

// ✓ Correto — depende da abstração (interface)
class OrderService {
  constructor(emailSender) { // injeta qualquer sender
    this.emailer = emailSender
  }
  async processOrder(order) {
    // ... lógica do pedido
    await this.emailer.send({
      to: order.email,
      subject: "Pedido confirmado"
    })
  }
}

// Testável com mock:
const mockEmailer = { send: jest.fn() }
const service = new OrderService(mockEmailer)
quiz · aula 07
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
O princípio Single Responsibility diz que...
QUESTÃO 02
Dependency Inversion significa...
QUESTÃO 03
Open/Closed significa que uma classe deve ser...
0/3