実践ドメイン駆動設計 - 第2章 ドメイン、サブドメイン、境界づけられたコンテキスト
実践ドメイン駆動設計 第2章のまとめです。
2.8 全体像
サブドメインと境界づけられたコンテキストのはたらき
- オンライン販売を例に考える
コアドメインに注⽬する
2.9 なぜそれほどまでに戦略的設計を重視するのか
- コラボレーションプロジェクトチームの例を考える
2.10 実世界におけるドメインとサブドメイン
- ドメインは問題空間と解決空間を持つ
問題空間
解決空間
- ソフトウェアをどのように実装してその課題を解決するかに注⽬する
- 解決空間 = 境界づけられたコンテキスト
- 境界づけられたコンテキスト
- 例えば、
- 特定のソリューションを表すもの
- 特定のソリューションを具現化したビュー
- 特定のソフトウェアモデルの集合
- 例えば、
- 境界づけられたコンテキストを⽤いて、何らかのソリューションをソフトウェアとして具現化する
問題空間と解決空間
- 各サブドメインを、境界づけられたコンテキストと⼀対⼀で対応させるのが望ましいゴール
- しかし実際は難しいので、アセスメントビューを使う (これ以上詳しい説明がなかった)
- ERP (Enterprise Resource Planning) アプリケーションを例として考えてみる
- 会計、プロジェクト管理、製造などの日々の業務を管理するために組織が使用するシステムおよびソフトウェアパッケージ
評価
- 問題空間 (ドメイン) の評価のための質問
- 解決空間 (境界づけられたコンテキスト) の評価のための質問
2.11 境界づけられたコンテキストの意味を知る
- 境界づけられたコンテキスト
- ドメインモデル
- ユビキタス⾔語をソフトウェアモデルとして表したもの
- なぜ "境界" が必要なのか?
- 各モデルの内部的な概念やプロパティ・操作がそれぞれ特別な意味を持つから
- 異なる⼆つのモデルが、同じ、あるいはよく似た名前のオブジェクトを違う意味で使っていることが多い
- ⼆つのモデルを明確に境界づけておくことで、それぞれのコンテキストにおける意味合いをはっきりさせる
- したがって、境界づけられたコンテキストは主として "⾔語的な境界" となる
- 巨大モデルの誘惑
コンテキスト
- 文脈
- 例えば、同じ「アカウント」という⽤語でも、銀⾏取引コンテキスト (口座) と⽂学コンテキスト (報告書) とでは意味合いがまったく異なる
- 実世界におけるコンテキスト
- 実際の業務でありがちなのは、似ているけれども微妙に意味が違うという状況
- なぜなら、各チームがそれぞれのコンテキストで選んだ名前は、そのユビキタス⾔語を念頭に置いて考えられているものだから
- 「アカウント」の例をもう少し
- 「当座預⾦⼝座」と「普通預⾦⼝座」の銀⾏取引コンテキストを考えてみる
- 当座預⾦コンテキストで使うオブジェクトに「当座預⾦⼝座」、普通預⾦コンテキストで使うオブジェクトに「普通預⾦⼝座」などとご丁寧に名づける必要はなく、単に「⼝座」と名づけられる
- それぞれの境界づけられたコンテキストが、微妙な意味の違いを区別する
- 名前を同一にしなければいけないという決まりがあるわけではないので、チームが判断すればよい
- 「当座預⾦⼝座」と「普通預⾦⼝座」の銀⾏取引コンテキストを考えてみる
- 境界づけられたコンテキスト間でのマッピング
- 通常は通常はオブジェクトのインスタンスを境界の外で使うことはないが、状態の一部を共有することがあるかもしれない
- あまり詳しい説明はなかった
- 通常は通常はオブジェクトのインスタンスを境界の外で使うことはないが、状態の一部を共有することがあるかもしれない
- 同一モデルの中の複数のコンテキスト
- 出版社の業務モデルの例
- 書籍の起案 -> 執筆と編集のプロセス管理 -> 装丁や挿絵をデザイン -> 他の言語に翻訳 -> 宣伝 -> 出荷
- これらを統一的に扱うモデルを使おうとしてしまうと混乱する
- 段階ごとに「書籍」の定義すら変わってくる
- 実際には、書籍オブジェクトにはおそらく識別⼦があって、それをコンテキスト間で共有するのだろう
- コラボレーションチームの例
- 重要なのは、"異なる概念やオブジェクトが、同じものであるともいえるし違うものだともいえるということで、その違いは、どの境界づけられたコンテキストで⾒るかによるということ"
- 出版社の業務モデルの例
モデル以外のものを扱う余地
- 境界づけられたコンテキストは、ドメインモデルだけを扱うものというわけでなはい
- システムやアプリケーション、あるいは業務サービスなどを区切るためにも使われる
- 利口なUI アンチパターン
- ビジネスロジックやデータアクセスのコードが、UI のコードと一緒になってしまっている状態
- すべての処理が UI の中で行なわれるので「利口な」UI と呼ばれる
境界づけられたコンテキストの⼤きさ
- 要点
- ドメインモデルの変更
- イテレーションのたびに、私たちはモデルに関する仮定と戦うことになる
- モデルに何らかの概念を追加したり削除したりする
- ここでのポイントは、何度も繰り返し問題に直⾯するということ
- DDD の原則に従っていれば、何がモデルに属して何がモデルに属さないのかをきちんと考察できるようになる!
- イテレーションのたびに、私たちはモデルに関する仮定と戦うことになる
- ドメインモデルの美しい⾳⾊
- 観念的すぎてわからん
- 境界づけられたコンテキストのサイズを間違えて作ってしまう原因
- 適切なサイズの境界づけられたコンテキストを作る時の留意点
技術的なコンポーネントとの協調
- 境界づけられたコンテキストを、技術的コンポーネントの観点で考えることは特に問題はないが、技術的コンポーネントがコンテキストを定めるのではないことに注意する
- Java での例
- 境界づけられたコンテキスト
com.mycompany.optimalpurchasing
- 責務による分割
com.mycompany.optimalpurchasing.presentation
com.mycompany.optimalpurchasing.application
com.mycompany.optimalpurchasing.domain.model
com.mycompany.optimalpurchasing.infrastructure
- このようにモジュール分割したとしても、単⼀の境界づけられたコンテキストの作業は単⼀のチームが受け持つべき
- 明確に境界づけられたコンテキストで作られたユビキタス⾔語にチームを注⼒させるため
- Java だと、境界づけられたコンテキストをひとつの JAR にまとめられる
- 境界づけられたコンテキスト
2.12 サンプルのコンテキスト
- 現実世界では、あらゆるプロジェクトに、境界づけられたコンテキストが複数存在するため、それらの統合が重要となる
- 例として、コラボレーションツール (G Suite や Confluence みたいなやつ) について、セキュリティや権限の情報をコラボレーションモデルに組み込んでしまうという間違いを犯してしまった、ということを考える
- どう改善するか?
- コンテキストマップを使い、現在の問題点を整理する
- [Evans] の「第4部:戦略的設計」で紹介されている? (未確認)
- これにより、現在の窮状を議論することで、建設的な分析で解決策を考えられるようになった
- 隔離されたコア [Evans] を⽬指す
- コンテキストマップを使い、現在の問題点を整理する
- 境界づけられたコンテキストを⼩さくするべく、いくつかの⼩さなコンテキストを切り出すことも考えられるが、これは良くない