DDD(Domain Driven Design)
- 参考になる書類とのこと。
Domain Driven design Quickly
エリック・エヴァンスのドメイン駆動設計
現場で役立つシステム設計の原則
DDDを導入する心構え
- 大事なのは一方向で依存し合っていることだけ。
- 小さいプロジェクトではオーバースペック気味になる。
- その場合はCQRSなどの利用を考える
DDD(Domain Driven Design)とは
その前に以下を理解しないといけない
- ドメインとは ドメインとは専門領域のこと
具体的に言うと
あなたは航空会社に依頼されて、航空監視システムを作ることになりました。 何から手をつければいいでしょうか? 飛行機のクラスを作るところからでし ょうか? 各飛行場のDBモデルを作るところからでしょうか? そうではないですね。 最初にやらなければいけないのは、実際にどのように航空を監視しているのか知ることです。
業務に対する十分な知識がないまま、システムを構築することは不可能です。 私たちは飛行機が空を飛んでいること以外何も知らないのです。
ではどのように知ればいいでしょうか。 一体、誰が航空監視システムについて一番詳しいでしょうか? それはもちろん、実際に航空会社で働かれている方です。 専門領域の話は専門家に伺うのが一番確実ですね。
- モデリング
ウォーターフォール設計の功績と問題
ざっくばらんに説明すると
- 業務の専門家が要求を書き起こして、それをアナリストへ渡す
- アナリストはそれを元に設計書を作り(モデリング)、それがソフトウェア開発者へと流れて行く
- 開発者が設計書を元に開発を始める というもの
この手法はソフトウェア設計の伝統的な手法で、一定の成果を上げて長く使われてきました。 しかしいくつかの問題を内包しています。
その中のひとつに 専門家からあなたへと、ドメイン(専門領域)知識が直接渡ってきていないことです。 あなたは、アナリストがモデルに落とし込んだ設計書から、実際にしてほしいことを読みとらなければいけないわけです。
設計書通り作っているうちは問題ないですが、実際のシステムが設計の段階で完璧に収まっていることなどあり得ません。 必 ずどこかしらで 「このような状態の時にはどのように振る舞うのが正しいのか」 などの疑問が生まれてきます。
その際、あなたはアナリストへ仕様を伺いに行き、
アナリストは専門家へ何が正しいのかを確認しに行きます。 `まるで伝言ゲームみたいですね。
お互いの関心を共有させるのにもっとも適しているのは、面と向き合って言葉で概念や疑問をぶつけ合うことです。 文字に起こしたり一方通行的な情報フォールだと、知識というのは純度が下がって行きます。 これがウォーターフォール開発が抱えている問題のひとつです。
エリックは上記の問題について 「なら初めから専門家と開発者がミーティングすればよくない?」 と考えました。
これらがDDDの骨幹となっている部分です。
ユビキタス言語とは
開発者と専門家の間では、同じ概念を保持しているが別の名前を持った言葉がいくつも生まれます。
たとえば、漫画ビューワアプリを作成している時に 専門家は「この漫画のこのページにおけるこのコマは」などと話します。 それに対してエンジニアは、聴きながら内面で 「あるcomicに対して、特定のpageでpanelが」なんて思ってるわけです。
つまり、現実のひとつの関心について 専門領域ワード、開発サイドワードと2つの言葉が生 まれてしまっているというわけですね。
この様な事態の解決策として、統一した言葉を用意しようとエリックが提唱したのがユビキタス言語です。
レイヤードアーキテクチャ
レイヤードアーキテクチャはDDD本で言及されている、ドメインを隔離するためのアプリケーションアーキテクチャ。 ドメインモデルが設計に忠実に反映されているかを確認するためには、ソフトウェアを構成する要素のうちドメインを表現する責務を持つ部分がどこかを明確にしなければならない。 そこで、レイヤードアーキテクチャでは以下の4層で責務を分離しています。
層の名前 | 責務 |
---|---|
ユーザインターフェース/プレゼンテーション | ユーザに情報を表示して、ユーザのコマンドを解釈する責務を負う。外部アクターは人間のユーザではなく、別のコンピューターシステムのこともある。 |
アプリケーション | ソフトウェアが行うことになっている仕事を定義し、表現力豊かなドメインオブジェクトが問題を解決するように導く。(中略) ビジネスルールや知識を含まず、やるべき作業を調整するだけで、実際の処理は、ドメインオブジェクトによって直下のレイヤーで実行される共同作業に委譲する。 (後略) |
ドメイン | ビジネスの概念と、ビジネスが置かれた状況に関す る情報、およびビジネスルールを表す責務を負う。ビジネスの状況を反映する状態はここで制御され使用されるが、それを格納するという技術的な詳細は、インフラストラクチャに委譲される。この層がビジネスソフトウェアの核心である。 |
インフラストラクチャ | 上位のレイヤーを支える一般的な技術的機能を提供する。これには、アプリケーションのためのメッセージ送信、ドメインのための永続化、ユーザインターフェースのためのウィジェット描画などがある。インフラストラクチャ層は、ここで示す4層間における相互作用のパターンも、アーキテクチャフレームワークを通じてサポートすることがある。 |
DDD ディレクトリ構成参考
infrastructuresディレクトリ
DDDのアーキテクチャでは、infrastructuresディレクトリはインフラストラクチャ層を表し、データの永続化や外部APIとの通信などの具体的な技術的詳細を扱います。