今まで何となくで済ませてきたドメイン駆動設計に関して改めて基本を勉強したいと思い、「ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本」という書籍を手に取りました!
私の備忘録として、勉強になった内容と個人的な感想をまとめています。
あくまでも備忘録なので、詳しく勉強したい方は実際に書籍を手に取ってみてください🙇♀️
第3章 ライフサイクルのあるオブジェクト「エンティティ」
備忘録
- ドメイン駆動設計におけるエンティティは、ドメインオブジェクトの一種である。
- ER図やORMにおけるエンティティとは別の概念。
- エンティティの性質は以下の3つである。
- 可変である。
- 属性を変更するときは、代入ではなくメソッドを通じて変更する。
- 同じ属性であっても区別される。
- 同一性により区別される。
- 2,3の区別には識別子(ID)を利用すると良い。
- 可変である。
- エンティティの性質に関しては、第2.2章で説明されている値オブジェクトの性質と、第3.2章を対比すると理解しやすい。
- システムに対するライフサイクルとその連続性が存在する場合はエンティティとして定義し、そうではない場合は値オブジェクトとして定義する。
- ドメインオブジェクトを定義するメリット
- コードから仕様を把握しやすくなる。
- ドメインにおける変更をコードに反映しやすくなる。
- ドメインモデルのルールが記載されている箇所が明確であるため。
ここまでの感想
「エンティティ」という単語は幅広い文脈で利用されますが、今までは曖昧に扱っていたと感じます。この章を通して、ER図・ORM・ドメイン駆動設計のエンティティに関しては整理できました。
具体的なソースコードが載っているので、個人的にはイメージが湧きやすく、理解がしやすいと感じています。
「無口なコード」「饒舌なコード」という表現が、的を射ており面白かったです。こういう英語圏的な表現、好きです笑
私も、ソースコードを読めば仕様がわかる状態を目指します!
第4章 不自然さを解決する「ドメインサービス」
備忘録
- ドメインサービスは、ドメイン自体ではなくドメインの活動を表現する時に役立つ。
- サービスとは、クライアントのために何かを実行するオブジェクトである。
- ドメイン駆動開発では、第4章で解説しているドメインサービスと、第6章で解説するアプリケーションサービスの2つに大別される。
- サービスとは、クライアントのために何かを実行するオブジェクトである。
- ドメインサービスの使い所に関して
- 以下のような不自然さを解消するために利用する。
- ドメイン自身に重複チェックを問い合わせる必要がある。
- チェック専用のインスタンスを生成する必要がある。
- 複数のドメインオブジェクトを横断する操作が存在する。
- ドメインオブジェクトに記述するべき知識や振る舞いは、ドメインサービスに移行しない。
- 第4.2章と第4.3章の例が良き。
- 以下のような不自然さを解消するために利用する。
- ドメインサービスを利用する例として、第4.4章のユーザ作成処理と第4.5章の物流システムが例示されている。
ここまでの感想
関心の分離と、ドメインサービスにどのような処理を持たせるかが、衝突しそうに感じました。
また、ドメインオブジェクトに記載する内容と、ドメインサービスに記載する内容の切り分けが難しい印象です。書籍でも解説されているように、迷ったらドメインオブジェクトに記載して、不自然さを感じた場合にドメインサービスとして切り出す方針が良さそうです。
これらは臨機応変に対応していきたいです。ただし、自分で開発していると先入観から抜けられなくなりがちなので、レビューをしてもらうことは必須だと考えています。
第4章も例が豊富なので、ドメインサービスの使い所の解像度が高まりました。
リンク
リンク
以上