DDD本を読むためには前提知識が非常に多いよ

# 初めに
---
## きっかけ
- 新人研修中にDDDとか、PoEAAとかの話が少しだけ出ました。
- ただ、イマイチわからないとの声が多数。
## 理由
- なぜなら予備知識がたくさん必要だからです。(ほんとに多い)
- これはわからなくて当然。
---
## そこで
- 独断と偏見で、予備知識となる用語を解説します。
- 偏見多いので、より正確な情報は、書籍やWebで調べてね。
## この辺を説明します
- UML
    - クラス図/シーケンス図
- デザインパータン
    - GoF/PoEAA
- 階層化アーキテクチャ
- DDD本のサマリ
---
## 知らなきゃいけない知識が多くて面倒だね。
---
## 説明しないけど、オブジェクト指向やデータベースとかの知識も必要だよ。
---
# 説明前にDDD本のページを見てみよう！！！
---
## DDD本の最初のページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/2ef26f19-d866-1187-049f-628e4e0ecc07.png)
「エリック・エヴァンスのドメイン駆動設計」より

---
# ??? よくわからないね
---
# さっきの図って何?
- 灰色の中心部分はソフトウェア設計のモデリングを表しています。
    - モデリングとは図や文字でソフトウェアを表すこと。
    - その中でUMLという物が出てきます。
- その他はソースコードの構造や文法。
    - ソースコードを実装していると、良く使う構造や文法が出てくる。
    - それらを「アーキテクチャ」「デザインパターン」と呼びます。
---
# UML
---
# UML(Unified Modeling Language)って何?
- オブジェクト指向プログラミングが出てきた当たりで流行ったモデリング言語です。
    - モデリング言語は「図」や「テキスト」を使ってソフトウェアを表現します。
    - **基本設計~詳細設計**でよく使われます。設計書出よく出てくる図ですね。
- このUMLですが
    - 「実装面倒だな...設計図書いたらシステム出来上がってくれないかな」
    - 「そういうの作ればいいんじゃね」
    - 「コード自動作成機能って良いよね」
- という流れもあって、ソースコードを自動生成する仕様(Model Driven Architecture：MDA)も追加されましたが...
---
## 仕様、制約が増大して「ソースコードを書いた方が早い」となってしまいました...
---
## この手の試みは「ワークフロー自動化」「ランブック自動化」「ノーコード」と名前を変えて、ゾンビのように復活するよ。
---
## クラス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/ed969118-e431-f599-c77f-b16a2c958c27.png)
「エリック・エヴァンスのドメイン駆動設計　7章 言語を使用する：応用例」より

クラス図の詳細はこちらを参照：https://www.itsenka.com/contents/development/uml/class.html

---
## シーケンス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/4ca41e30-2c4c-34e3-8f12-c7cf35ad4a8f.png)
「エリック・エヴァンスのドメイン駆動設計　9章 暗黙的な概念を明示的にする」より

シーケンス図の詳細はこちらを参照：https://www.itsenka.com/contents/development/uml/sequence.html

---
# デザインパターン
---
## デザインパターンって何?
- オブジェクト指向における、使い勝手の良いソースコードのサンプル集みたいな物。
    - 単に「デザインパターン」と言うときは、「GoFデザインパターン」を指します。
    - **詳細設計~実装**に関する技術になります。間接的に**基本設計**に関連するところも。
- 結構古い(GoF:1994年, PofEAA:2002年)ものなので、陳腐化しているものもあります。
    - 推奨されなくなった物(Singleton)や、そもそも実装が複雑で定義が曖昧だったりします。
    - 一部は言語/フレームワークの仕様として取り込まれてます。(Iterator/Decorator)
- また、GoF/PofEAAで使われるのはほとんどがJavaのコードです。
    - Javaの言語仕様が、頭に入っていないと意味不明なところがあります。
---
## GoF(Gang of Four)デザインパターン
- 「オブジェクト指向における再利用のためのデザインパターン」という本に記載されています。
    - Gang of Fourは4人組という意味で、著者が4人いるため、そう呼ばれています。
    - DDD本内で事前説明無しで、この用語が頻発するので調べておいたほうが無難。
## PofEAA(Patterns of Enterprise Application Architecture)
- GoFとは別著者、マーティン・ファウラーさんが書いた同名の本で紹介されたデザインパターン
    - DDD本の中で詳しく説明しているので読まなくても、なんとなくわかる。
    - DDDとPofEAAで、同じ用語で意味が全く違うものがあるので紛らわしいです。
    - 日本語訳がひどいらしい。パターンカタログを軽く読むくらいなら良いかも。(参考文献みてね)

---
# 例えばPofEAAの「ドメインモデル」は、DDDの「ドメインモデル」と微妙に意味が違うよ。面倒だね。
---
## Facadeパターン(GoF)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/e37843b2-4cba-2573-e42c-b50efc94ee28.png)
Facadeパターンの詳細はこちらを参照：https://www.techscore.com/tech/DesignPattern/Facade

---
## FactoryMethodパターン(GoF)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/d0d3b9c9-1e34-53a6-5047-2f71be61e211.png)
FactoryMethodパターンの詳細はこちらを参照：https://www.techscore.com/tech/DesignPattern/FactoryMethod

---
# 階層化アーキテクチャ
---
## 階層化アーキテクチャ(Layered Architecture)
- 名前の通り、階層ごとにモジュールなどで分割されたソフトウェア構造、設計を指します。
    - 「n階層アーキテクチャ」や「多層アーキテクチャ」と言われたりします。
    - もともとJava EEアプリでよく使われてた概念
    - **基本設計から実装**に関する技術で、アプリ内の構造に着目しています。
- 階層構造をとるアーキテクチャはほかにも色々
    - クリーンアーキテクチャ
    - オニオンアーキテクチャ
---
# 既存のフレームワークの構造を考慮しないと、導入しても死んじゃうから慎重にね。
---
## DDD本の階層化アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/6f76191b-0651-c452-739b-1c7011bdebc2.png)
「エリック・エヴァンスのドメイン駆動設計　4章 ドメインを隔離する」より

---
## DDD本の階層化アーキテクチャ(説明)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/a71acc0c-8be7-55f2-66cb-0ed1fef6543a.png)
「エリック・エヴァンスのドメイン駆動設計　4章 ドメインを隔離する」より

---
# DDD本のサマリ
---
## ドメイン駆動設計(DDD)、用語ざっくり解説
- ドメインって何？
    - ここで言うドメインは「業務領域」を指していて、業務に関する知識や情報、フローを含む。
- モデルって何？
    - ドメインを表すための、図やテキストを指す。雑に言うと設計書みたいなもの。
- ドメインモデルって何？
    - ドメインを書いたモデル。ドメインを理解するための考え方。
- ドメインエキスパートって誰？
    - 業務に詳しい人。営業とか、プロダクトオーナー、PdMだったり、社内の人だったりする。
- ユビキタス言語って何？
    - 業務で使われる用語。チームメンバやドメインエキスパートが必ず理解できる用語にする。
---
## 結局ドメイン駆動設計(DDD)ってなに？
- 雑に言うとこんな感じ
    - ドメイン(業務)って難しいから、一発でいいソフトウェアは作れないよ。
    - ドメインモデル(設計書)をことあるごとに、洗練させてソフトウェアを更新しようね。
    - ドメインモデルを変更したら、ソフトウェアを変更するし、逆もまたしかりだよ。
- デザインパターンとかアーキテクチャって何だったん？
    - DDD自体が**要件定義～単体テスト**あたりと、広い範囲について説明しているよ。
    - ドメインモデルを作った後、実装についても具体例出すので、この2つも話題が出てくるよ。
    - 個人的に面白いのが設計と実装をつなぐ部分。
---
# [ここ](https://qiita.com/tanakahisateru/items/df03d2558f9499d1a64a)にも書いてあるけど、付け焼き刃は良くないよ。目的と手段をはき違えないでね。
---
# 参考文献
---
- エリック・エヴァンスのドメイン駆動設計
- [DDDの正体は実装パターンとモデリングの組み合わせ - パンダのプログラミングブログ](https://panda-program.com/posts/what-is-ddd)
- [UML入門 - IT専科](https://www.itsenka.com/contents/development/uml/)
- [デザインパターン | TECHSCORE(テックスコア)](https://www.techscore.com/tech/DesignPattern/)
- [再考: GoF デザインパターン - Qiita](https://qiita.com/irxground/items/d1f9cc447bafa8db2388)
- [一時期プログラミングのデザインパターンというものが大流行しましたが、現在ではどのように評価されているのでしょうか？ - Quora](https://jp.quora.com/%E4%B8%80%E6%99%82%E6%9C%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E3%81%84%E3%81%86%E3%82%82)
- [GoF デザインパターン チートシート - Qiita](https://qiita.com/tanakahisateru/items/df03d2558f9499d1a64a)
- [Patterns of Enterprise Application Architecture](https://bliki-ja.github.io/pofeaa/)

---
- [エンタープライズアプリケーションアーキテクチャパターンを読む: 1.概要｜TechRacho by BPS株式会社](https://techracho.bpsinc.jp/morimorihoge/2017_12_01/48874)
- [階層アーキテクチャの利点は、複雑さの減少：保守性・拡張性に優れたシステムを作る（7） - ITmedia エンタープライズ](https://www.itmedia.co.jp/im/articles/0612/01/news155.html)
- [UML 2.0でプログラミング作業が不要になる | 日経クロステック（xTECH）](https://xtech.nikkei.com/it/free/NBY/NEWS/20030416/3/)