🗺️
Tips #スキル #DDD #コンテキストマップ #アーキテクチャ 📚 実践ドメイン駆動設計

コンテキストマップを描くスキル

システムのBounded Contextを洗い出し、チーム間・サービス間の依存関係と統合パターンを可視化する手順

目的

システムのBounded Contextを洗い出し、「誰が誰に依存しているか」「どんな方法で統合するか」を可視化する。

手順

1. Bounded Contextを列挙する

チームやサービスの単位でContextを書き出す。

例:フィットネス予約システム(Wild Workouts)
- Trainer Context(トレーナーのスケジュール管理)
- Users Context(ユーザー・予約管理)
- Trainings Context(トレーニング記録)

判断基準:「ここでは『顧客』はどういう意味か?」が違うなら別Context。

2. Context間の依存を矢印で描く

どちらが上流(変更を加える側)でどちらが下流(影響を受ける側)かを決める。

[Users Context] ──→ [Trainer Context]
(予約を依頼する)  (スケジュールを管理する)

3. 統合パターンを決める

各矢印に「どうやってつなぐか」を書く。

パターン使う場面
顧客/供給者下流が上流に要件を伝えられる関係
腐敗防止層(ACL)外部/レガシーと繋ぐとき。外部モデルを自分のContextに持ち込まない
公開ホストサービス上流が安定したAPIを外部に公開する
イベント(非同期)疎結合にしたい。処理が非同期でよい
共有カーネル2Contextで一部モデルを共有する(変更には両者の合意が必要)

4. 「同一言語か?」を確認する

問い:「TrainerとUsersで『予約』という言葉は同じ意味か?」
→ Trainer側:「スケジュールの枠を押さえること」
→ Users側:「ユーザーがトレーニングを申し込むこと」
→ 意味が違う → 別Context確定、ACLで翻訳する

5. 図に起こす(テキストでもOK)

[Users Context]
    │ 顧客/供給者

[Trainer Context] ──イベント──▶ [Trainings Context]
    │ 公開ホストサービス

[外部カレンダーAPI]
    ↑ ACL(外部モデルを翻訳)

チェックリスト

  • すべてのサービス/チームがContextとして列挙されているか
  • 各矢印に統合パターンが書かれているか
  • 外部システム・レガシーにはACLを挟む設計になっているか
  • 「同じ言葉」が複数Contextで違う意味を持っていないか確認したか
  • 上流/下流の関係が明確になっているか(どちらが変更の影響を受けるか)

やってはいけないこと

  • 全Contextで同じモデルを共有する(モデルが肥大化して変更不能になる)
  • ACLなしで外部APIのモデルをそのままドメインに使う(外部の変更が内部に直撃する)

関連概念

出典: 実践ドメイン駆動設計(Vaughn Vernon)第3章