little hands' lab

ドメイン駆動設計、アジャイルプラクティスを実践し、解説しています。

新卒にも伝わるドメイン駆動設計のアーキテクチャ説明(オニオンアーキテクチャ)[DDD]

ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か
ドメイン駆動 + オニオンアーキテクチャ概略

以前こちらの記事でアプリケーションアーキテクチャについて書きました。
こちらの記事では比較的ネタ元に忠実な解説をしたのですが、実際これに基づいて人にレイヤの説明をした際、依存性の逆転部分や円形で表現する部分がなかなか伝わりにくいことがありました。

そんな中で、所属プロダクトで新卒含めて大規模なリニューアル案件でDDDを採用することになり、新卒にも伝わるように説明をする必要性が生じました。
結果、新卒にも伝わり、運用が割と回る説明が見つかったのでご紹介したいと思います。

アプリケーションアーキテクチャ全体図

とにかく、何か説明する際はこの図を常に傍に置き、一方通行の依存性を徹底したい、という話をしています。
何かについて議論をする際は、 「それはどの層の責務なの?」 という話をして、この図を元に「ではここに書かないといけないね」 という話をしています。

特に、ドメインモデル図にドメインの振る舞いを書いたあと 「この知識はUseCaseではなくDomain層に書きたいから、UseCaseに書いたらリファクタしよう」 ということは繰り返し伝えています。(UseCaseレベルのテストがあればあとはなんとでもリファクタできます)

徐々に伝わってくると、「これはドメインの知識なのでドメイン層に・・・」という会話が徐々に生まれてきてくれました。

(オニオンアーキテクチャとか、細かい話をするのは一旦やめました。笑)

以前の図との変更点

参考までに書いておくと、

・ApplicationServiceという呼称をUseCaseに変更した ・Infra層からDomain層への依存を実装の矢印で表現した
・Domain層をModelとServiceに分けるのはやめて一つにした
・登場要素をマッピングした

あたりが変更点です。

ApplicationServiceという呼称をUseCaseに変更した点については、「これはApplicationの関心ごとだよね」と言ってもApplicationが多義語すぎて人によって解釈がブレてしまったのに比べて、「ドメインの知識はDomain層に、ユースケースの実現はUseCase層に」という説明の方が伝わりやすかったためです。なお、ApplicationServiceは元々オニオンアーキテクチャの呼称、UseCaseというのはCleanArchitectureの呼称なので、ここだけはCleanArchitectureのエッセンスを取り入れた形になります。

Infra層からDomain層への依存を実装の矢印で表現した点に関しては、やはり以下の図では依存の形がイメージしにくかったためです。

これで何を指すのかがだいぶ一目で伝わりやすくなりました。

後からの補足として、依存関係逆転の説明

依存性逆転の法則については、実装を少ししてイメージが湧いた段階になってから、こんな説明をしました。

デメリットの

・DB変更のたびにEntityやUseCaseを変更する可能性がある
・DBの都合に引きずられた実装になる

あたりについて、新しいアーキテクチャの実装イメージが湧き、そうではないアーキテクチャでの苦しい経験が思い出されるようになると、「確かに〜」と納得してもらえるようになりました。

使い道

これを見てすぐにDDDの実装ができるようになる訳ではありませんが、議論のベースに可視化された一枚絵があるのはとても便利に感じます。そう言った使い身としてでもお役に立てると幸いです。

もっと詳しく知りたい方は

little-hands.booth.pm

初めてDDDを学ぶ方、もしくは実際に着手して難しさにぶつかっている方向けの書籍を出しました。
迷子になりがちな「DDDの目的」や「モデル」の解説からはじめ、 具体的なモデリングを行い実装まで落とす事例を元に、DDDの魅力や効果を体感することを目指します。

この本の「第5章 アーキテクチャ」では、本ブログ記事の内容に加えて、他のアーキテクチャと比較しながらさらに詳しく解説しています。 よろしければお求めください。


また、実践にあたって頻出の疑問に対してトピックごとに詳しく解説した書籍があります。

重要トピック「モデリング」「集約」「テスト」について詳細に解説し、その他のトピックでは頻出の質問への回答と具体的なサンプルコードをふんだんに盛り込みました。現場で実践して、困っていることがある方はぜひこちらもご覧ください。

little-hands.booth.pm

現場での導入で困ったら

DDDを導入しようとすると結構試行錯誤に時間がかかります。
現場で導入してすぐに効果を発揮したい!!という方向けに、基礎解説とライブモデリング/コーディングを行う勉強会の開催や、設計相談を受付ております。
事例紹介もあるのでご関心あれば覗いてみてください。開催形式は柔軟に対応できるのでお気軽にご相談ください。

little-hand-s.notion.site

Twitterでも、DDDに関して発信したり、「質問箱」というサービスを通じて質問を受け付けています。こちらもよろしければフォローしてください

https://twitter.com/little_hand_s

また、YouTubeで10分でわかるDDD動画シリーズをアップしています。概要を動画で理解したい方はこちらもどうぞ。チャンネル登録すると新しい動画の通知を受け取ることができます。