ADR-0003: DDDアーキテクチャの採用¶
ドメイン駆動設計(DDD)に基づく3層アーキテクチャを採用する
日付: 2025-07-31
ステータス¶
2025-07-31 提案されました 2025-07-31 受け入れられました
コンテキスト¶
ぷよぷよゲーム開発において、以下の課題に対応するアーキテクチャ設計が必要でした:
ビジネス要件¶
- 複雑なゲームルール: ぷよ消去、連鎖、スコア計算の複雑性
- 段階的開発: 8つのイテレーションでの機能追加
- 保守性確保: 長期的な機能拡張と改修
- テスタビリティ: TDD実践のための設計
技術的課題¶
- 関心事の分離: UI、ビジネスロジック、技術的詳細の分離
- 依存関係管理: モジュール間の適切な依存関係
- 拡張性: 新機能追加時の影響範囲最小化
- 再利用性: コンポーネントの再利用可能性
検討したアーキテクチャ¶
- MVC: Model-View-Controller
- MVP: Model-View-Presenter
- MVVM: Model-View-ViewModel
- DDD: Domain-Driven Design
決定¶
ドメイン駆動設計(DDD)に基づく3層アーキテクチャを採用する
アーキテクチャ構成¶
src/
├── domain/ # ドメイン層
│ ├── model/ # エンティティ・値オブジェクト
│ └── type/ # ドメインサービス
├── application/ # アプリケーション層
│ └── GameController # ユースケース・オーケストレーション
└── infrastructure/ # インフラストラクチャ層
├── input/ # 入力処理
└── rendering/ # 描画処理
採用理由¶
- ビジネスロジック中心設計
- ゲームルールの明確なモデリング
- ドメインエキスパートとの共通言語
-
ビジネス価値の最大化
-
優れた保守性
- 明確な責務分離
- 変更影響範囲の限定
-
単体テストの容易性
-
拡張性の確保
- 新機能追加時の影響最小化
- オープン・クローズドの原則
-
既存コードの安定性
-
テスタビリティ
- 各層の独立テスト
- ドメインロジックの純粋性
- モックの効果的活用
層の責務定義¶
ドメイン層¶
- エンティティ: ゲーム、ゲームフィールド
- 値オブジェクト: ぷよ、ぷよペア、位置
- ドメインサービス: ゲーム状態、ぷよ色
- ルール: ビジネスロジックの集約
アプリケーション層¶
- ユースケース: ゲーム操作の調整
- オーケストレーション: 複数ドメインの連携
- 入出力調整: UI↔ドメイン変換
インフラストラクチャ層¶
- 技術的実装: Canvas描画、キーボード入力
- 外部システム: イベント処理、DOM操作
- フレームワーク: Vite、Vitest連携
影響¶
ポジティブな影響¶
- コード品質の向上
- ビジネスロジックの集約
- 単一責任原則の遵守
-
高い凝集度の実現
-
開発効率の向上
- TDD実践の促進
- 並行開発の可能性
-
デバッグ効率の改善
-
保守性の向上
- 変更影響範囲の明確化
- テストの安定性
-
リファクタリングの安全性
-
拡張性の確保
- 新機能追加の容易性
- 既存機能の安定性
- アーキテクチャの一貫性
ネガティブな影響¶
- 初期複雑性
- 層分離による複雑さ
- ファイル数の増加
-
設計理解の学習コスト
-
オーバーエンジニアリング
- 小規模プロジェクトでの過剰設計
- 抽象化のコスト
-
開発速度の初期低下
-
チーム習熟コスト
- DDD概念の理解
- 設計パターンの習得
- コードレビューの複雑化
コンプライアンス¶
この決定の遵守を確認する方法:
構造的検証¶
-
ディレクトリ構造
# 層構造の確認 find src -type d -name "domain" find src -type d -name "application" find src -type d -name "infrastructure"
-
依存関係検証
# 依存関係の方向性確認 # ドメイン層は他層に依存しない grep -r "import.*infrastructure" src/domain/ && echo "依存関係違反" grep -r "import.*application" src/domain/ && echo "依存関係違反"
-
ファイル配置確認
- ドメインモデル: src/domain/model/
- ビジネスロジック: src/domain/
- ユースケース: src/application/
- 技術実装: src/infrastructure/
設計品質検証¶
- 単体テスト比率
- ドメイン層テストカバレッジ: 95%以上
- 各層の独立テスト実行可能性
-
モックを使わないドメインテスト
-
結合度測定
- 層間の結合度最小化
- インターフェース経由の依存
-
循環依存の排除
-
凝集度評価
- 各クラスの単一責任性
- ドメイン概念の適切な抽象化
- ビジネスルールの集約
備考¶
著者¶
プロジェクトチーム
関連決定¶
- ADR-0001: TypeScriptの採用(型安全な設計支援)
- ADR-0002: Vitestの採用(層別テスト戦略)
- ADR-0004: Canvas APIの採用(インフラ層技術選択)
参考資料¶
実装例¶
ドメインモデル例¶
// src/domain/model/Game.ts
export class Game {
private field: GameField
private currentPuyo: PuyoPair | null
private state: GameState
// ビジネスルールの実装
movePuyo(dx: number, dy: number): boolean {
// ドメインロジック
}
}
アプリケーション層例¶
// src/application/GameController.ts
export class GameController {
constructor(
private game: Game,
private inputHandler: InputHandler,
private renderer: GameRenderer
) {}
// ユースケースの調整
update(): void {
this.handleInput()
this.game.update()
this.render()
}
}
成果指標¶
指標 | 目標値 | 実績値 |
---|---|---|
テストカバレッジ | 90% | 95% |
循環依存数 | 0 | 0 |
平均クラス責務数 | 1 | 1.2 |
層間結合度 | 最小 | 最小 |
将来の検討事項¶
- マイクロサービス化の可能性
- CQRS(Command Query Responsibility Segregation)導入
- イベントソーシングの適用検討