エリックエバンスのドメイン駆動設計の「第4章 ドメインを隔離する」まとめ

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

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

今回は、「第4章 ドメインを隔離する」のまとめです。

概要

ドメインオブジェクトはシステムの他の機能から切り離すことが重要です。

他の機能とは、画面やデータの永続化の機能を指します。

隔離手段 レイヤ化アーキテクチャ

ドメインオブジェクトを隔離する手段として、レイヤ化アーキテクチャがあります。

この考え方は、DDD以外でもよく見かける考え方です。

DDDでは、以下4層に分離させます。

1.ユーザインターフェース層

  • ユーザに情報を表示して、ユーザからのなんらかのリクエストを解釈する。

2.アプリケーション層

  • ビジネスルールや知識は含まない。

  • やるべき作業を調整するだけで、実際の処理は、ドメイン層に委譲する。

  • ビジネス状況を反映する状態は保持しない。

  • 画面遷移時のセッションなどの作業進捗を反映する状態は持つことが可能。

3.ドメイン

  • ビジネスの概念とビジネスが置かれた状況に関する情報・ビジネスルールを表す。

  • ビジネスの状況を反映する状態はドメイン層で制御され、実際の格納処理はインフラストラクチャに委譲される。

4.インフラストラクチャ層

  • ドメインオブジェクトの永続化処理を行う。

  • アプリケーションのためのメッセージ送信。

各レイヤの依存関係

DDD本ではドメイン層からインフラストラクチャ層への依存がありますが、僕がやっているやり方だと、『ドメイン層を隔離する』ということなので、下の図のようにドメイン層はどの層にも依存していません。

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

ドメイン層からインフラストラクチャ層の依存の向きを逆にするやり方として、インフラストラクチャ層で実装するクラスのインターフェースをドメイン層で定義する。というやり方です。

このようにすることによって、永続化処理を実施したい場合、ドメイン層にあるインターフェースに対して処理を委譲することができます。

ただ、インターフェースへの委譲を実現することが可能なフレームワークを選定する必要があります。 僕が採用しているフレームワークSpring Frameworkで、DI(Autowired)の機能を用いて実現しています。

余談

実践において、アプリケーション層とドメイン層の責務を明確に分離することは難しいかと思っています。 理由としては、その時に置かれている状況(メンバのスキルやチーム間のメンバローテーションなど)によって、どちらの層の責務にするのか。都度判断かと思います。

例えば、僕のDDDでは、アプリケーション層のみ永続化のためのリポジトリの操作を実施するという制約にしています。本来なら、ドメイン層でリポジトリの操作を実施したほうが業務の概念にマッチする場合でも、アプリケーション層で実施しています。

仮に、ドメイン層でリポジトリの操作を実施する場合は、ドメイン層で実施して良いケース・悪いケースの判別をチームがする必要あります。 チームの中に熟練者が確実にいる状況なら安心なのですが、熟練者がいない状況もあるので、

①アプリケーション層でリポジトリ操作 ②ドメイン層の悪いケースでリポジトリ操作される可能性がある

のどちらを採用するか。だと思います。

僕の立場だと、チームを立ち上げて、半年後くらいには別チームの立ち上げなので、僕が抜けた後でも安全な設計にすべきなので、①を採用しています。

なので、全般的なことですが、『今』で判断するのではなく、『長期的な視点(2,3年後くらい)』で変更に強いシステムを作り上げることが大事だなっと最近思っています。

ただ、常に安全な選択肢をしていると、新しいことにチャレンジできず、組織としてDDDの成熟度が上がらないので、安全な選択肢/チャレンジの落とし所は難しいです。

隔離する目的

隔離する目的として、各レイヤが自らの責務を担うことによって、ドメイン層はドメインモデルを表現する責務に専念できる。が挙げられます。

また、ドメイン層を隔離するメリットとして

  • 本質的なビジネスの知識を捉えることが可能。

  • プロジェクトが進むごとに、進化しやすい設計。

  • ソフトウェアの技術(htmlやsqlなど)に関係する概念と混同しなくなるので、ドメインを見失うことを避ける。

となります。

以上が「第4章 ドメインを隔離する」のまとめです。

ドメインモデルと実装を一致させるためには、ドメイン層が隔離されていることが重要になってきます。

ぜひ、実際のコードで試してみて、ドメイン層を隔離した時のメリットを実感してもらえたらと思います。