DDDもどき
ここではドメイン駆動開発に関してのテクニック、ノウハウ、考えた方資料などをまとめて行きます。
書籍
tyamahoriのおすすめを貼ります。
現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法
ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
ドメイン駆動設計 モデリング/実装ガイド - little-hands - BOOTH
頑張れる人向け
.NETのエンタープライズアプリケーションアーキテクチャ第2版 .NETを例にしたアプリケーション設計原則
参考リポジトリ
anfangd/laravel-ddd-sample-for-beginners
参考サイト
[DDD]ドメイン駆動 + オニオンアーキテクチャ概略 - Qiita
ご主人様、小難しいDDDやクリーンアーキテクチャはお忘れになって、“削除しやすい設計”から始められてはいかが? - Qiita
Laravelでドメイン駆動設計(DDD)を実践し、Eloquent Model依存の設計から脱却する - Qiita
https://twitter.com/masuda220/status/1321700797042716672
https://designpatternsphp.readthedocs.io/ja/latest/README.html
ポイント
- リポジトリパターン
- オニオンアーキテクチャ
- モデリング大事!!
- 業務の理解大事!!
- ビジネスサイドと話し合い、共通言語を作る
- 共通言語をクラスに再現する。それがドメインオブジェクトになる
- これが一番大変。。ここがグダグダしていると良い実装ができない。。
- クラスの数がめちゃくちゃ増えます。。
クラス設計
-
コントローラークラス
- HTTPリクエストの取り回し対応
- viewに値を渡す場合viewmodelクラスを使う(こだわる場合)
-
パラメータークラス
- 入力で使う
- 命名は適当。
- 用途はユーザーの入力値をラップするデータオブジェクト
-
DTOクラス
- 出力で使う
- 命名は適当
- ユースケースクラスがコントローラークラスにデータを渡すときにラップして使う
-
ユースケースクラス
- リポジトリインターフェースクラスをコンストラクタインジェクションする
- パラメータクラスをメソッドインジェクションする
- 必要に応じてドメインサービスクラスをコンストラクタインジェクションする
- ロジックは書かない!あくまでもドメインクラスのメソッドを利用するだけにとどめる
-
ドメインクラス
-
エンティティクラス
- ドメインの主役。ロジックの置き場所
-
バリューオブジェクトクラス
- 型定義のクラス
-
リポジトリインターフェイスクラス
- データソースとやり取りするクラス
- インターフェースの理由はデータソースが変わっても柔軟に対応できるようにするため
- ドメインオブジェクトを返すようにする。Eloquentクラスは返さない
-
ドメインサービス
- エンティティやバリューオブジェクトでは表現しにくい処理をここで書く
- 取り扱い注意。基本はエンティティやバリューオブジェクトで対応する。最後の手段として使う場所
-
エンティティクラス
-
インフラストラクチャークラス
- リポジトリインターフェースの具象クラス
- データソースと直接やり取りするクラス
- EloquentやQueryBuilderをゴリゴリ使って、データの保存やデータの問い合わせを行う