Aula 14 – Padrões de Projeto com TypeScript 🛡️
Objetivo
Nesta aula, aprenderemos a elevar a qualidade do nosso software aplicando Padrões de Projeto (Design Patterns). Veremos como o TypeScript facilita a implementação de arquiteturas robustas usando Repositories, Services e Injeção de Dependência.
1. Padrão Repository e Service Layer 🏗️
A separação de responsabilidades é essencial. O Repository cuida do acesso aos dados, enquanto o Service cuida da lógica de negócio.
Estrutura
- Repository:
buscarTodos(),salvar(). - Service:
criarNovoUsuario(),validarRegrasDeNegocio().
interface IUsuarioRepository {
salvar(usuario: Usuario): Promise<void>;
}
class UsuarioService {
constructor(private repo: IUsuarioRepository) {}
async registrar(nome: string) {
// Lógica de negócio aqui
await this.repo.salvar({ nome });
}
}
2. Injeção de Dependência (DI) 💉
Em vez de criar as dependências dentro da classe, nós as "injetamos" (geralmente pelo construtor). Isso torna o código mais fácil de testar (usando mocks).
// No mundo real, usamos frameworks como Inversify ou Nestjs
const meuRepo = new SqlUsuarioRepository();
const meuServico = new UsuarioService(meuRepo);
3. Padrão Factory 🏭
Usado quando a criação de um objeto é complexa ou depende de condições.
class PagamentoFactory {
static criar(tipo: "cartao" | "boleto") {
if (tipo === "cartao") return new PagamentoCartao();
return new PagamentoBoleto();
}
}
4. Padrão Strategy ♟️
Permite definir uma família de algoritmos, colocá-los em classes separadas e tornar seus objetos intercambiáveis.
interface EstrategiaDesconto {
calcular(valor: number): number;
}
class DescontoBlackFriday implements EstrategiaDesconto {
calcular(valor: number) { return valor * 0.5; }
}
5. Visualizando o Padrão Repository (Mermaid)
graph LR;
Controller[Controller / API] --> Service[Service - Lógica];
Service --> RepoInterface[Interface do Repositório];
RepoInterface --> SqlRepo[SQL Repository];
RepoInterface --> MongoRepo[Mongo Repository];
style RepoInterface fill:#f9f,stroke:#333
6. Exercícios Práticos 📝
- Básico: Crie uma classe
LogServicee use injeção de dependência para passá-la para outra classe. - Básico: Implemente um
Factoryque crie diferentes tipos deNotificacao(Email, SMS). - Intermediário: Implemente o padrão
Strategypara diferentes formas de calcular o frete (Normal, Expresso). - Intermediário: Crie uma interface
IUserRepositorye implemente uma versãoInMemoryUserRepository. - Desafio: Refatore o Mini-Projeto da Aula 10 aplicando os padrões Repository e Service Layer.
🚀 Mini-Projeto da Aula
Implemente um Sistema de Processamento de Pagamentos. - Use o padrão Factory para criar o método de pagamento. - Use o padrão Strategy para aplicar diferentes taxas dependendo do método. - Use Injeção de Dependência para passar o serviço de log para o processador de pagamentos. - Tudo deve ser 100% tipado com interfaces.
Próxima Aula: Vamos aprender a escrever código limpo e entender a arquitetura em Clean Code e Arquitetura!