2020年2月に発売された「ドメイン駆動設計入門」を読んでみました。元々ドメイン駆動には興味があり、エリック・エヴァンスのドメイン駆動設計を途中まで読んでいたのですが、なんだか読みにくく放置気味となってしまっていたので、今回この本で入門してから再度エリック・エヴァンスの本を読もうかと思っています。
内容についてはタイトルに「入門」とある通り,ドメイン駆動設計について全体を俯瞰できるような1冊だったと思います。読んでみてドメイン駆動設計はなんだか難しくてとっつきにくいという印象がかなり薄れたかなという印象です。特に全体を通してドメイン駆動設計の要素をわかりやすい日本語で、なぜそれが必要になるかまで説明してあるのは素晴らしいと思いました。どのようにアプリケーションを作っていくのかもC#での実コードが載っているのでイメージしやすくとても勉強になりました。
また、ドメイン駆動設計の説明だけではなく「凝集度」、「依存関係逆転の原則」、「整合性維持のためのトランザクション」などソフトウェア開発を行うにあたっての重要な考え方が随所に散りばめてあったのも素晴らしいと思いました。
学び
ドメイン駆動設計とは
値オブジェクトとは
- システム固有の値を表したオブジェクト
- 値オブジェクトにする基準
- そこにルールが存在しているか
- それ単体で取り扱いたいか
エンティティとは
- ドメインモデルを実装したドメインオブジェクト
- 値オブジェクトととの違いは同一性(Identity)によって識別されるか否か
- ライフサイクルが存在し、そこに連続性が存在するものはエンティティ。そうでないものは値オブジェクト
ドメインサービスとは
- 値オブジェクトやエンティティに記述すると不自然になってしまう振る舞いを記述するオブジェクト
- ふるまいをエンティティや値オブジェクトに定義するべきか迷ったらまずはエンティティや値オブジェクトに定義する。なるべくドメインサービスは利用しない
リポジトリとは
- データを永続化(保存)し、再構築(復元)するといった処理を抽象的に扱うためのオブジェクト
アプリケーションサービスとは
- ドメインオブジェクトを協調させてユースケースを実現させる
- ドメインオブジェクトをクアライアント公開するか否かは大きな分岐点
- アプリケーションサービス以外のオブジェクトがドメインオブジェクトの直接のクライアントとなって自由に操作できてしまう危険性が存在
ファクトリとは
集約とは
- 不変条件を維持する単位として切り出され、オブジェクトの操作に秩序をもたらすもの
- 変更の単位で集約を区切るのがメジャー
仕様とは
- あるオブジェクトがある評価基準に達しているかを判定するオブジェクト
- エンティティや値オブジェクトにリポジトリを操作させないために取られる手段が仕様