システム全体をどうモデルに分割し、モデル同士・チーム同士の関係をどう扱うかを決める、大きな粒度の設計。
ユビキタス言語(Ubiquitous Language)¶
ドメインエキスパートと開発者が共有する、ドメインモデルに基づいた共通言語。会話・ドキュメント・コード(クラス名・メソッド名)のすべてで同じ用語を使う。
開発者だけの用語(テーブル名や技術用語)とビジネス側だけの用語に分裂していると、翻訳コストが発生し、モデルと実装が乖離していく
用語の揺れや曖昧さが見つかったら、それはモデルの綻びのサインであり、モデルとコードを更新する機会になる
ユビキタス言語は境界づけられたコンテキストごとに定義される(コンテキストが違えば同じ単語でも意味が違ってよい)
境界づけられたコンテキスト(Bounded Context)¶
1つのモデルが一貫した意味を持つ適用範囲の境界。同じ「商品」という言葉でも、販売コンテキストでは価格やカタログ情報が重要で、在庫コンテキストでは保管場所や数量が重要、というように意味が異なる。
システム全体を1つの統一モデルで表現しようとせず、コンテキストごとにモデルを分けて、それぞれの内部で一貫性を保つ。マイクロサービスのサービス分割の理論的根拠としてもよく参照される。
コンテキストマップ(Context Map)¶
コンテキスト間の関係を可視化した図。関係のパターンとして以下などが挙げられている。
共有カーネル(Shared Kernel):モデルの一部を複数チームで共有する
顧客/供給者(Customer/Supplier):上流チームが下流チームの要求を考慮する
順応者(Conformist):下流が上流のモデルにそのまま従う
腐敗防止層(Anticorruption Layer):外部システムのモデルが自分のモデルを侵食しないよう、変換層を挟む
公開ホストサービス(Open Host Service)/公表された言語(Published Language):多数の利用者向けに公開プロトコルを定義する
別々の道(Separate Ways):統合せず独立させる
コアドメイン(Core Domain)¶
事業の競争力の源泉となる、最も価値のある領域。ここに最良の人材と労力を集中し、それ以外の汎用サブドメイン(認証など、どの会社でも同じもの)や支援サブドメインは既製品の利用や簡素な実装で済ませる。