Laravel! 頑張る! DDDもどき!

# DDDもどき

ここではドメイン駆動開発に関してのテクニック、ノウハウ、考えた方資料などをまとめて行きます。

# 書籍

tyamahoriのおすすめを貼ります。

[現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%AE%E5%8E%9F%E5%89%87-%E3%80%9C%E5%A4%89%E6%9B%B4%E3%82%92%E6%A5%BD%E3%81%A7%E5%AE%89%E5%85%A8%E3%81%AB%E3%81%99%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%8A%80%E6%B3%95-%E5%A2%97%E7%94%B0-%E4%BA%A8-ebook/dp/B073GSDBGT)

[ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本](https://www.amazon.co.jp/dp/B082WXZVPC/ref=dp_kinw_strp_1)

[ドメイン駆動設計 モデリング/実装ガイド - little-hands - BOOTH](https://little-hands.booth.pm/items/1835632)

頑張れる人向け

[エリック・エヴァンスのドメイン駆動設計](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Eric-Evans-ebook/dp/B00GRKD6XU/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95&qid=1603780140&s=digital-text&sr=1-3)

[実践ドメイン駆動設計](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%B3%E3%83%BB%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%8E%E3%83%B3-ebook/dp/B00UX9VJGW/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95&qid=1603780140&s=digital-text&sr=1-1)

[.NETのエンタープライズアプリケーションアーキテクチャ第2版 .NETを例にしたアプリケーション設計原則](https://www.amazon.co.jp/NET%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E7%AC%AC2%E7%89%88-NET%E3%82%92%E4%BE%8B%E3%81%AB%E3%81%97%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A8%AD%E8%A8%88%E5%8E%9F%E5%89%87-%E3%83%87%E3%82%A3%E3%83%8E-%E3%82%A8%E3%82%B9%E3%83%9D%E3%82%B7%E3%83%88-ebook/dp/B00ZQZ8JNE/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=23CFYYTC6O4UX&dchild=1&keywords=%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&qid=1603780286&s=digital-text&sprefix=%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%82%BA%2Cdigital-text%2C266&sr=1-3)

# 参考リポジトリ

[anfangd/laravel-ddd-sample-for-beginners](https://github.com/anfangd/laravel-ddd-sample-for-beginners)

# 参考サイト

[[DDD]ドメイン駆動 + オニオンアーキテクチャ概略 - Qiita](https://qiita.com/little_hand_s/items/2040fba15d90b93fc124)

[ご主人様、小難しいDDDやクリーンアーキテクチャはお忘れになって、“削除しやすい設計”から始められてはいかが？ - Qiita](https://qiita.com/mejileben/items/48473a572ec07cbaf65f)

[Laravelでドメイン駆動設計(DDD)を実践し、Eloquent Model依存の設計から脱却する - Qiita](https://qiita.com/mejileben/items/302a9f502ca0801b1efb)

[https://twitter.com/masuda220/status/1321700797042716672](https://twitter.com/masuda220/status/1321700797042716672)

[https://designpatternsphp.readthedocs.io/ja/latest/README.html](https://designpatternsphp.readthedocs.io/ja/latest/README.html)

# ポイント

- リポジトリパターン
- オニオンアーキテクチャ
- モデリング大事！！
- 業務の理解大事！！
- ビジネスサイドと話し合い、共通言語を作る
- 共通言語をクラスに再現する。それがドメインオブジェクトになる
- これが一番大変。。ここがグダグダしていると良い実装ができない。。
- クラスの数がめちゃくちゃ増えます。。

# クラス設計

- **コントローラークラス**
    - HTTPリクエストの取り回し対応
    - viewに値を渡す場合viewmodelクラスを使う(こだわる場合)
- **パラメータークラス**
    - 入力で使う
    - 命名は適当。
    - 用途はユーザーの入力値をラップするデータオブジェクト
- **DTOクラス**
    - 出力で使う
    - 命名は適当
    - ユースケースクラスがコントローラークラスにデータを渡すときにラップして使う
- **ユースケースクラス**
    - リポジトリインターフェースクラスをコンストラクタインジェクションする
    - パラメータクラスをメソッドインジェクションする
    - 必要に応じてドメインサービスクラスをコンストラクタインジェクションする
    - **ロジックは書かない！あくまでもドメインクラスのメソッドを利用するだけにとどめる**
- **ドメインクラス**
    - **エンティティクラス**
        - ドメインの主役。ロジックの置き場所
    - **バリューオブジェクトクラス**
        - 型定義のクラス
    - **リポジトリインターフェイスクラス**
        - データソースとやり取りするクラス
        - インターフェースの理由はデータソースが変わっても柔軟に対応できるようにするため
        - ドメインオブジェクトを返すようにする。Eloquentクラスは返さない
    - **ドメインサービス**
        - エンティティやバリューオブジェクトでは表現しにくい処理をここで書く
        - 取り扱い注意。基本はエンティティやバリューオブジェクトで対応する。最後の手段として使う場所
- **インフラストラクチャークラス**
    - リポジトリインターフェースの具象クラス
    - データソースと直接やり取りするクラス
    - EloquentやQueryBuilderをゴリゴリ使って、データの保存やデータの問い合わせを行う