#ddd_guide ドメイン駆動設計 モデリング/実装入門勉強会(オンライン) に参加した

本投稿は下記のオンライン勉強会のメモです。

勉強会の主催者は松岡 ( [@little_hand_s](https://twitter.com/little_hand_s) ) さんです。

- [ドメイン駆動設計 モデリング/実装入門勉強会(オンライン) | connpass](https://ddd-community-jp.connpass.com/event/168674/)
- [アーカイブ動画 | Youtube](https://www.youtube.com/watch?v=19Gbx9jWLdc&feature=youtu.be)
- [視聴者質問投稿先 | sli.do](https://app.sli.do/event/imvxc56h/live/questions)
- [サンプルコード | GitHub](https://github.com/little-hands/ddd-task-management-sample)
- [スライド資料 | SlideShare](https://www.slideshare.net/koichiromatsuoka/202038)
- [Booth「ドメイン駆動設計 モデリング/実装ガイド」](https://little-hands.booth.pm/items/1835632)
    - この本を購入すると動画の続きが楽しめます！

# DDD とは
ソフトウェア開発手法のこと

- ソフトウェアとは
    - ソフトウェアを適用する対象の何らかの問題を解決する
- ドメイン
    - ソフトウェアで問題解決しようとする対象のこと
- モデル
    - **問題解決のため**に、物事の特定の側面を**抽象化**したもの
- ドメインモデル
    - ドメインの問題を解決するためのモデル
- データモデル
    - データベースに何かを永続化するためのモデル
- 良いモデルとは
    - 問題解決ができるモデル
- 良くないモデルとは
    - 問題解決ができないモデル
        - 現実に即していないモデル
- 良いモデルを作るにはどうすれば良いか
    - ドメインに詳しい人から知識を得る
    - 運用した知見をモデルにフィードバックして改善する
    - **モデルは最初から完成しない、改善していくもの**
- コードとモデルが乖離した場合は
    - モデルの更新をコードに正しく反映できない
        - バグが発生しやすくなる
            - モデルをそのまま表現したコードとなるのが望ましい
                - **オブジェクト**でモデルを表現する
    - モデルからコードを理解しにくくなる
        - ドメインに対する理解もできない
        - モデルは改善されない
        - ソフトウェアの価値を高めにくくなる
            - コードにも継続的に反映しないといけない
            - 頻繁な変更に耐えうるには、**拡張性の高い設計**が必要
            - これはソフトウェアとしては非常に高い要求
            - **EntityやRepositoryなどのデザインパターン**が生まれた
- 軽量DDD
    - DDD の実装パターンだけ取り入れること
- どうやってモデリングするのか
    - 体系的なものは色々
    - ユースケース図
        - ユーザーとアプリケーションの相互作用を定義する
        - ユースケースの具体化・言語化
            - 具体化しないと、どのようなモデルを作ればいいかわからない
            - 「タスク」はいち作業者としての視点と管理者としての視点でドメインモデルが変わってくる
    - ドメインモデル図
        - クラス図の簡易版
        - 業務の「ルール・制約」（＝ドメイン知識）を吹き出しで記述する
        - 集約の範囲を明記する
- 集約
    - **必ず守りたい強い整合性を持ったオブジェクトのまとまり**
    - 必ずまとめて取得して、まとめて更新する単位
- アーキテクチャーのお話
    - What ?
        - アプリケーション層（＝UseCase層）
    - How ?
        - ドメイン層

# QA

[2020.3.8 ドメイン駆動設計 モデリング/実装入門勉強会 | sli.do](https://app.sli.do/event/imvxc56h/live/questions)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質疑メモ：<br>既存のシステムにDDDを適用していく場合どこから手を付ければいいでしょうか<br>→オブジェクト指向っぽいコードに落としてみる。モデリングしてモデルオブジェクト,Entityつくる<br>特定の重要機能からレイヤーを意識してアーキテクチャ見直す<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; paichi (@paichi81) <a href="https://twitter.com/paichi81/status/1236624310497734656?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質疑メモ：バリデーションは、どのレイヤーで行うのがよいのでしょうか。<br>→例外の内容・種類による。特定のどこかでなく、層に応じて行う<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; paichi (@paichi81) <a href="https://twitter.com/paichi81/status/1236626161817358337?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質疑メモ：吹き出しに書かれたビジネスルールをコードに落とし込んだ後、仕様として何らかの形で管理・維持されるのですか？<br>→PlantUMLでかいてgitで管理。モデル図をマスタにする<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; paichi (@paichi81) <a href="https://twitter.com/paichi81/status/1236629738526896128?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質疑メモ：マスタ管理系の画面でもDDDで実践すべきか？<br>→ポリシによるがアーキテクチャを画面によって変えるよりは、システムによって揃える。適用しない場面は理由をそえて区切る<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; paichi (@paichi81) <a href="https://twitter.com/paichi81/status/1236630594034888705?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質疑メモ：Repositoryの例で殆どがEntityを返す例しかないのですが、Entityのフィールドすべてを返す必要のない場合、DTOを作成してRepositoryから返すのは良いですか？<br>→8章参照。CQRS、更新と参照のモデルを分離<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; paichi (@paichi81) <a href="https://twitter.com/paichi81/status/1236631576865165318?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質問：DDDをどうやって布教してますか？<br>回答：自身の発言力を高める・仲間を増やす・こっそりやって実績を積むなど、政治的な手法が有効。<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; ゆうのかんや@セキュリティエンジニア(よわよわ) (@yunokanya) <a href="https://twitter.com/yunokanya/status/1236632171248402432?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質問「モデリングのコツを知りたいです」<br>回答「モデリングとコーディングを短いサイクルで回す。小さい規模で開発・失敗を繰り返して経験を積む。」<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; ゆうのかんや@セキュリティエンジニア(よわよわ) (@yunokanya) <a href="https://twitter.com/yunokanya/status/1236637874801401856?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">質疑メモ：ドメイン定義があやふやで変化が速い。DDDは適用できるか<br>→&quot;6.8.1 ドメイン層にロジックを寄せる&quot;参照。<br>最も重要なドメイン層を、独立させて修正しやすくする。<br>むしろ適用していくべき<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; paichi (@paichi81) <a href="https://twitter.com/paichi81/status/1236638484581974016?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 心に残るツイート
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a><br>質問中によく出てきた松岡さんお勧めのPlantUMLはこちら！<a href="https://t.co/1qSpOGaB8x">https://t.co/1qSpOGaB8x</a></p>&mdash; へー/heisy (@heisy) <a href="https://twitter.com/heisy/status/1236631263823331328?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「フロントエンドでDDD」がややこしく思えるの、サーバーと全く同じ視点・関心・手法でやろうとするからであって、まさしく「フロントが果たすべき責務」をドメインと捉え、そのために必要な道具立ては何かを考えれば良い、と考えてます。<a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a> <a href="https://t.co/GrsMhUwKtI">https://t.co/GrsMhUwKtI</a></p>&mdash; philomagi@技術書典応援祭「Vue3解体新書」5章寄稿 (@Philomagi) <a href="https://twitter.com/Philomagi/status/1236633336514097153?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ORマッパーはリポジトリに閉じ込める。確かに。<br>昔の自分のコードを、DDDっぽくリファクタリングすると実感できる。<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a></p>&mdash; hideki@鉄分多め (@yossy52) <a href="https://twitter.com/yossy52/status/1236638305493516293?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ドメインモデルとデータモデルの混同というか、「Entityとテーブルは1対1でなくてはならない」という認識が、質問の後ろにありそうな<a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a> <a href="https://t.co/cfSbFdPSzl">https://t.co/cfSbFdPSzl</a></p>&mdash; philomagi@技術書典応援祭「Vue3解体新書」5章寄稿 (@Philomagi) <a href="https://twitter.com/Philomagi/status/1236628386711130113?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">下手なコードを書くと、マサカリが怖くて萎縮することもあるが、成長するためにはとにかく書いて経験を積むしか無い。<br> <a href="https://twitter.com/hashtag/ddd_guide?src=hash&amp;ref_src=twsrc%5Etfw">#ddd_guide</a> <a href="https://t.co/BPYJFqkKiy">pic.twitter.com/BPYJFqkKiy</a></p>&mdash; ゆうのかんや@セキュリティエンジニア(よわよわ) (@yunokanya) <a href="https://twitter.com/yunokanya/status/1236620936360558593?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>