前回のふりかえり
第14章 モデルの整合性を維持する
コンテキストマップで用いられる、コンテキスト間の6種類の関係
- 共有カーネル
- モデルの一部を直接共有することで、少ないコストで統合しやすくなる
- 顧客/供給者の開発チーム
- 明確に顧客(使う側)と供給者(使われる側)という関係を確立する
- 順応者
- 独自のモデルを作らず、あえて上流のドメインモデルに従う
- 腐敗防止層
- 相手と自分のシステムの間に隔離(変換)するためのレイヤを設ける
- 別々の道
- 二つのシステムを完全に分離し、別々のモデルを使用する
- 公開ホストサービス
- あるサブシステムを他の多くのサブシステムと統合しなければならない時に、変換サービスではなく、アクセスするための公開サービスを作成する
第15章 蒸留
- 蒸留とは、混ざり合ったコンポーネントを分離するプロセスで、価値があって役立つ形式で本質を抽出するためのもの
- モデルから副次的なものを切り落とし、本当に重要なもの(コアドメイン)に焦点を当てやすくするための技法
→ 15章では、広範囲にわたるモデルを識別して、全体としてのドメインモデルを蒸留する方法を見ていく
コアドメインと汎用ドメイン
ドメインをコアドメインと汎用ドメインに分け、巨大なシステムでもモデルの中で最も重要な部分にフォーカスできるようにする
コアドメイン
コアドメインは、システム内で最大の価値を付加すべき場所
汎用サブドメイン
コアドメインをドキュメント化する
ドメインビジョン声明文
ドメインモデルの重要な側面は、複数のコンテキストにわたることもあるが、それら別々のモデルから共通の側面を読み取れるような構造にはできない。
強調されたコア
ドメインビジョン声明文を導入しても、コアモデルの要素の識別は個人の解釈に委ねられてしまう。チーム全体で同じように解釈できるようにするには、コアドメインがもっと見やすくなる必要がある。
- コアをわかりやすくするための方法
コアドメインをより見えやすくする方法
コアドメインから汎用サブドメインを切り離した後、モデルと設計自体を構造的に変更して、コアドメインをさらに見えやすく、扱いやすくする。
凝集されたメカニズム
コアドメインに属するアルゴリズム(どのようにの部分:How)が増えると、そのドメインが何を叶える者なのか(何が:What)がわかりづらくなる。そのような場合は、概念的に凝集したアルゴリズムをドメインから切り離す。
[留意点]
→ 上記により、ドメインの他の要素は概念(What)を表現することに集中でき、複雑な課題(How)をフレームワークに委譲できる。
隔離されたコア
コアドメインに補助的な役割を果たすものが混在していると、コアの発達が妨げられる。補助的な役割を果たすものをコアから分離することが必要となる
[隔離されたコアを作るためのステップ]
- コアとなるサブドメインを識別する
- 関連するクラスを新しいモジュールへ移動する
- リファクタリングして、その概念を直接表現していないデータ/機能を分離する
- 隔離されたコアのモジュールを、相互作用が単純で伝達力のあるものになるようリファクタリングする
- 隔離されたコアが完成するまで↑のサイクルを繰り返す
抽象化されたコア
サブドメインの間で大量の相互作用があると、モジュールの分割は事態を余計複雑にしてしまう。その場合は、分割の線を垂直ではなく水平に引くようにする。
- モデルの最も根本的な概念を識別し、抽象クラスまたはインターフェースに括りだす
- 抽象的なモデルが、コンポーネント間の相互作用を表現するように設計する
- この抽象的なモデル全体を、1つのモジュールにまとめる
(本を読んでいてあまりよくわからなかったんだけれども、下記の記事でどんな姿になるのか理解できました)
このモジュール内のモデルは、複数モジュール間の相互作用を抽象化して全体像をまとめたものになる。そして、これが新しい中核のモデルとなる。抽象化によって中核を磨き上げる方法。
参考:[ 技術講座 ] Domain-Driven Designのエッセンス 第3回|オブジェクトの広場
思ったこと・気になったこと
ここで唐突にドキュメント出てきたなと思った。序盤で出てきた「ドメインモデルを常に変更し続ける」という話と、今回の「コアドメインを蒸留する」という話は全然別のフェーズの話として捉えていいのか、それともドメインモデルの変更の中の一工程が蒸留なのか、頭が混乱中