DDD
ドメイン駆動設計

ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十四章 モデルの整合性を維持する2 境界づけられたコンテキスト

これまでの十四章

第四部 戦略的設計 第一四章 モデルの整合性を維持する

境界づけられたコンテキスト

境界を定める

前回読んだように、システム全体で一つのモデルを持つことにはあまり得られるものはなく、コンテキストごとにモデルを持ち、何をどう統一し、何を統一しないかを決める方法が必要と書きました。

その境界をどうするか。それについてはほとんどの場合不明瞭とEvansは述べています。
それを明確するにはプロジェクトと最終成果物(コード・データベーススキーマ)の両方を見なければならないということです。

明示的な境界はチーム編成、アプリケーションに特有の部分が持つ用途、コードベースやデータベーススキーマなどの物理的な表現などの観点から設定すること。

境界内では、モデルを一貫性のあるものに保つことが求められます。

境界を定める効果

チームのメンバーは一貫性を持つものが何かが理解しやすくなり、他のコンテキストとどう関係づけるか明確な理解を共有できるようになります。

他のコンテキストは他のモデルが適用されますが、用語法・概念・ルール・ユビキタス言語が該当のコンテキストと異なります。なので、その区別が付くというのは大きな効果だと思います。

コンテキスト内での分派

サブシステムごとにチームが分かれていたり、ソースリポジトリが分かれていたりすれば、境界は引きやすいと思います。

難しいのは、同じチームの同じリポジトリのソースでも不明瞭な境界があるかもしれないというところ。サブシステムの分け方も間違っているかもしれない。
そこで、常に注意すべきは重複した概念偽同族語(false cognate)です。

  • 重複した概念・・・ 複数の要素が実は同じ概念を表現していること
  • 偽同族語・・・ 同じ用語を使って話しているつもりが実は別々のことであったということ

重複した概念では1つの修正で2箇所修正が必要になってくる。
偽同族語はコードに矛盾が生じ、データベースのデータにも矛盾が生じてくる。チーム内の会話も混乱する。

こうしたことに気がつくか気がつかないかがとても重要でとても難しい。
気がついたら、問題に対してどうするべきか。判断を下す必要が出てくる。

その問題の対処の仕方は明日引続き読んでいきます。

マイクロサービスでのコンテキスト境界

マイクロサービスでのサービス分割にコンテキスト境界の考え方が役に立つと言っているのが、実装ドメイン駆動設計のVaughn Vernon(InfoQ マイクロサービスとドメイン駆動設計に関するVaughn Vernon氏の意見)。
一つの境界づけられたコンテキスト毎に一つのサービスから始めることを推奨しています。

Evansも、最低でもサービスとコンテキストの一対一の関係が生まれると言っています。(InfoQ DDD、マイクロサービス、境界についてEric Evans氏が語る)

まあ、上記で見てきたとおり、その境界を定めるのが難しいのですが・・・

高いレベルから考えることができる優秀なエンジニアがシステム内でドメインと境界付けられたコンテキストを見つけることができる。

とEvansも言っていますね。