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
|
||||
|
||||
コードベースに適用可能なデザインパターンを提案し、SOLID 原則の遵守状況を評価します。
|
||||
|
||||
### 使い方
|
||||
|
||||
```bash
|
||||
/design-patterns [分析対象] [オプション]
|
||||
```
|
||||
|
||||
### オプション
|
||||
|
||||
- `--suggest` : 適用可能なパターンを提案 (デフォルト)
|
||||
- `--analyze` : 既存パターンの使用状況を分析
|
||||
- `--refactor` : リファクタリング案を生成
|
||||
- `--solid` : SOLID 原則の遵守状況をチェック
|
||||
- `--anti-patterns` : アンチパターンを検出
|
||||
|
||||
### 基本例
|
||||
|
||||
```bash
|
||||
# プロジェクト全体のパターン分析
|
||||
/design-patterns
|
||||
|
||||
# 特定ファイルへのパターン提案
|
||||
/design-patterns src/services/user.js --suggest
|
||||
|
||||
# SOLID 原則チェック
|
||||
/design-patterns --solid
|
||||
|
||||
# アンチパターン検出
|
||||
/design-patterns --anti-patterns
|
||||
```
|
||||
|
||||
### 分析カテゴリ
|
||||
|
||||
#### 1. 生成に関するパターン
|
||||
|
||||
- **Factory Pattern**: オブジェクト生成の抽象化
|
||||
- **Builder Pattern**: 複雑なオブジェクトの段階的構築
|
||||
- **Singleton Pattern**: インスタンスの一意性保証
|
||||
- **Prototype Pattern**: オブジェクトのクローン生成
|
||||
|
||||
#### 2. 構造に関するパターン
|
||||
|
||||
- **Adapter Pattern**: インターフェースの変換
|
||||
- **Decorator Pattern**: 機能の動的追加
|
||||
- **Facade Pattern**: 複雑なサブシステムの簡略化
|
||||
- **Proxy Pattern**: オブジェクトへのアクセス制御
|
||||
|
||||
#### 3. 振る舞いに関するパターン
|
||||
|
||||
- **Observer Pattern**: イベント通知の実装
|
||||
- **Strategy Pattern**: アルゴリズムの切り替え
|
||||
- **Command Pattern**: 操作のカプセル化
|
||||
- **Iterator Pattern**: コレクションの走査
|
||||
|
||||
### SOLID 原則チェック項目
|
||||
|
||||
```text
|
||||
S - Single Responsibility Principle (単一責任の原則)
|
||||
O - Open/Closed Principle (開放閉鎖の原則)
|
||||
L - Liskov Substitution Principle (リスコフの置換原則)
|
||||
I - Interface Segregation Principle (インターフェース分離の原則)
|
||||
D - Dependency Inversion Principle (依存性逆転の原則)
|
||||
```
|
||||
|
||||
### 出力例
|
||||
|
||||
```text
|
||||
デザインパターン分析レポート
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
現在使用中のパターン
|
||||
├─ Observer Pattern: EventEmitter (12 箇所)
|
||||
├─ Factory Pattern: UserFactory (3 箇所)
|
||||
├─ Singleton Pattern: DatabaseConnection (1 箇所)
|
||||
└─ Strategy Pattern: PaymentProcessor (5 箇所)
|
||||
|
||||
推奨パターン
|
||||
├─ [HIGH] Repository Pattern
|
||||
│ └─ 対象: src/models/*.js
|
||||
│ └─ 理由: データアクセスロジックの分離
|
||||
│ └─ 例:
|
||||
│ class UserRepository {
|
||||
│ async findById(id) { ... }
|
||||
│ async save(user) { ... }
|
||||
│ }
|
||||
│
|
||||
├─ [MED] Command Pattern
|
||||
│ └─ 対象: src/api/handlers/*.js
|
||||
│ └─ 理由: リクエスト処理の統一化
|
||||
│
|
||||
└─ [LOW] Decorator Pattern
|
||||
└─ 対象: src/middleware/*.js
|
||||
└─ 理由: 機能の組み合わせ改善
|
||||
|
||||
SOLID 原則違反
|
||||
├─ [S] UserService: 認証と権限管理の両方を担当
|
||||
├─ [O] PaymentGateway: 新決済手段追加時に修正必要
|
||||
├─ [D] EmailService: 具象クラスに直接依存
|
||||
└─ [I] IDataStore: 使用されないメソッドを含む
|
||||
|
||||
リファクタリング提案
|
||||
1. UserService を認証と権限管理に分割
|
||||
2. PaymentStrategy インターフェースの導入
|
||||
3. EmailService インターフェースの定義
|
||||
4. IDataStore を用途別に分離
|
||||
```
|
||||
|
||||
### 高度な使用例
|
||||
|
||||
```bash
|
||||
# パターン適用の影響分析
|
||||
/design-patterns --impact-analysis Repository
|
||||
|
||||
# 特定パターンの実装例生成
|
||||
/design-patterns --generate Factory --for src/models/Product.js
|
||||
|
||||
# パターンの組み合わせ提案
|
||||
/design-patterns --combine --context "API with caching"
|
||||
|
||||
# アーキテクチャパターンの評価
|
||||
/design-patterns --architecture MVC
|
||||
```
|
||||
|
||||
### パターン適用例
|
||||
|
||||
#### Before (問題のあるコード)
|
||||
|
||||
```javascript
|
||||
class OrderService {
|
||||
processOrder(order, paymentType) {
|
||||
if (paymentType === "credit") {
|
||||
// クレジットカード処理
|
||||
} else if (paymentType === "paypal") {
|
||||
// PayPal 処理
|
||||
}
|
||||
// 他の決済方法...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### After (Strategy Pattern 適用)
|
||||
|
||||
```javascript
|
||||
// 戦略インターフェース
|
||||
class PaymentStrategy {
|
||||
process(amount) {
|
||||
throw new Error("Must implement process method");
|
||||
}
|
||||
}
|
||||
|
||||
// 具象戦略
|
||||
class CreditCardPayment extends PaymentStrategy {
|
||||
process(amount) {
|
||||
/* 実装 */
|
||||
}
|
||||
}
|
||||
|
||||
// コンテキスト
|
||||
class OrderService {
|
||||
constructor(paymentStrategy) {
|
||||
this.paymentStrategy = paymentStrategy;
|
||||
}
|
||||
|
||||
processOrder(order) {
|
||||
this.paymentStrategy.process(order.total);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### アンチパターン検出
|
||||
|
||||
- **God Object**: 過度に多くの責務を持つクラス
|
||||
- **Spaghetti Code**: 制御フローが複雑に絡み合ったコード
|
||||
- **Copy-Paste Programming**: 重複コードの過度な使用
|
||||
- **Magic Numbers**: ハードコードされた定数
|
||||
- **Callback Hell**: 深くネストしたコールバック
|
||||
|
||||
### ベストプラクティス
|
||||
|
||||
1. **段階的適用**: 一度に多くのパターンを適用しない
|
||||
2. **必要性の検証**: パターンは問題解決の手段であり目的ではない
|
||||
3. **チーム合意**: パターン適用前にチームで議論
|
||||
4. **ドキュメント化**: 適用したパターンの意図を記録
|
||||
Reference in New Issue
Block a user