Curso: Superior de Tecnologia em Sistemas para Internet
Prof. Daniel Aguiar | daniel.aguiar@ifrn.edu.br
github.com/daguiardev
O caos do código acoplado.
História e conceitos.
Análise prática do SOLID.
Retorno e revisão.
"Mudamos o formato do e-mail de notificação e as consultas ao banco de dados pararam de funcionar."
À medida que o sistema cresce, pequenas alterações geram um efeito cascata imprevisível. O software perde flexibilidade e a equipe ganha medo de refatorar.
” Uma classe deve ter um, e apenas um, motivo para mudar.”
// Responsabilidades devidamente isoladas
class Pedido {
private items: string[] = [];
calcularTotal() { return this.items.length * 10; }
}
class PedidoRepository {
salvar(pedido: Pedido) { /* conexão banco */ }
}
class NotificationService {
enviarEmail(msg: string) { /* disparo e-mail */ }
}
“Entidades devem estar abertas para extensão, mas fechadas para modificação.”
interface Frete { calcular(peso: number): number; }
class FretePAC implements Frete { calcular(p: number) { return p * 5; } }
class FreteSedex implements Frete { calcular(p: number) { return p * 15; } }
class CalculadoraFrete {
calcular(frete: Frete, peso: number) { return frete.calcular(peso); }
}
“Classes derivadas devem poder ser substituídas por suas classes base.”
class Ave { comer() { return "comendo"; } }
class AveQueVoa extends Ave { voar() { return "voando"; } }
class Pinguim extends Ave {
// Pinguim não herda voar() incorretamente. Evita bugs inesperados.
nadar() { return "nadando"; }
}
“Uma classe não deve ser forçada a depender de interfaces que não utiliza.”
interface Trabalhavel { trabalhar(): void; }
interface Comivel { comer(): void; }
class Humano implements Trabalhavel, Comivel {
trabalhar() {}
comer() {}
}
class Robo implements Trabalhavel {
trabalhar() {} // Não é forçado a implementar "comer()"
}
“Dependa de abstrações, não de implementações.”
interface Database { connect(): void; }
class MySQLConnection implements Database { connect() { /* ... */ } }
class SistemaPrincipal {
// O sistema depende do contrato (Interface), não do driver rígido do banco
constructor(private db: Database) {}
}
“Escrever código limpo é um ato de respeito pelo próximo desenvolvedor.”
✉️ daniel.aguiar@ifrn.edu.br
💻 github.com/daguiardev