DDD(Domain Driven Design)
- 参考になる書類とのこと。
Domain Driven design Quickly
エリック・エヴァンスのドメイン駆動設計
現場で役立つシステム設計の原則
DDDを導入する心構え
- 大事なのは一方向で依存し合っていることだけ。
- 小さいプロジェクトではオーバースペック気味になる。
- その場合はCQRSなどの利用を考える
DDD(Domain Driven Design)とは
その前に以下を理解しないといけない
- ドメインとは ドメインとは専門領域のこと
具体的に言うと
あなたは航空会社に依頼されて、航空監視システムを作 ることになりました。 何から手をつければいいでしょうか? 飛行機のクラスを作るところからでしょうか? 各飛行場のDBモデルを作るところからでしょうか? そうではないですね。 最初にやらなければいけないのは、実際にどのように航空を監視しているのか知ることです。
業務に対する十分な知識がないまま、システムを構築することは不可能です。 私たちは飛行機が空を飛んでいること以外何も知らないのです。
ではどのように知ればいいでしょうか。 一体、誰が航空監視システムについて一番詳しいでしょうか? それはもちろん、実際に航空会社で働かれている方です。 専門領域の話は専門家に伺うのが一番確実ですね。
- モデリング
ウォーターフォール設計の功績と問題
ざっくばらんに説明すると
- 業務の専門家が要求を書き起こして、それをアナリストへ渡す
- アナリストはそれを元に設計書を作り(モデリング)、それがソフトウェア開発者へと流れて行く
- 開発者が設計書を元に開発を始める というもの
この手法はソフトウェア設計の伝統的な手法で、一定の成果を上げて長く使われてきました。 しかしいくつかの問題を内包しています。
その中のひとつに 専門家からあなたへと、ドメイン(専門領域)知識が直接渡ってきていないことです。 あなたは、アナリストがモデルに落とし込んだ設計書から、実際にしてほしいことを読みとらなければいけないわけです。
設計書通り作っているうちは問題ないですが、実際のシステムが設計の段階で完璧に収まっていることなどあり得ません。 必ずどこかしらで 「このような状態の時にはどのように振る舞うのが正しいのか」 などの疑問が生まれてきます。
その際、あなたはアナリストへ仕様を伺いに行き、
アナリストは専門家へ何が正しいのかを確認しに行きます。 `まるで伝言ゲームみたいですね。
お互いの関心を共有させるのにもっとも適しているのは、面と向き合って言葉で概念や疑問をぶつけ合うことです。 文字に起こしたり一方通行的な情報フォールだと、知識というのは純度が下がって行きます。 これがウォーターフォール開発が抱えている問題のひとつです。
エリックは上記の問題について 「なら初めから専門家と開発者がミーティングすればよくない?」 と考えました。
これらがDDDの骨幹となっている部分です。
ユビキタス言語とは
開発者と専門家の間では、同じ概念を保持しているが別の名前を持った言葉がいくつも生まれます。
たとえば、漫画ビューワアプリを作成している時に 専門家は「この漫画のこのページにおけるこのコマは」などと話します。 それに対してエンジニアは、聴きながら内面で 「あるcomicに対して、特定のpageでpanelが」なんて思ってるわけです。