Functional Core, Imperative Shell
定義
アプリケーションを2層に分ける設計方針:
┌─────────────────────────────────┐
│ Imperative Shell(命令的外殻) │ ← I/O・DB・外部API・副作用
│ │
│ ┌───────────────────────┐ │
│ │ Functional Core │ │ ← 純粋関数のみ・ビジネスロジック
│ │ (関数型中核) │ │
│ └───────────────────────┘ │
└─────────────────────────────────┘
Shell がデータを集めて Core に渡し、Core の結果を Shell が世界に反映する。
なぜ重要か
副作用とロジックを混在させると、ロジックのテストに副作用の準備が必要になる。 分離することでビジネスロジックが純粋関数になり、テストが極めてシンプルになる。
適用場面
- DBから取得 → 計算 → DB保存、という典型的なユースケース
- 「テストのためにモックが大量に必要」と感じた時は Core/Shell 混在のサイン
関連概念
- → 純粋関数
- → ポート&アダプター(ヘキサゴナルアーキテクチャ)(同じ思想の発展形)
出典
関数型ドメインモデリング(Scott Wlaschin)/ Gary Bernhardt “Boundaries”