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!
}
validateUser() {...}
sendWelcomeEmail() {...} // responsabilidade diferente!
saveToDatabase() {...} // responsabilidade diferente!
}
✓ CORRETO
class UserValidator {...}
class UserEmailService {...}
class UserRepository {...}
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