187 lines
5.2 KiB
Markdown
187 lines
5.2 KiB
Markdown
## Patrones de Diseño
|
|
|
|
Sugiere patrones de diseño para tu código y verifica si sigue los principios SOLID.
|
|
|
|
### Uso
|
|
|
|
```bash
|
|
/design-patterns [objetivo_análisis] [opciones]
|
|
```
|
|
|
|
### Opciones
|
|
|
|
- `--suggest`: Sugerir patrones aplicables (por defecto)
|
|
- `--analyze`: Analizar uso de patrones existentes
|
|
- `--refactor`: Generar propuestas de refactoring
|
|
- `--solid`: Verificar cumplimiento con principios SOLID
|
|
- `--anti-patterns`: Detectar anti-patrones
|
|
|
|
### Ejemplos Básicos
|
|
|
|
```bash
|
|
# Analizar patrones para todo el proyecto
|
|
/design-patterns
|
|
|
|
# Sugerir patrones para archivo específico
|
|
/design-patterns src/services/user.js --suggest
|
|
|
|
# Verificar principios SOLID
|
|
/design-patterns --solid
|
|
|
|
# Detectar anti-patrones
|
|
/design-patterns --anti-patterns
|
|
```
|
|
|
|
### Categorías de Patrones
|
|
|
|
#### 1. Patrones Creacionales
|
|
|
|
- **Patrón Factory**: Abstrae la creación de objetos
|
|
- **Patrón Builder**: Construcción paso a paso de objetos complejos
|
|
- **Patrón Singleton**: Asegura que solo exista una instancia
|
|
- **Patrón Prototype**: Crea clones de objetos
|
|
|
|
#### 2. Patrones Estructurales
|
|
|
|
- **Patrón Adapter**: Convierte interfaces
|
|
- **Patrón Decorator**: Agrega funcionalidad dinámicamente
|
|
- **Patrón Facade**: Simplifica subsistemas complejos
|
|
- **Patrón Proxy**: Controla acceso a objetos
|
|
|
|
#### 3. Patrones de Comportamiento
|
|
|
|
- **Patrón Observer**: Implementa notificaciones de eventos
|
|
- **Patrón Strategy**: Cambia algoritmos
|
|
- **Patrón Command**: Encapsula operaciones
|
|
- **Patrón Iterator**: Recorre colecciones
|
|
|
|
### Principios SOLID Que Verificamos
|
|
|
|
```text
|
|
S - Responsabilidad Única (una clase, un trabajo)
|
|
O - Abierto/Cerrado (abierto para extensión, cerrado para modificación)
|
|
L - Sustitución de Liskov (los subtipos deben ser reemplazables)
|
|
I - Segregación de Interfaces (no forzar métodos no utilizados)
|
|
D - Inversión de Dependencias (depender de abstracciones, no detalles)
|
|
```
|
|
|
|
### Ejemplo de Salida
|
|
|
|
```text
|
|
Reporte de Análisis de Patrones de Diseño
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
Patrones Actualmente Utilizados
|
|
├─ Patrón Observer: EventEmitter (12 instancias)
|
|
├─ Patrón Factory: UserFactory (3 instancias)
|
|
├─ Patrón Singleton: DatabaseConnection (1 instancia)
|
|
└─ Patrón Strategy: PaymentProcessor (5 instancias)
|
|
|
|
Patrones Recomendados
|
|
├─ [ALTO] Patrón Repository
|
|
│ └─ Dónde: src/models/*.js
|
|
│ └─ Por qué: Separar acceso a datos de lógica de negocio
|
|
│ └─ Ejemplo:
|
|
│ class UserRepository {
|
|
│ async findById(id) { ... }
|
|
│ async save(user) { ... }
|
|
│ }
|
|
│
|
|
├─ [MED] Patrón Command
|
|
│ └─ Dónde: src/api/handlers/*.js
|
|
│ └─ Por qué: Estandarizar cómo se manejan las solicitudes
|
|
│
|
|
└─ [BAJO] Patrón Decorator
|
|
└─ Dónde: src/middleware/*.js
|
|
└─ Por qué: Mejor manera de combinar características
|
|
|
|
Violaciones SOLID Encontradas
|
|
├─ [S] UserService: Hace demasiado (autenticación Y autorización)
|
|
├─ [O] PaymentGateway: Debe cambiar código para agregar tipos de pago
|
|
├─ [D] EmailService: Depende de clases específicas, no interfaces
|
|
└─ [I] IDataStore: Tiene métodos que nadie usa
|
|
|
|
Cómo Arreglar
|
|
1. Dividir UserService en AuthService y AuthorizationService
|
|
2. Agregar una interfaz PaymentStrategy para nuevos tipos de pago
|
|
3. Crear una interfaz EmailService
|
|
4. Dividir IDataStore en interfaces más pequeñas
|
|
```
|
|
|
|
### Ejemplos de Uso Avanzado
|
|
|
|
```bash
|
|
# Ver qué pasa si usas un patrón
|
|
/design-patterns --impact-analysis Repository
|
|
|
|
# Obtener código de ejemplo para un patrón
|
|
/design-patterns --generate Factory --for src/models/Product.js
|
|
|
|
# Encontrar patrones que funcionan bien juntos
|
|
/design-patterns --combine --context "API con caché"
|
|
|
|
# Verificar tu arquitectura
|
|
/design-patterns --architecture MVC
|
|
```
|
|
|
|
### Ejemplo: Antes y Después
|
|
|
|
#### Antes (Código Problemático)
|
|
|
|
```javascript
|
|
class OrderService {
|
|
processOrder(order, paymentType) {
|
|
if (paymentType === "credit") {
|
|
// Procesamiento de tarjeta de crédito
|
|
} else if (paymentType === "paypal") {
|
|
// Procesamiento de PayPal
|
|
}
|
|
// Otros métodos de pago...
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Después (Aplicando Patrón Strategy)
|
|
|
|
```javascript
|
|
// Interfaz Strategy
|
|
class PaymentStrategy {
|
|
process(amount) {
|
|
throw new Error("Debe implementar el método process");
|
|
}
|
|
}
|
|
|
|
// Estrategias concretas
|
|
class CreditCardPayment extends PaymentStrategy {
|
|
process(amount) {
|
|
/* Implementación */
|
|
}
|
|
}
|
|
|
|
// Contexto
|
|
class OrderService {
|
|
constructor(paymentStrategy) {
|
|
this.paymentStrategy = paymentStrategy;
|
|
}
|
|
|
|
processOrder(order) {
|
|
this.paymentStrategy.process(order.total);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Anti-Patrones Que Encontramos
|
|
|
|
- **Objeto Dios**: Clases que hacen todo
|
|
- **Código Espagueti**: Desorden enredado de flujo de control
|
|
- **Programación Copy-Paste**: El mismo código en todas partes
|
|
- **Números Mágicos**: Números aleatorios sin explicación
|
|
- **Infierno de Callbacks**: Callbacks dentro de callbacks dentro de callbacks
|
|
|
|
### Mejores Prácticas
|
|
|
|
1. **Ve despacio**: Agrega patrones de uno en uno
|
|
2. **Necesidad primero**: Solo usa patrones para resolver problemas reales
|
|
3. **Háblalo**: Obtén el apoyo del equipo antes de grandes cambios
|
|
4. **Escríbelo**: Documenta por qué elegiste cada patrón
|