5分でDDDについて何を伝えるか

# 目的

DDDを採用しているプロジェクトにDDDについて経験のないメンバーがやってきた。
何を伝えるべきだろうか

---
# アジェンダ

* 私とDDD
* 読んでおきたいリソース
* DDDとは
* いろいろ一言で

---
# 私とDDD

なんとなくの理解で、DDDのエッセンスには影響うけつつ独自のスタイルでソフトウェアを書いている。
DDDについて語る人たちは人によって違うことを言ってることがあるようにみえて、怖いと思っている。
つまり、私の言うことはどれくらい信頼できるかどうかは定かではない。

---
# 読んでおきたいリソース

---
## エリック・エヴァンスのドメイン駆動設計

![51f7WXHJYCL._SX391_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5840/ca2bf51d-a4c6-6ba3-14f4-23e2248f7782.jpeg)

---
576ページもある。
こんなもの読んでいたらいつまでたっても作業できない。

---
## DDD Quickly

![frontcover_ja_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5840/a9588fe6-0085-9f0e-7bf3-10cc9c4bffbe.png)

---
PDF無料!
前述のDDDを81ページに凝縮
https://www.infoq.com/jp/minibooks/domain-driven-design-quickly/

---
### DDD Reference

![71QA9u88PdL-194x300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5840/cf4b0355-3221-0b9f-bfbf-b209d56bd25d.jpeg)

---
前述のDDDに登場するすべてのパターンを短く要約。
さらに新規パターンを追加。52ページしかない。
復習に最適な一冊。無料。(英語)

---
# まとめ

原点を押さえるなら

1. quicklyで概要を掴む
1. refernceでパターンをすべて把握
1. 気になるところは原典で確認

---
とはいえ大変なので、

[DDD難民に捧げる Domain-Driven Designのエッセンス](https://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/index.html)あたりを斜め読みするのがいいのではないかと思っている。

---
# DDDとは何か?

---
# DDDとは何か?

* ソフトウェアの設計指針
* プロジェクトの回し方
* 実装テクニック
* チームのあり方
* etc...

---
# オブジェクト指向言語を用いた<br>大規模プロジェクトのための<br>パターン集

(ただし、オブジェクト指向に限った原則ばかりではなくオブジェクト指向でなくとも適用可能とされる)

---
## というのを理解した上でDDDとは

* コアドメインに集中しなさい
* ドメインの専門家とソフトウェアの専門家が創造的にコラボレーションしながらモデルを探索しなさい
* 明示された境界づけられたコンテキストの中でユビキタス言語で会話しなさい

より詳しくは
* [ドメイン駆動設計の定義についてEric Evansはなんと言っているのか](https://qiita.com/little_hand_s/items/7288a0b3dd5dfb1a4c35) などが良さそう

---
# アジャイルやウォータウォールなどと同じレベルの概念と考えてもいいんじゃないだろうか。<br>(要出典)

---
ウォータフォール
設計 -> 開発 -> 運用

アジャイル
設計/開発 -> 運用 -> 設計/開発 -> 運用 -> ...

DDD
設計/開発 -> 設計/開発 -> 設計/開発 -> 運用

(違いを明確にするだけのイメージです)

---
# いろいろ一言で

---
## Q 全部読むのたいへんじゃないっすか?

A 設計者でないなら3部まで把握していれば十分なのでは?
<img width="876" alt="スクリーンショット 2019-06-10 0.48.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5840/5b124c33-4896-eabf-4028-04ab0548cff3.png">

---
## Q ドメインって何?

A ソフトウェアが解決しようとする問題領域のこと

ここが一番重要なので、複雑なところなので、ここをシンプルに考えられるようにがんばろうぜ！ってことだと思っている。

---
## Q コアドメインって何?

A ドメインの中でも特に重要な部分のこと

---

## Q モデルって何?

A ドメインを表現するための抽象。モデルを作り、集めることでドメインが表現できる。

---
## Q 境界づけられたコンテキストって何?

A モデルが有効な範囲のこと。曖昧であることが多いので、その範囲を明示的に区切る必要がある。
雑にいえば名前空間に似ている

広島 :: お好み焼き
大阪 :: お好み焼き

おなじお好み焼きだが違う料理だ。
---
## Q ユビキタス言語って何?

A. そのプロジェクトチームで利用されるドメインモデルで構成された言語。
みんなユビキタス言語で話そう。
認識のズレが無くせる。

---
## Q ドメインモデルをどうやってコードにするの?

以下のパターンのいずれかに落とし込む

* エンティティ (名詞)
* 値オブジェクト (名詞)
* サービス (たいてい動詞)
* ドメインイベント

–--
## Q エンティティって何?

A IDが同じならそのオブジェクトは同じIDとみなせるオブジェクト
プロパティが違うものがあるなら、どちらかは古い状態のオブジェクトに違いない

---
## Q 値オブジェクトって何?

A プロパティが全て同じなら同値とみなせるオブジェクト

---
## Q サービスって何?

A エンティティや値オブジェクトでは表現できなくて、イベントでもないもののこと
たいてい動詞のはず。いろんな意味で乱用されていてわけがわからない奴になってることがある。

---
## Q レイヤードアーキテクチャってどうなん?

A 代わりに、クリーンアーキテクチャやヘキサゴナルアーキテクチャを使うことが増えてるらしい

---
## Q 関数プログラミングでDDDってどうなん?

A どうにでもなるやろ。
手続き型でもオブジェクト指向でも、関数プログラミングでもチューリング完全な言語を用いれば同じロジックを表現できるのだから。
DDDに登場するパターンはオブジェクト指向言語でなくても素直に実現できるものも多い。

---
# まとめ

---
# DDDとは

* コアドメインに集中しなさい
* ドメインの専門家とソフトウェアの専門家が創造的にコラボレーションしながらモデルを探索しなさい
* 明示された境界づけられたコンテキストの中でユビキタス言語で会話しなさい


---
# もらったコメント

* DDD本、とりあえず読むなら[もちこちゃんの大冒険](https://booth.pm/ja/items/392260)も推したい