187 lines
5.4 KiB
Markdown
187 lines
5.4 KiB
Markdown
## Design Patterns
|
|
|
|
Propõe padrões de design aplicáveis à base de código e avalia a conformidade com os princípios SOLID.
|
|
|
|
### Uso
|
|
|
|
```bash
|
|
/design-patterns [alvo-de-análise] [opções]
|
|
```
|
|
|
|
### Opções
|
|
|
|
- `--suggest` : Propor padrões aplicáveis (padrão)
|
|
- `--analyze` : Analisar uso de padrões existentes
|
|
- `--refactor` : Gerar propostas de refatoração
|
|
- `--solid` : Verificar conformidade com princípios SOLID
|
|
- `--anti-patterns` : Detectar antipadrões
|
|
|
|
### Exemplos Básicos
|
|
|
|
```bash
|
|
# Análise de padrões de todo o projeto
|
|
/design-patterns
|
|
|
|
# Proposta de padrões para arquivo específico
|
|
/design-patterns src/services/user.js --suggest
|
|
|
|
# Verificação de princípios SOLID
|
|
/design-patterns --solid
|
|
|
|
# Detecção de antipadrões
|
|
/design-patterns --anti-patterns
|
|
```
|
|
|
|
### Categorias de Análise
|
|
|
|
#### 1. Padrões de Criação
|
|
|
|
- **Factory Pattern**: Abstração da criação de objetos
|
|
- **Builder Pattern**: Construção gradual de objetos complexos
|
|
- **Singleton Pattern**: Garantia de unicidade de instância
|
|
- **Prototype Pattern**: Geração de clones de objetos
|
|
|
|
#### 2. Padrões Estruturais
|
|
|
|
- **Adapter Pattern**: Conversão de interfaces
|
|
- **Decorator Pattern**: Adição dinâmica de funcionalidades
|
|
- **Facade Pattern**: Simplificação de subsistemas complexos
|
|
- **Proxy Pattern**: Controle de acesso a objetos
|
|
|
|
#### 3. Padrões Comportamentais
|
|
|
|
- **Observer Pattern**: Implementação de notificação de eventos
|
|
- **Strategy Pattern**: Alternância de algoritmos
|
|
- **Command Pattern**: Encapsulamento de operações
|
|
- **Iterator Pattern**: Percorrer coleções
|
|
|
|
### Itens de Verificação dos Princípios SOLID
|
|
|
|
```text
|
|
S - Single Responsibility Principle (Princípio da Responsabilidade Única)
|
|
O - Open/Closed Principle (Princípio Aberto/Fechado)
|
|
L - Liskov Substitution Principle (Princípio da Substituição de Liskov)
|
|
I - Interface Segregation Principle (Princípio da Segregação de Interface)
|
|
D - Dependency Inversion Principle (Princípio da Inversão de Dependência)
|
|
```
|
|
|
|
### Exemplo de Saída
|
|
|
|
```text
|
|
Relatório de Análise de Design Patterns
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
Padrões Atualmente em Uso
|
|
├─ Observer Pattern: EventEmitter (12 locais)
|
|
├─ Factory Pattern: UserFactory (3 locais)
|
|
├─ Singleton Pattern: DatabaseConnection (1 local)
|
|
└─ Strategy Pattern: PaymentProcessor (5 locais)
|
|
|
|
Padrões Recomendados
|
|
├─ [HIGH] Repository Pattern
|
|
│ └─ Alvo: src/models/*.js
|
|
│ └─ Motivo: Separação da lógica de acesso a dados
|
|
│ └─ Exemplo:
|
|
│ class UserRepository {
|
|
│ async findById(id) { ... }
|
|
│ async save(user) { ... }
|
|
│ }
|
|
│
|
|
├─ [MED] Command Pattern
|
|
│ └─ Alvo: src/api/handlers/*.js
|
|
│ └─ Motivo: Unificação do processamento de requisições
|
|
│
|
|
└─ [LOW] Decorator Pattern
|
|
└─ Alvo: src/middleware/*.js
|
|
└─ Motivo: Melhoria da combinação de funcionalidades
|
|
|
|
Violações dos Princípios SOLID
|
|
├─ [S] UserService: responsável tanto por autenticação quanto gerenciamento de permissões
|
|
├─ [O] PaymentGateway: necessária modificação ao adicionar novos métodos de pagamento
|
|
├─ [D] EmailService: depende diretamente de classes concretas
|
|
└─ [I] IDataStore: contém métodos não utilizados
|
|
|
|
Propostas de Refatoração
|
|
1. Dividir UserService em autenticação e gerenciamento de permissões
|
|
2. Introduzir interface PaymentStrategy
|
|
3. Definir interface EmailService
|
|
4. Separar IDataStore por uso
|
|
```
|
|
|
|
### Exemplos de Uso Avançado
|
|
|
|
```bash
|
|
# Análise de impacto da aplicação de padrões
|
|
/design-patterns --impact-analysis Repository
|
|
|
|
# Geração de exemplo de implementação de padrão específico
|
|
/design-patterns --generate Factory --for src/models/Product.js
|
|
|
|
# Proposta de combinação de padrões
|
|
/design-patterns --combine --context "API with caching"
|
|
|
|
# Avaliação de padrões arquiteturais
|
|
/design-patterns --architecture MVC
|
|
```
|
|
|
|
### Exemplo de Aplicação de Padrão
|
|
|
|
#### Antes (código problemático)
|
|
|
|
```javascript
|
|
class OrderService {
|
|
processOrder(order, paymentType) {
|
|
if (paymentType === "credit") {
|
|
// Processamento de cartão de crédito
|
|
} else if (paymentType === "paypal") {
|
|
// Processamento PayPal
|
|
}
|
|
// Outros métodos de pagamento...
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Depois (aplicação do Strategy Pattern)
|
|
|
|
```javascript
|
|
// Interface de estratégia
|
|
class PaymentStrategy {
|
|
process(amount) {
|
|
throw new Error("Must implement process method");
|
|
}
|
|
}
|
|
|
|
// Estratégia concreta
|
|
class CreditCardPayment extends PaymentStrategy {
|
|
process(amount) {
|
|
/* implementação */
|
|
}
|
|
}
|
|
|
|
// Contexto
|
|
class OrderService {
|
|
constructor(paymentStrategy) {
|
|
this.paymentStrategy = paymentStrategy;
|
|
}
|
|
|
|
processOrder(order) {
|
|
this.paymentStrategy.process(order.total);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Detecção de Antipadrões
|
|
|
|
- **God Object**: Classe com responsabilidades excessivas
|
|
- **Spaghetti Code**: Código com fluxo de controle complexamente entrelaçado
|
|
- **Copy-Paste Programming**: Uso excessivo de código duplicado
|
|
- **Magic Numbers**: Constantes hardcoded
|
|
- **Callback Hell**: Callbacks profundamente aninhados
|
|
|
|
### Melhores Práticas
|
|
|
|
1. **Aplicação gradual**: Não aplicar muitos padrões de uma vez
|
|
2. **Verificação de necessidade**: Padrões são meios para resolver problemas, não fins
|
|
3. **Consenso da equipe**: Discutir em equipe antes de aplicar padrões
|
|
4. **Documentação**: Registrar a intenção dos padrões aplicados
|