Software Architecture - DDD と アーキテクチャ にまつわるエトセトラ

## 要約 / inb4 tl;dr

- DDD（ドメイン駆動設計）について調べ始めたら、解説記事でお腹いっぱいになった。
- 更に、一緒に語られるアーキテクチャも整理したい欲が出てきた。
  - Layered Architecture
  - Layered Architecture with DIP (Dependency inversion principle)
  - Hexagonal Architecture
  - Onion Architecture
  - Clean Architecture
- こういった経緯で、元になった書籍や記事をまとめてみた。
  - ちょっとしたまとめも書いた

## はじめに

『[ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本](https://amzn.to/2VFuaNm)』 を読んで DDD入門をしてみて、ボトムアップで作り上げるときの アーキテクチャ に興味が湧き、今後、調べていくに当たって最初に見るべきであろう情報をまとめてみました。
言葉や単語として知ってはいても、手を動かして表現出来るほど理解出来ていないことが多いので、そこに繋げられるよう理解していきたいところです。

## 原典に当たれ

### 原典となる書籍やWebサイトのまとめ

原典となった（と思われる）書籍やWebサイトを下表にまとめました。

|Year|Image|Article|
|:--:|:--:|:--|
|1996/7/12|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/028205e8-6dba-f6fe-eb9b-28b9f1bb53db.png">|# Book<br>[Pattern-Oriented Software Architecture Volume 1: A System of Patterns by Frank Buschmann (12-Jul-1996) Hardcover](https://www.amazon.com/Pattern-Oriented-Software-Architecture-Buschmann-12-Jul-1996/dp/B012HU4VAU)<br><br># Memo<br>Evans の DDD本 で Layered Architecture に関する Pattern にまつわる文脈で言及されている。|
|1999/3/15|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/4a75a141-e385-50d8-ec85-1bb055a31c3b.png">|# Book<br>[Use Case Driven Object Modeling with UML: A Practical Approach](https://amzn.to/2Q1phKW)<br>Kendall Rosenberg, Doug Scott (著)|
|2000/12/7|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/62263707-302a-2d30-4fe1-40fafb3a7282.png">|# Book<br>[Pattern-Oriented Software Architecture, A System of Patterns](https://amzn.to/2wHQVps)<br>Frank Buschmann  (著), Regine Meunier (著), Hans Rohnert (著), Peter Sommerlad (著), Michael Stal (著)<br><br>#memo<br>1996年発行された書籍の改定版？|
|2001/11|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/10388f9c-ce02-3078-7398-cb5412ef5275.png">|[ユースケース入門―ユーザマニュアルからプログラムを作る (Object Technology Series)](https://amzn.to/2wLDR2I)<br>ダグ ローゼンバーグ (著), ケンドール スコット (著), Doug Rosenberg (原著), Kendall Scott (原著), 長瀬 嘉秀 (翻訳), 今野 睦 (翻訳), テクノロジックアート (翻訳)<br><br># memo<br>この書籍が ICONIX を日本に初めて紹介した|
|2003/8/22|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/9ce818a7-5cdd-75b3-b851-2cb386feda59.png">|# Book<br>[Domain-Driven Design: Tackling Complexity in the Heart of Software](https://amzn.to/3cMaFJs)<br>Eric Evans (著)<br><br># Memo<br>DDDの原点。|
|2005/04/01|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/00eda209-e5d0-08d0-588d-54640223d139.png">|# Web<br>[Hexagonal architecture (Archived)](https://web.archive.org/web/20180822100852/http://alistair.cockburn.us/Hexagonal+architecture)<br>Alistair, Cockburn<br><br># Memo<br>Hexagonal Architecture についての最初の記事。本家は工事中（2020/03/10 現在）のため、アーカイブを参照のこと。|
|2007/x/x|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/eb4d30af-169f-9494-8752-aadb6f122f2a.png">|# Book<br>[Use Case Driven Object Modeling with UMLTheory and Practice](https://www.apress.com/jp/book/9781590597743)<br>Theory and Practice<br>Authors: Rosenberg, Don, Stephens, Matt|
|2007/10/16|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/243b1de9-05c6-e728-9e44-4efe4053cc24.png">|# Book<br>[ユースケース駆動開発実践ガイド](https://amzn.to/2TAA8hm)<br>ダグ・ローゼンバーグ (著), マット・ステファン(著), 三河淳一 (翻訳), 佐藤竜一 (翻訳), 船木健児 (翻訳)<br><br># memo<br>「ロバストネス分析」と「ICONIXプロセス」を使用したユースケース駆動開発について解説している。|
|2008/5/15|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/0cb550b9-acd9-4b9d-1f4b-e977dda20849.png">|# Book<br>[Use Case Driven Object Modeling with UMLTheory and Practice](https://amzn.to/3309tgY)<br>Don Rosenberg (著), Matt Stephens  (著)|
|2008/7/29|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/5550a629-bf1e-f166-bcde-996080aeb2a5.png">|# Web<br>[Tag Archives: onion architecture](https://jeffreypalermo.com/tag/onion-architecture/)<br>Jeffrey Palermo<br><br># memo<br>Onion architecture についての最初の記事。４つの記事からなる。|
|2011/4/8|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/f95bdb70-7df4-4aa1-e728-f4f395613deb.png">|# Book<br>[エリック・エヴァンスのドメイン駆動設計](https://amzn.to/2Q19ThE)<br>Eric Evans (著), 和智右桂  (翻訳), 牧野祐子 (翻訳), 今関剛 (監修)<br><br># memo<br>約8年を経て邦訳された Evans 本。|
|2012/8/13|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/251392ed-42bc-0bf3-093d-c4e446c63328.png">|# Web<br>[The Clean Architecture - The Clean Code Blog](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)<br>by Robert C. Martin (Uncle Bob)<br><br># memo<br>Clean Architecture のエッセンスについて記載されたWeb記事。最初に言及された記事。|
|2013/2/6|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/595fb83d-ab0e-9708-b923-05d05df12b0b.png">|# Book<br>[Implementing Domain-Driven Design](https://amzn.to/2Q17tQl)<br>Vaughn Vernon  (著)<br><br># memo<br>Evans 本に記載された DDD の概念を実装するための事例を紹介した書籍（？）<br>DDD に対し、 IDDD と表現されることが多い。|
|2013/10/1|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/4564b312-2e64-65fb-6fb5-150327c2bbc1.png">|# Book<br>[モデルベース要件定義テクニック](https://amzn.to/38BHl51)<br>神崎善司 (著)|
|2015/3/16|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/acb5cc96-f926-33e4-2dde-5ea18e3fc407.png">|# 書籍<br>[実践ドメイン駆動設計](https://amzn.to/330DGfI)<br>ヴァーン・ヴァーノン  (著), 高木正弘 (翻訳)<br><br># memo<br>IDDD本の邦訳。|
|2015/10/05|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/07e370e4-4359-9eff-2bb5-89ec32d6d1b3.png">|# 書籍<br>[クリーンアーキテクチャ(The Clean Architecture翻訳) - blog.tai2.net](https://blog.tai2.net/the_clean_architecture.html)<br><br># memo<br>3年を経て翻訳された クリーンアーキテクチャ のWeb記事。|
|2015/10/09|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/77618965-1b7d-d0bb-48aa-0702abfa4295.png">|# Web<br>[ヘキサゴナルアーキテクチャ - blog.tai2.net](https://blog.tai2.net/hexagonal_architexture.html)<br><br># memo<br>10年を経て邦訳された ヘキサゴナルアーキテクチャ のWeb記事。|
|2017/9/12|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/ef0ae41a-3ad7-d903-8aef-4bd477eb0e96.png">|# Web<br>[Clean Architecture: A Craftsman's Guide to Software Structure and Design](https://amzn.to/2TAIkhG)<br>Robert C. Martin  (著)<br><br># memo<br>エッセンスのみのシンプルなWeb記事に対し、詳細な解説を盛り込んだ書籍。|
|2018/8/1|<img width="100px" alt="img" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/049e9797-8915-fe58-a136-12fc378ebabd.png">|# 書籍<br>[Clean Architecture　達人に学ぶソフトウェアの構造と設計](https://amzn.to/2va7Ctw)<br>Ｒｏｂｅｒｔ Ｃ．Ｍａｒｔｉｎ (著), 角 征典  (著), 高木 正弘 (著)|


### 用語

部分的に単語もまとめてみました。

|単語|意味|
|:--|:--|
|YAGNI|You ain't gonna need it<br>機能は実際に必要となるまでは追加しないのがよいとする、エクストリーム・プログラミングにおける原則<br>[YAGNI - Wikipedia](https://ja.wikipedia.org/wiki/YAGNI)|
|ロバストネス分析|詳細設計の前に実施する予備設計<br>予備設計をすることによってシーケンス図やクラス図を作成するときに仕様の詳細について調べたり考えたりする時間を省略することができる。<br>ロバストネス図作成時に、ユースケース記述上の足りない観点や疑問点を洗い出し、完全なユースケース記述に近づけ<br>[ロバストネス分析の目的 - Qiita](https://qiita.com/reoring/items/d3c5bb9506386404b297)|
|ICONIXプロセス|ラショナル統一プロセス（RUP）、エクストリーム・プログラミング（XP）、及びアジャイルソフトウェア開発よりも前から存在するソフトウェア開発方法論<br>4ステップのプロセスでただ4つのUML図を使用して、ユースケース記述を動作するコードに変換する。<br>(ICONIX - Wikipedia](https://ja.wikipedia.org/wiki/ICONIX)|
|RUP|Rational Unified Process<br>ラショナル統一プロセス (Rational Unified Process; RUP) とは、IBM社ラショナルブランドのオブジェクト指向型ソフトウェア開発プロセス、およびその製品のことを指す。<br>[ラショナル統一プロセス - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E7%B5%B1%E4%B8%80%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)|
|オブジェクト指向分析／設計|OOAD ( object-oriented analysis and design )<br>ソフトウェア工学において、ソフトウェア (システム) を相互作用するオブジェクトの集まりとしてモデル化 (オブジェクト指向モデリング) する、オブジェクト指向に基づくソフトウェア開発の方法である。<br>Cite From: [オブジェクト指向分析設計 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E5%88%86%E6%9E%90%E8%A8%AD%E8%A8%88)|
|ドメインモデリング|システムに関わるさまざまな実体とそれらの関係を説明するシステムの概念モデルである。<br>システムの鍵となる概念と用語を文書化するために作成される。<br>システムの主要な実体とそれらの間の関係を明らかにし、一般にそれらの重要なメソッドと属性も洗い出す。<br>[ドメインモデル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A2%E3%83%87%E3%83%AB)|
|DTSTTCPW|Do The Simplest Thing That Could Possibly Work<br>[Do The Simplest Thing That Could Possibly Work](http://wiki.c2.com/?DoTheSimplestThingThatCouldPossiblyWork)|
|TDD|Test Driven Development<br>テスト駆動開発|
|DDT|Design Development Test<br>設計駆動テスト|
|プラガブル|（プラグで）接続可能な<br>pluggableの意味・使い方・読み方 | Weblio英和辞書<https://ejje.weblio.jp/content/pluggable>|
|イテレーション|反復、繰り返しという意味の英単語。<br>[イテレーション（イテレート）とは - IT用語辞典 e-Words](http://e-words.jp/w/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html)|
|CASEツール|computer aided software engineering / ケース / コンピュータ支援ソフトウェア工学<br>ソフトウェアライフサイクル・プロセス（分析・設計・開発・保守）を支援するツールの総称<br>対応するプロセスに応じて、上流CASEツール（分析・設計など）、下流CASEツール（開発・テストなど）、保守CASEツール（リエンジニアリングなど）に大別される。<br>[CASE（しーえいえすいー） - ITmedia エンタープライズ](https://www.itmedia.co.jp/im/articles/1109/09/news128.html)|
|Booch法|1990年頃にグラディ・ブーチによって開発されたオブジェクト指向ソフトウェア開発方法論のこと。<br>『Booch法:オブジェクト指向分析と設計』 (原著初版は1991年刊、原著第2版は1993年刊、第2版日本語訳は1995年刊) でBooch法が説明されている<br>Booch法の記法は UML の起源の一つである<br>[Booch法 - Wikipedia](https://ja.wikipedia.org/wiki/Booch%E6%B3%95)|
|OMT|オブジェクトモデル化技法 (Object Modeling Technique)<br>オブジェクト指向ソフトウェア開発方法論であり、1990年頃にジェームズ・ランボー、マイケル・ブラハ、ウィリアム・プレメラニ、フレデリック・エディ、ウィリアム・ローレンセンなどの人々によって開発された。<br>[オブジェクトモデル化技法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB%E5%8C%96%E6%8A%80%E6%B3%95)|
|Objectory|Objectoryは、主にオブジェクト指向ソフトウェアエンジニアリングに大きく貢献したIvar Jacobsonによって作成されたオブジェクト指向の方法論<br>[Objectory - Wikipedia](https://en.wikipedia.org/wiki/Objectory)|

### まとめてみた感想

- **Layered Architecture** に関する代表的な書籍や記事は見つからなかった。
  - 2000年の段階で経験的に構築され、デファクト・スタンダードになっていた模様。
     - 次の2つがまずは参考になりそう。
     - 書籍： Pattern-Oriented Software Architecture, A System of Patterns
     - 書籍： エリック・エヴァンスのドメイン駆動設計
- **Clean Architecture** の書籍が出たのが思っていたより最近だった。
- パターンやソフトウェアアーキテクチャ、特に Layered Architecture をベースとした考えがまとまってきたのが、思ったより最近（2000年頃）だった（ように見える）。
  - 2000年より前は、アプリケーションというよりも、広い意味でのソフトウェアの文脈（ネットワークやサーバ構成含む）で語られていた？
     - 「Pattern-Oriented Software Architecture, A System of Patterns」では、 Layered な代表例として OSI参照モデルの例が出てくる。

## 個人的な気付き

### レイヤードアーキテクチャ / Layered Architecture

|項目|内容|
|:--|:--|
|名称|- レイヤードアーキテクチャ<br>- レイヤー化アーキテクチャ<br>- Layered Architecture|
|出典|原典：ない？<br>日本語訳：ない？|
|メモ|経験的に構築された概念であり、ソフトウェア開発の文脈において明確に定義している著名な文献は存在しない？|

- "Pattern-Oriented Software Architecture, A System of Patterns (Aug. 2000)" では、 "Architectual Patterns" の中で、 "Layers" という節で以下の３つの図を用いて説明している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/bf7e0648-0dd2-b94e-76d6-9564dbbe32a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/019f8e3a-8c21-37a4-2008-85ac62d3fdaf.png)

- "Domain-Driven Design: Tackling Complexity in the Heart of Software (Aug. 2003)" では、**"Layered Architecture"** として以下の図を用いて説明している。（図は邦訳版）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/f8eb62fa-9e7b-b8a6-aeaf-19a89672f443.png)

- 純粋に書き起こすと、ディレクトリ構成は下図のようになるはず。

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/3f513451-e31c-9edf-5ce6-f716793ac89a.jpeg)

### ドメイン駆動設計 / DDD : Design-driven development

|項目|内容|
|:--|:--|
|名称|- ドメイン駆動設計<br>- DDD : Design-driven development|
|出典|原典：[Domain-Driven Design: Tackling Complexity in the Heart of Software](https://amzn.to/3cMaFJs)<br>日本語訳：[エリック・エヴァンスのドメイン駆動設計](https://amzn.to/2Q19ThE)|
|メモ|言わずもがな。20年経ったいまも色褪せない。|

- **[DDD Reference](https://domainlanguage.com/ddd/reference/)** では **"Pattern Language Overview"** として下図が紹介されている。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/b2aadd54-a5c8-de2b-c2f7-861ddaf36a55.png)<br>Pattern Language Overview - Domain-Driven Design<br>Definitions and Pattern Summaries by Eric Evans Domain Language, Inc.<br>Microsoft Word - pdf version of final doc - Mar 2015.docx](https://domainlanguage.com/wp-content/uploads/2016/05/DDD_Reference_2015-03.pdf)

- **[DDD Reference](https://domainlanguage.com/ddd/reference/)** には DDDのエッセンスが詰まっていそう。

### ヘキサゴナル・アーキテクチャ / Hexagonal architecture

|項目|内容|
|:--|:--|
|名称|- Hexagonal architecture<br>- Ports & Adapter<br>- Ports and Adapters|
|出典|原典：[Alistair.Cockburn.us - Hexagonal architecture](https://web.archive.org/web/20180822100852/http://alistair.cockburn.us/Hexagonal+architecture)<br>日本語訳：[ヘキサゴナルアーキテクチャ - blog.tai2.net](https://blog.tai2.net/hexagonal_architexture.html)|
|メモ|『 Ports and Adapters 』は、業務系や大規模なシステムにおいて、保守性（拡張性やテスト容易性）を確保するために、アプリケーションとそれ以外を接続する **Port と Adapter** という概念を示した。 FIT と呼ばれるコードサンプルも紹介されているが、汎用的に使用できるものではなかったようにみえる。|

- 「ヘキサゴナル・アーキテクチャ」の「ヘキサゴナル（六角）」にあまり意味はない。
- 『 Ports and Adapters 』の方がアーキテクチャの意図を上手く表している。
- 下図のうち、「Application」を取り巻く 「黒い六角形の線」 も、実は重要な意味を持っている。
- 「黒い六角形の線」は、 「Use Case Boundary」 として表現されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/9c276d44-550e-530e-6a23-d9e997bb8323.png)

- 上の図は、以下のように、「１つのポートに、複数のアダプターが存在する」ことを意味している。
- つまり、「Use Case Boundary」には、複数のポートが存在し、ポートは、六角形の一辺で表されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/f47d99e2-8228-0f94-3dea-cade58eedbef.png)

- また、構成要素全体の関係は下図のようになっている（ようだ）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/e9f36949-45fd-d7cd-0756-bfae4c5e35b4.png)

- 個人的には、以下のような図の方が分かりやすい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/2aeb170c-f5dc-8e2a-c070-44867fcf48ac.png)

- 全体を通して、概念や意図は共感するが、実装イメージが付きづらい。
- なお、IDDD本（実践ドメイン駆動設計 - ヴァーン・ヴァーノン）には以下のような図があり、本文中でも「ヘキサゴナルアーキテクチャ」という単語が頻出する。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/18fe386c-7b51-4f66-1b04-891af6ae4b7a.png)<br><br>実践ドメイン駆動設計 - ヴァーン・ヴァーノン (著), 高木正弘 (翻訳)](https://amzn.to/38AvljZ)

- 純粋に書き起こすと、ディレクトリ構成は下図のようになるはず。

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/515be44a-fd9e-3ad8-a58e-125f5cf5baff.jpeg)


### オニオン・アーキテクチャ / Onion Architecture

|項目|内容|
|:--|:--|
|名称|Onion Architecture|
|出典|原典：[Tag Archives: onion architecture - Jeffrey Palermo](https://jeffreypalermo.com/tag/onion-architecture/)<br>日本語訳：ない？|
|コード|[jeffreypalermo / onion-architecture — Bitbucket](https://bitbucket.org/jeffreypalermo/onion-architecture/src/default/)|
|メモ|ヘキサゴナル・アーキテクチャと同じ思想を共有しながら、より実践的な内容に落とし込まれたアーキテクチャ。<br>伝統的な レイアードアーキテクチャとの比較や、 .NET などを例にしたクラス構成例があるため、実装に落とし込みやすそう。<br>IDDD本では、「ヘキサゴナルアーキテクチャを言い換えた残念なものにしか見えなかった」との言及があり、評価は分かれるみたい。|

- 原文中に、ヘキサゴナルアーキテクチャに対する言及がある。
  - 共有する前提として、「インフラストラクチャーの外部化」がある。
- IoC コンテナを利用した具体的な実装方法の解説がある。
- オニオンアーキテクチャを平坦化した記事をよく見るが、原文でもそのような図を用いて解説されている。
- 原文の日本語訳はない？
- （以下の図が紹介されているが、色が同系色過ぎて見づらい。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/c210b19d-8954-3163-4a0c-9e90f1daca8c.png)

- 意図が分かりやすいように図を作ると下図のようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/29687734-d3bd-a660-0a48-4bf25af8daf3.png)

- 上記の感じで、掲載されていた図を色分けしながら再作成した。

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/0c4f0b2e-ae80-ddac-73e4-196fae031238.jpeg)

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/3f42522e-1a53-7cee-8352-99a4ccfeffce.jpeg)

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/73eecb04-fe24-8109-4852-78a6bf2955bc.jpeg)

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/36d67bd3-37cc-9304-702d-47cc59401ee5.jpeg)


- 教義とされている以下の４つのポイントは非常に重要である。
  - 特に４つ目の、 **『すべてのアプリケーションコアコードは、インフラストラクチャとは別にコンパイルおよび実行できます』** はとても大きな気付きだった。
     - 成瀬さんがなせ、『[ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本](https://amzn.to/2VFuaNm)』の中で、インフラのコードを別けていたのか、これで理解できた気がする。

> オニオンアーキテクチャの主な教義：
- アプリケーションは、独立したオブジェクトモデルを中心に構築されます
- 内層はインターフェースを定義します。外層はインターフェースを実装します
- カップリングの方向は中心に向かっています
- すべてのアプリケーションコアコードは、インフラストラクチャとは別にコンパイルおよび実行できます。

- Domain や Model 、 Application がどういう定義で使われているかは分からないが、「DDDパターンなしでも機能する」旨の記載がる。（Part.4）
- ただし、用語としては、DDDの言葉と同義と捉えても問題なさそう。
- 純粋に書き起こすと、ディレクトリ構成は下図のようになるはず。

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/f356e59e-8613-cf0a-a129-9b139e1c4632.jpeg)


### クリーン・アーキテクチャ / Clean Architecture

|項目|内容|
|:--|:--|
|名称|Clean Architecture|
|出典|原典：[The Clean Architecture - The Clean Code Blog](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)<br>日本語訳：[クリーンアーキテクチャ - blog.tai2.net](https://blog.tai2.net/the_clean_architecture.html)|

- 有名なのは以下の図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/56d7cd90-29f8-080f-ae7f-26f7763cce71.png)<br>引用：The Clean Architecture 13 August 2012 - Clean Coder Blog
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

- 書籍には以下の図も紹介されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/38a678d6-0c51-618e-add7-171d7e0a4993.png)

- 上の２つの図は関連して捉えることができ、色分けすると下図のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/4f1a21d9-fd4b-501f-a9c0-738369ddb4ab.png)

- 純粋に書き起こすと、ディレクトリ構成は下図のようになるはず。

![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/8fa55e9c-d72b-0cd2-ad1f-4903b2ba7598.jpeg)


### 全体を通して

- DDDや各種アーキテクチャの採用は、中規模以上のシステムにおいて有効であり、簡単なWebアプリ開発での採用は足を遅くするだけ。
  - 「中規模」の定義は、、、？
     - LPサイトや単発のシステムは不要かもしれない。
     - 簡単な便利ツールも恐らく不要。
     - 数年単位で運用され、システム拡張が頻繁に行われそうなものは採用した方が良い。
     - ビジネスアプリケーションは言わずもがな（採用した方が良い）。
- 「DDD で取り敢えず作ってみる」なら、「オニオンアーキテクチャ」と「クリーンアーキテクチャ」が良さそう。
  - オニオンアーキテクチャ
      - [ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本](https://amzn.to/2VFuaNm)
         - →この書籍を一番最初にやるとボトムアップ（コード）から分かるので良い。
         - →手前味噌：[Laravel - 『ドメイン駆動設計入門』を読んで Laravel を使って実装してみた - Qiita](https://qiita.com/anfangd/items/fea7735a9c81983b5426)
      - [[DDD]ドメイン駆動 + オニオンアーキテクチャ概略 - Qiita](https://qiita.com/little_hand_s/items/2040fba15d90b93fc124)
      - [ドメイン駆動設計 モデリング/実装ガイド - little-hands - BOOTH](https://little-hands.booth.pm/items/1835632)
  - クリーンアーキテクチャ：
      - [実装クリーンアーキテクチャ](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)
      - [実践クリーンアーキテクチャ](https://nrslib.com/clean-architecture/)

## メモ

- どのような時代背景からこれらのアーキテクチャが生まれてきたかが理解できると、それぞれのアーキテクチャの意図や目指すところがより理解出来そう。

## おわりに

- 「オニオンアーキテクチャ」と「レイヤードアーキテクチャ」の詰めが甘いので、もう少し調べて増強する予定。

## 参考

- [DDDからみた基盤となるアーキテクチャ • masu-mi's blog(Dirty Cache)](https://blog.masu-mi.me/post/2019/01/17/arch-as-basis-from-ddd/)
- [Laravel - 『ドメイン駆動設計入門』してみて Clean な世界を垣間見た話し - Qiita](https://qiita.com/anfangd/items/dc824c9768a3731045e1)