最近この本を読んでみたので学んだ点や感想を書きます。 www.shoeisha.co.jp
読んだきっかけ
最近は設計やアーキテクチャといった領域に興味をもっています。
設計力を向上したいため、ドメイン駆動設計を知ることで設計力の向上につながるのではないかと思い、読んでみました。
特に学びになった点/面白かった点
値オブジェクトとエンティティ
| 値オブジェクト | エンティティ |
|---|---|
| ドメインモデルを実装したドメインオブジェクト | ドメインモデルを実装したドメインオブジェクト |
| プリミティブ型ではなく、システム固有の値を表現するために定義されたオブジェクト。ライフサイクルは持たない | ライフサイクルを持つ可変なドメインオブジェクト |
| 性質1. 不変である | 性質1. 可変である |
| 性質2. 交換が可能である | 性質2. 同じ属性であっても区別される |
| 性質3. 等価性によって比較される | 性質3. 同一性により区別される |
値オブジェクト
3つの性質の詳細
- 不変である
- 値の書き換えをしたいときは、新しいインスタンスを作り直す
- 値オブジェクトクラスにchangeToxxxみたいな値を変更するメソッドは持つべきではない
- 交換が可能である
- 1にも関連するが、値の交換(新しいインスタンス生成)以外で値を変更できない
- 等価性によって比較される
- 値オブジェクトはシステム固有の値、あくまでも値。その属性を取り出して比較をするのではなく、値と同じように値オブジェクト同士が比較できるようにする方が自然な記述
- 値オブジェクト同士を比較する際には値オブジェクトの属性を取り出して比較するのではなく、Equalsメソッドを利用して比較を行う
値オブジェクトを使用するモチベーション
- 表現力を増す
- 例えば製品番号を扱いたい場合、stringというプリミティブ型だけだと、xxxxx-xxx-xのような特定の規則性がすぐにわからない。無口な文字列となってしまう。
- ModelNumberクラスの定義を確認してみれば、製品番号はプロダクトコード(productCode)と枝番(branch)、そしてロット番号(lot)から構成されていることがわかる
- 値オブジェクトはその定義により自分がどういったものであるかを主張する自己文書化を推し進める
- 誤った代入を防ぐ
- 🤔筆者の理解メモ:恐らく代入時にシステム固有の型を期待し、もし違うときはエラーを返せるという点だと思う。となる前提として静的な言語か、動的な言語で型ヒントを使う必要がありそう
エンティティ
3つの性質の詳細
- 可変である
- エンティティの属性を変化させたいときにはエンティティクラスのメソッドを通じて変更する
- すべての属性を必ず可変にする必要はない。エンティティはあくまでも、必要に応じて属性を可変にすることが許可されている。可変なオブジェクトは基本的には厄介な存在なので可能な限り不変にしておくことがよい
- 同じ属性であっても区別される
- エンティティ同士を区別するためには識別子(Identity)が利用される
- 同一性により区別される
- 属性を変更しても変更前と変更後のオブジェクトは同一として扱われる
- Equalsメソッドでは、idでだけで比較するイメージ
🤔筆者の理解メモ:ActiveRecordを継承したモデルのidと似てそう。エンティティがライフサイクルを持つものであること、そしてCRUDのようにDBの1レコードがライフサイクルを持っているからかもしれない。
ドメインオブジェクト定義するメリット
- コードのドキュメント性が高まる
- ドメインにおける変更をコードに伝えやすくする
ドメインサービス
- システムには値オブジェクトやエンティティに記述すると不自然になってしまうふるまいが存在し、それを解決するオブジェクトのこと
- ドメインサービスにはデータストアといったインフラストラクチャが絡まないドメインオブジェクトの操作に徹したのが本流
🤔筆者の理解メモ:アプリケーションサービスはクリーンアーキテクチャならばいちばん外側のレイヤーだろうか?
アプリケーションサービス
- アプリケーションサービスは、ユースケースを実現するオブジェクト
- アプリケーションサービスで結果を返却する必要がある場合について、「ドメインオブジェクトを返却する」「ドメインオブジェクトを返却しない」2パターン存在する。ドメインオブジェクトを公開するかしないかは大きな分岐点
🤔筆者の理解メモ:アプリケーションサービスはクリーンアーキテクチャのUse caseに似てそう
クリーンアーキテクチャへの関連
おわりに
値オブジェクト、エンティティなど、名前は知ってたけど詳しく知れて、使用するメリットをしれて良かったです。
特に値オブジェクトは誤った代入を防いだり、コードの表現力が増えることでバグの防止に役立ちそうだと思いました。
今回ドメイン駆動設計に関する技術書で初めて読んでみました。ドメイン駆動設計初心者に向けて分かりやすい本だと思いました。
また、ドメイン駆動設計の雰囲気をはつかめたものの、詳細を理解できていない部分もあるました。ただ、第一歩として知れて良かったです。
ドメイン駆動設計の入門書を探している人にはおすすめです。
引き続き設計やアーキテクチャのことを学んでいきます。