エリックエバンスのドメイン駆動設計の「第15章 蒸留」まとめ

エリック・エヴァンスのドメイン駆動設計

エリック・エヴァンスのドメイン駆動設計

今回は、「第15章 蒸留」のまとめです。

概要

蒸留とは?

混ざり合ったコンポーネントを分離するプロセスであり、価値があって役立つ形式で本質を抽出することです。

蒸留する動機は、システム内で最大の価値を付加すべき場所、すなわち「コアドメイン」を抽出したいという欲求になります。

ドメインモデルに対する戦略的蒸留

ドメインモデルに対する戦略的蒸留は、以下に挙げる全てを行います。

  1. システムの全体的な設計と、設計同士がどう関係するのかを、チームメンバ全員が把握できるようにする。

  2. ユビキタス言語に入れやすいサイズのコアドメインを識別することで、コミュニケーションを促進する。

  3. リファクタリングの指針となる。

  4. モデルで最も価値がある領域に作業を集中する。

  5. アウトソーシングと既製のコンポーネントの利用、その割り当てについて、決定する際の指針となる。

今回は、コアドメインの戦略的蒸留に対する体系的なアプローチを提示します。

f:id:mmm-mao:20150708115705j:plain

コアドメイン

コアドメインで実現したいことは、以下が挙げられます。

  • コアドメインを見つけて、コアドメインをサポートする大量のモデルやコードから容易に区別する手段を提供すること。

  • 最も価値のある特化した概念を浮き彫りにすること。

  • コアは小さくすること。

コアドメインを蒸留していくことにより、設計の意思決定が容易になっていきます。

汎用サブドメイン

ドメインモデルの中には、専門的な知識を捉えることも伝えることもなく、複雑さを付け加えるだけの要素があります。

本質と無関係なものがあると、それが何であれ、コアドメインを見分け、理解するのが困難になります。

ただ、本質とは別の要素とは言え、システムを機能させ、ドメインモデルを完全に表現する上で欠かせない要素です。

このような要素を汎用サブドメインとして識別して、別のモジュールに入れることを実施します。

汎用サブドメインに対しては、既製品(OSSなど)による解決策や公表されているモデルの採用も検討します。

ドメインビジョン声明文

最小の投資で基本的な概念とその価値を伝えることを目的として、ドメインビジョン声明文は開発チームを共通の方向に向かわせ、モデルとコード自体の蒸留を続けさせます。

ドメインビジョン声明文の具体的な内容としては、以下が挙げられます。

  • コアドメインとそれがもたらす価値に関する簡潔な記述を作成すること。

*ドメインモデルを他と差別化するものでない側面は無視すること。

  • ドメインモデルがどのように役立ち、多様な関心に対してどうバランスを取るかを示すこと。

強調されたコア

コアドメインを全員が理解しやすくするテクニックが必要で、蒸留ドキュメントやドメインモデルにコアドメインを印付けするなどがあります。

ただ、強調することが目標なので、これにより設計を変更する必要はありません。

凝集されたメカニズム

アルゴリズムなどの概念的に凝集された部分を切り分けて、別のフレームワークとして括り出し、意図の明白なインターフェースを用いて、フレームワークの機能を他から使えるようにします。

これにより、ドメインの他の要素は問題を表現することに集中でき、複雑な解決手段はフレームワークに委譲できるようになります。

汎用サブドメインと凝集されたメカニズムはどちらもコアドメインの負担を軽減する観点であるが、それぞれ引き受ける責務が違います。

それぞれの責務は以下の通りです。

隔離されたコア

パッケージし直すことで、コードの中であっても、コアドメインが直接見えるようになり、コアドメインに対する将来の作業が容易になります。

抽象化されたコア

サブドメインに分割していくことにより、各種モジュールもいずれかのサブドメインに移動します。

場合によっては、サブドメイン間でモジュールの依存関係があると、かえって複雑になり、分割した価値がなくなってしまいます。

そのため、モジュールの概念を考えて、それを別クラスやインターフェースに括り出します。

抽象化されたコアの導入前 f:id:mmm-mao:20150708153034j:plain

抽象化されたコアの導入後 f:id:mmm-mao:20150708153044j:plain

以上が「第15章 蒸留」のまとめです。