{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/domain-driven-design-concepts","result":{"data":{"markdownRemark":{"id":"e2c523aa-6006-598d-a804-b1a1a1157e5d","html":"<h2 id=\"はじめに\" style=\"position:relative;\"><a href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" aria-label=\"はじめに permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>はじめに</h2>\n<p>チームで「この開発は DDD でやろう」と言ったとき、「DDD」は同じ意味で使われているでしょうか ?</p>\n<p>人によって「DDD」という言葉の理解は違うと思います。</p>\n<p>この記事には、何が DDD で、何が DDD でないか、自分の考えをまとめました。</p>\n<p>なお、この記事では</p>\n<ul>\n<li>『<a href=\"https://amzn.to/3eOykZa\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">エリック・エヴァンスのドメイン駆動設計</a>』を「DDD 本」</li>\n<li>『<a href=\"https://amzn.to/2ZNetFR\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">実践ドメイン駆動設計</a>』を「IDDD 本」</li>\n</ul>\n<p>と略すことにします。</p>\n<p><a href=\"https://www.amazon.co.jp/dp/B00GRKD6XU/ref=as_li_ss_il?ie=UTF8&linkCode=li1&tag=oshimayuki0d-22&linkId=c63eca2a3cf81bda728766a0a82d6c07&language=ja_JP\" target=\"_blank\"><img border=\"0\" src=\"//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00GRKD6XU&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=oshimayuki0d-22&language=ja_JP\" ></a><img src=\"https://ir-jp.amazon-adsystem.com/e/ir?t=oshimayuki0d-22&amp;language=ja_JP&amp;l=li1&amp;o=9&amp;a=B00GRKD6XU\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\"></p>\n<p><a href=\"https://www.amazon.co.jp/dp/479813161X/ref=as_li_ss_il?ie=UTF8&linkCode=li1&tag=oshimayuki0d-22&linkId=5c660c19de9825dd49c095188defa101&language=ja_JP\" target=\"_blank\"><img border=\"0\" src=\"//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=479813161X&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=oshimayuki0d-22&language=ja_JP\" ></a><img src=\"https://ir-jp.amazon-adsystem.com/e/ir?t=oshimayuki0d-22&amp;language=ja_JP&amp;l=li1&amp;o=9&amp;a=479813161X\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\"></p>\n<h2 id=\"ddd-の全体像\" style=\"position:relative;\"><a href=\"#ddd-%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F\" aria-label=\"ddd の全体像 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DDD の全体像</h2>\n<p>まずはじめに、DDD の世界に登場する概念を分類してみました。</p>\n<p><img src=\"/media/DDD.png\" alt=\"DDD\"></p>\n<p>図の通りですが、<strong>DDD に登場する概念は大きく「戦略的設計」と「戦術的設計」に分かれます</strong>。</p>\n<p>さらに、<strong>戦略的設計は「思想」と「システムの分割・結合」の話、戦術的設計は「レイヤー構成」と「ビジネスロジックの実装方法」の話に分かれます</strong>。</p>\n<p>これらの概要を順に説明していきます。</p>\n<h2 id=\"戦略的設計\" style=\"position:relative;\"><a href=\"#%E6%88%A6%E7%95%A5%E7%9A%84%E8%A8%AD%E8%A8%88\" aria-label=\"戦略的設計 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>戦略的設計</h2>\n<p><img src=\"/media/DDD-strategic-design.png\" alt=\"DDD-strategic-design\"></p>\n<p>戦略的設計は、具体的な細かいテクニックである戦術的設計よりも大局的な話です。</p>\n<p>※ 図にも書いていますが、システムの分割・結合についての話を「戦略的設計」と呼ぶ場合もあるようです。</p>\n<h3 id=\"思想\" style=\"position:relative;\"><a href=\"#%E6%80%9D%E6%83%B3\" aria-label=\"思想 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>思想</h3>\n<p>DDD の思想についてこの記事では詳細に立ち入りませんが、めちゃくちゃざっくり言うと、「<strong>みんなでユビキタス言語を使ってドメインエキスパートと話して、ドメイン知識をそのままソフトウェアで表現しろ</strong>」みたいな話です。</p>\n<p>私の理解では、<strong>この思想が DDD のコアであり、これが抜けている場合は DDD とは呼べない</strong>と思います。</p>\n<p>戦術的設計だけを使うことを「軽量 DDD」と呼ぶことが多いですが、思想が抜けている場合も「軽量 DDD」と言ってしまっていいかもしれません。</p>\n<h3 id=\"システムの分割・結合\" style=\"position:relative;\"><a href=\"#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E5%88%86%E5%89%B2%E3%83%BB%E7%B5%90%E5%90%88\" aria-label=\"システムの分割・結合 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>システムの分割・結合</h3>\n<p><strong>大きなシステムをどこでサブシステム (今風に言うとマイクロサービス) に分割し、どのように結合するか</strong>という話です。</p>\n<p>システムをどこで分割するかはとても難しい話だと思いますが、IDDD 本には、「ユビキタス言語に注目して、言葉の意味が変わったらそこが境界だ」といったヒントが書かれていたりします。</p>\n<p>また、腐敗防止層や共有カーネルといった、システムの結合方法についての論点もあります。</p>\n<h2 id=\"戦術的設計\" style=\"position:relative;\"><a href=\"#%E6%88%A6%E8%A1%93%E7%9A%84%E8%A8%AD%E8%A8%88\" aria-label=\"戦術的設計 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>戦術的設計</h2>\n<p><img src=\"/media/DDD-tactical-design.png\" alt=\"DDD-tactical-design\"></p>\n<p><strong>戦術的設計は、1 つのアプリケーションを具体的にどう実装するかというテクニックの話</strong>です。</p>\n<p>DDD の話になったときにまず最初に出てくるのが戦術的設計ですが、<strong>戦術的設計だけを使うのは「軽量 DDD」というアンチパターンとされることが多い</strong>です。</p>\n<h3 id=\"レイヤー構成\" style=\"position:relative;\"><a href=\"#%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E6%A7%8B%E6%88%90\" aria-label=\"レイヤー構成 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>レイヤー構成</h3>\n<p><strong>コアなロジックを持つドメイン層をいかに隔離するか</strong>という話です。</p>\n<p>DDD 本では「レイヤードアーキテクチャ」が、IDDD 本では「ヘキサゴナルアーキテクチャ」が紹介されていますが、「オニオンアーキテクチャ」や「クリーンアーキテクチャ 」を採用しても構いません。</p>\n<p>要するに、ドメイン層をどうやって分離するかというパターンがいくつかあって、どれを採用するかという話です。</p>\n<h3 id=\"ビジネスロジックの実装方法\" style=\"position:relative;\"><a href=\"#%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95\" aria-label=\"ビジネスロジックの実装方法 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ビジネスロジックの実装方法</h3>\n<p>Entity、Value Object、Aggregate などを使って、<strong>ビジネスロジックをどう実装するか</strong>という話です。</p>\n<p>これは、いつでも必ずこう実装しろという話ではありません。</p>\n<p>ビジネスロジックの実装には</p>\n<ul>\n<li>ドメインモデルパターン</li>\n<li>トランザクションスクリプトパターン</li>\n</ul>\n<p>の大きく 2 つがあります。</p>\n<p>DDD の文脈で説明されるのはドメインモデルパターンで具体的にどう実装するかという話ですが、どちらのパターンを採用すべきかは状況次第です。</p>\n<p>DDD であっても、コアドメイン以外はトランザクションスクリプトで構わないということもよく言われます。</p>\n<h2 id=\"おわりに\" style=\"position:relative;\"><a href=\"#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB\" aria-label=\"おわりに permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>おわりに</h2>\n<p>DDD のコアは「みんなでユビキタス言語を使ってドメインエキスパートと話して、ドメイン知識をそのままソフトウェアで表現しろ」みたいな思想にあると思います。</p>\n<p>とはいえ、戦術的設計が身に付かないまま思想の話をされても具体的に実装するか想像できないと思いますし、まずは戦術的設計から挑戦するのも悪くないと思います。</p>\n<p>私は戦術的設計を使ってみただけでも様々な悩みに遭遇し、その悩みを解決するために Aggregate や CQRS といった要素が必要だということに気付いたとき、自分が一歩スキルアップした気持ちになりました。</p>\n<p>私は DDD でやれと主張するつもりは全然ないのですが、思想として面白いですし、設計力を高める上で参考になる要素が非常にたくさんあるので、勉強する価値は非常に高いと思います。</p>\n<h2 id=\"参考\" style=\"position:relative;\"><a href=\"#%E5%8F%82%E8%80%83\" aria-label=\"参考 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>参考</h2>\n<p>書籍</p>\n<ul>\n<li><a href=\"https://amzn.to/3eOykZa\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">エリック・エヴァンスのドメイン駆動設計</a></li>\n<li><a href=\"https://amzn.to/2ZNetFR\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">実践ドメイン駆動設計</a></li>\n<li><a href=\"https://amzn.to/3cmseB2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">．ＮＥＴのエンタープライズアプリケーションアーキテクチャ　第２版</a></li>\n<li><a href=\"https://amzn.to/32GGu3p\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">「実践ドメイン駆動設計」から学ぶDDDの実装入門</a></li>\n<li><a href=\"https://amzn.to/30DYXLI\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Clean Architecture</a></li>\n</ul>\n<p>Web</p>\n<ul>\n<li><a href=\"https://little-hands.hatenablog.com/entry/2017/09/24/005903\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">なぜDDD初心者はググり出してすぐに心がくじけてしまうのか</a></li>\n<li><a href=\"https://little-hands.hatenablog.com/entry/2019/12/02/cqrs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CQRS実践入門 [ドメイン駆動設計]</a></li>\n</ul>","fields":{"slug":"/posts/domain-driven-design-concepts","tagSlugs":["/tag/ddd/"],"autoRecommendPosts":["ddd-books","483997599X","application-architecture-books","what-is-service-class"]},"frontmatter":{"date":"2020-07-07T12:09:57.839Z","description":"DDD に登場する概念は大きく「戦略的設計」と「戦術的設計」に分かれます。さらに、戦略的設計は「思想」と「システムの分割・結合」の話、戦術的設計は「レイヤー構成」と「ビジネスロジックの実装方法」の話に分かれます。","tags":["ddd"],"title":"「ドメイン駆動設計 (DDD) とは？」を戦略的設計・戦術的設計に分けて理解する","socialImage":null,"recommendPosts":["https://www.kanzennirikaisita.com/posts/ddd-books","https://www.kanzennirikaisita.com/posts/application-architecture-books","https://www.kanzennirikaisita.com/posts/software-developer-books-index"]}}},"pageContext":{"slug":"/posts/domain-driven-design-concepts"}},"staticQueryHashes":["251939775","3942705351","401334301"]}