共有カーネル(Shared Kernel)
定義
共有カーネル(Shared Kernel)とは、2つの境界づけられたコンテキストが、ドメインモデルの一部(サブセット)を共同で所有・管理するパターン。共有されたモデルは両チームの合意なしに変更してはならない。
チームA(注文コンテキスト)
↘
共有カーネル: Money, CustomerId, OrderId
↗
チームB(請求コンテキスト)
なぜ重要か
完全に独立したコンテキストを維持すると、共通概念(金額、ID、住所など)をそれぞれのコンテキストで重複定義することになる。共有カーネルは重複を排除しながら、両チームが同じ概念を使い続けることを保証する。
ただし、共有することは結合を生む。変更には両チームの協議と合意が必要になる。
適用場面
- 密接に連携する2チームが、共通の値オブジェクト(金額、日付範囲、識別子)を共有するとき
- チーム間のコミュニケーションコストが低く、共同での管理が現実的なとき
- 完全な分離より共有のコストの方が低いと判断できるとき
他のパターンとの比較
| パターン | 特徴 |
|---|---|
| 共有カーネル | 一部を共同所有。変更時は両チームの合意が必要 |
| カスタマー/サプライヤー | 上流が提供し下流が消費。下流は変更を依頼できる |
| 追従者(Conformist) | 上流モデルをそのまま取り込む。交渉なし |
| 腐敗防止層(ACL) | 下流が翻訳層で保護。完全に独立したモデルを維持 |
注意点
共有カーネルは「小さく」保つことが原則。共有が増えるほど変更の影響範囲が広がる。「これも共有してしまえ」という誘惑に抗い、絶対に必要なものだけを共有する。
関連概念
- → コンテキストマップ
- → 境界づけられたコンテキスト
- → 値オブジェクト
出典
実践ドメイン駆動設計(Vaughn Vernon)第3章・第13章