Initial commit
This commit is contained in:
186
commands/design-patterns.md
Normal file
186
commands/design-patterns.md
Normal file
@@ -0,0 +1,186 @@
|
||||
## Design Patterns
|
||||
|
||||
Suggests design patterns for your code and checks if it follows SOLID principles.
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
/design-patterns [analysis_target] [options]
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
- `--suggest`: Suggest applicable patterns (default)
|
||||
- `--analyze`: Analyze existing pattern usage
|
||||
- `--refactor`: Generate refactoring proposals
|
||||
- `--solid`: Check compliance with SOLID principles
|
||||
- `--anti-patterns`: Detect anti-patterns
|
||||
|
||||
### Basic Examples
|
||||
|
||||
```bash
|
||||
# Analyze patterns for entire project
|
||||
/design-patterns
|
||||
|
||||
# Suggest patterns for specific file
|
||||
/design-patterns src/services/user.js --suggest
|
||||
|
||||
# Check SOLID principles
|
||||
/design-patterns --solid
|
||||
|
||||
# Detect anti-patterns
|
||||
/design-patterns --anti-patterns
|
||||
```
|
||||
|
||||
### Pattern Categories
|
||||
|
||||
#### 1. Creational Patterns
|
||||
|
||||
- **Factory Pattern**: Abstracts object creation
|
||||
- **Builder Pattern**: Step-by-step construction of complex objects
|
||||
- **Singleton Pattern**: Ensures only one instance exists
|
||||
- **Prototype Pattern**: Creates object clones
|
||||
|
||||
#### 2. Structural Patterns
|
||||
|
||||
- **Adapter Pattern**: Converts interfaces
|
||||
- **Decorator Pattern**: Dynamically adds functionality
|
||||
- **Facade Pattern**: Simplifies complex subsystems
|
||||
- **Proxy Pattern**: Controls access to objects
|
||||
|
||||
#### 3. Behavioral Patterns
|
||||
|
||||
- **Observer Pattern**: Implements event notifications
|
||||
- **Strategy Pattern**: Switches algorithms
|
||||
- **Command Pattern**: Encapsulates operations
|
||||
- **Iterator Pattern**: Traverses collections
|
||||
|
||||
### SOLID Principles We Check
|
||||
|
||||
```text
|
||||
S - Single Responsibility (one class, one job)
|
||||
O - Open/Closed (open for extension, closed for modification)
|
||||
L - Liskov Substitution (subtypes should be replaceable)
|
||||
I - Interface Segregation (don't force unused methods)
|
||||
D - Dependency Inversion (depend on abstractions, not details)
|
||||
```
|
||||
|
||||
### Output Example
|
||||
|
||||
```text
|
||||
Design Pattern Analysis Report
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Currently Used Patterns
|
||||
├─ Observer Pattern: EventEmitter (12 instances)
|
||||
├─ Factory Pattern: UserFactory (3 instances)
|
||||
├─ Singleton Pattern: DatabaseConnection (1 instance)
|
||||
└─ Strategy Pattern: PaymentProcessor (5 instances)
|
||||
|
||||
Recommended Patterns
|
||||
├─ [HIGH] Repository Pattern
|
||||
│ └─ Where: src/models/*.js
|
||||
│ └─ Why: Separate data access from business logic
|
||||
│ └─ Example:
|
||||
│ class UserRepository {
|
||||
│ async findById(id) { ... }
|
||||
│ async save(user) { ... }
|
||||
│ }
|
||||
│
|
||||
├─ [MED] Command Pattern
|
||||
│ └─ Where: src/api/handlers/*.js
|
||||
│ └─ Why: Standardize how requests are handled
|
||||
│
|
||||
└─ [LOW] Decorator Pattern
|
||||
└─ Where: src/middleware/*.js
|
||||
└─ Why: Better way to combine features
|
||||
|
||||
SOLID Violations Found
|
||||
├─ [S] UserService: Does too much (auth AND authorization)
|
||||
├─ [O] PaymentGateway: Must change code to add payment types
|
||||
├─ [D] EmailService: Depends on specific classes, not interfaces
|
||||
└─ [I] IDataStore: Has methods nobody uses
|
||||
|
||||
How to Fix
|
||||
1. Split UserService into AuthService and AuthorizationService
|
||||
2. Add a PaymentStrategy interface for new payment types
|
||||
3. Create an EmailService interface
|
||||
4. Break up IDataStore into smaller interfaces
|
||||
```
|
||||
|
||||
### Advanced Usage Examples
|
||||
|
||||
```bash
|
||||
# See what happens if you use a pattern
|
||||
/design-patterns --impact-analysis Repository
|
||||
|
||||
# Get example code for a pattern
|
||||
/design-patterns --generate Factory --for src/models/Product.js
|
||||
|
||||
# Find patterns that work well together
|
||||
/design-patterns --combine --context "API with caching"
|
||||
|
||||
# Check your architecture
|
||||
/design-patterns --architecture MVC
|
||||
```
|
||||
|
||||
### Example: Before and After
|
||||
|
||||
#### Before (Problem Code)
|
||||
|
||||
```javascript
|
||||
class OrderService {
|
||||
processOrder(order, paymentType) {
|
||||
if (paymentType === "credit") {
|
||||
// Credit card processing
|
||||
} else if (paymentType === "paypal") {
|
||||
// PayPal processing
|
||||
}
|
||||
// Other payment methods...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### After (Applying Strategy Pattern)
|
||||
|
||||
```javascript
|
||||
// Strategy interface
|
||||
class PaymentStrategy {
|
||||
process(amount) {
|
||||
throw new Error("Must implement process method");
|
||||
}
|
||||
}
|
||||
|
||||
// Concrete strategies
|
||||
class CreditCardPayment extends PaymentStrategy {
|
||||
process(amount) {
|
||||
/* Implementation */
|
||||
}
|
||||
}
|
||||
|
||||
// Context
|
||||
class OrderService {
|
||||
constructor(paymentStrategy) {
|
||||
this.paymentStrategy = paymentStrategy;
|
||||
}
|
||||
|
||||
processOrder(order) {
|
||||
this.paymentStrategy.process(order.total);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Anti-Patterns We Find
|
||||
|
||||
- **God Object**: Classes that do everything
|
||||
- **Spaghetti Code**: Tangled mess of control flow
|
||||
- **Copy-Paste Programming**: Same code everywhere
|
||||
- **Magic Numbers**: Random numbers with no explanation
|
||||
- **Callback Hell**: Callbacks inside callbacks inside callbacks
|
||||
|
||||
### Best Practices
|
||||
|
||||
1. **Go slow**: Add patterns one at a time
|
||||
2. **Need first**: Only use patterns to solve real problems
|
||||
3. **Talk it out**: Get team buy-in before big changes
|
||||
4. **Write it down**: Document why you chose each pattern
|
||||
Reference in New Issue
Block a user