【本書の概要】
本書は、
『エリック・エヴァンスのドメイン駆動設計』(ISBN978-4-7981-2196-3、翔泳社)、
『実践ドメイン駆動設計』(ISBN978-4-7981-3161-0、翔泳社)
に感銘を受けた著者が贈る、ドメイン駆動設計の入門書です。
【対象読者】
『エリック・エヴァンスのドメイン駆動設計』や
『実践ドメイン駆動設計』をこれから読もうとしている方、
もしくはすでに読んだものの、「もう少しやさしい入門書も読みたい」
と感じているエンジニアの方を対象としています。
【本書の特徴】
ドメイン駆動設計において、実践が難しいものは後回しにして、
理解しやすい実装パターンからドメイン駆動設計の世界に
飛び込んでもらうことを目的としています。
そこで初心者にとって、理解しやすい、そして実践しやすいパターンからスタートできるよう、
解説を工夫しています。
またドメイン駆動設計で頻出するパターンの記述方法やその目的も併せて解説しています。
本書で解説するパターンは以下のとおりです。
【知識を表現するパターン】
・値オブジェクト
・エンティティ
・ドメインサービス
【アプリケーションを実現するためのパターン】
・リポジトリ
・アプリケーションサービス
・ファクトリ
【知識を表現する、より発展的なパターン】
・集約
・仕様
Chapter 1 ドメイン駆動設計とは
1.1 ドメイン駆動設計とは何か
1.2 ドメインの知識に焦点をあてた設計手法
1.3 本書解説事項と目指すゴール
COLUMN|ドメイン駆動設計の実践を難しくするもの
1.4 本書で解説するパターンについて
COLUMN|なぜいま、ドメイン駆動設計か
Chapter 2 システム固有の値を表現する「値オブジェクト」
2.1 値オブジェクトとは
2.2 値の性質と値オブジェクトの実装
COLUMN|不変のメリット
2.3 値オブジェクトにする基準
2.4 ふるまいをもった値オブジェクト
2.5 値オブジェクトを採用するモチベーション
2.6 まとめ
Chapter 3 ライフサイクルのあるオブジェクト「エンティティ」
3.1 エンティティとは
3.2 エンティティの性質について
COLUMN|セーフティネットとしての確認
3.3 エンティティの判断基準としてのライフサイクルと連続性
3.4 値オブジェクトとエンティティのどちらにもなりうるモデル
3.5 ドメインオブジェクトを定義するメリット
3.6 まとめ
Chapter 4 不自然さを解決する「ドメインサービス」
4.1 サービスが指し示すもの
4.2 ドメインサービスとは
4.3 ドメインサービスの濫用が行き着く先
4.4 エンティティや値オブジェクトと共にユースケースを組み立てる
COLUMN|ドメインサービスの基準
4.5 物流システムに見るドメインサービスの例
COLUMN|ドメインサービスの命名規則
4.6 まとめ
Chapter 5 データにまつわる処理を分離する「リポジトリ」
5.1 リポジトリとは
COLUMN|リポジトリはドメインオブジェクトを際立たせる
5.2 リポジトリの責務
5.3 リポジトリのインターフェース
COLUMN|nullの是非とOption型
5.4 SQLを利用したリポジトリを作成する
5.5 テストによる確認
5.6 テスト用のリポジトリを作成する
5.7 オブジェクトリレーショナルマッパーを用いたリポジトリを作成する
5.8 リポジトリに定義されるふるまい
5.9 まとめ
Chapter 6 ユースケースを実現する「アプリケーションサービス」
6.1 アプリケーションサービスとは
COLUMN|アプリケーションサービスという名前
6.2 ユースケースを組み立てる
COLUMN|煩わしさを減らすために
COLUMN|エラーかそれとも例外か
6.3 ドメインのルールの流出
6.4 アプリケーションサービスと凝集度
6.5 アプリケーションサービスのインターフェース
6.6 サービスとは何か
6.7 まとめ
Chapter 7 柔軟性をもたらす依存関係のコントロール
7.1 技術要素への依存がもたらすもの
7.2 依存とは
7.3 依存関係逆転の原則とは
7.4 依存関係をコントロールする
7.5 まとめ
Chapter 8 ソフトウェアシステムを組み立てる
8.1 ソフトウェアに求められるユーザーインターフェース
COLUMN|ソフトウェアとアプリケーションの使い分け
8.2 コマンドラインインターフェースに組み込んでみよう
COLUMN|シングルトンパターンと誤解
8.3 MVCフレームワークに組み込んでみよう
COLUMN|コントローラの責務
8.4 ユニットテストを書こう
8.5 まとめ
COLUMN|本当に稀な怪談話
Chapter 9 複雑な生成処理を行う「ファクトリ」
9.1 ファクトリの目的
9.2 採番処理をファクトリに実装した例の確認
COLUMN|ファクトリの存在に気づかせる
9.3 ファクトリとして機能するメソッド
9.4 複雑な生成処理をカプセル化しよう
COLUMN|ドメイン設計を完成させるために必要な要素
9.5 まとめ
Chapter 10 データの整合性を保つ
10.1 整合性とは
10.2 致命的な不具合を確認する
10.3 ユニークキー制約による防衛
10.4 トランザクションによる防衛
COLUMN|結局どれを使うべきか
10.5 まとめ
Chapter 11 アプリケーションを1から組み立てる
11.1 アプリケーションを組み立てるフロー
11.2 題材とする機能
11.3 サークルの知識やルールをオブジェクトとして準備する
11.4 ユースケースを組み立てる
11.5 まとめ
Chapter 12 ドメインのルールを守る「集約」
12.1 集約とは
COLUMN|集約を保持するコレクションを図に表すか
COLUMN|よりきめ細やかなアクセス修飾子(Scala)
12.2 集約をどう区切るか
COLUMN|IDのゲッターに対する是非
12.3 集約の大きさと操作の単位
COLUMN|結果整合性
12.4 言葉との齟齬を消す
12.5 まとめ
Chapter 13 複雑な条件を表現する「仕様」
13.1 仕様とは
13.2 仕様とリポジトリを組み合わせる
COLUMN|遅延実行による最適化
13.3 まとめ
Chapter 14 アーキテクチャ
14.1 アーキテクチャの役目
14.2 アーキテクチャの解説
14.3 まとめ
Chapter 15 ドメイン駆動設計のとびらを開こう
15.1 軽量DDDに陥らないために
COLUMN|パターンの濫用とパターンを捨てるとき
15.2 ドメインエキスパートとモデリングをする
15.3 ユビキタス言語
COLUMN|ユビキタス言語と日本語の問題
15.4 境界付けられたコンテキスト
15.5 コンテキストマップ
15.6 ボトムアップドメイン駆動設計
15.7 まとめ
Appendix ソリューション構成
A.1 ソフトウェア開発の最初の一歩
COLUMN|C#特有のプロジェクト管理用語
A.2 ソリューション構成
A.3 まとめ
めかぶこんぶ さん
2020-03-05
☆一文要約:DDDは大きな概念だが、ボトムアップに軽量DDDからの導入でも、コードの改善につながる! ●要約:DDDをボトムアップで、一つ一つコードレベルの例ち共に解説。DDD本書より圧倒的に読みやすいので、最初の一歩には最適か。大きな概念としてのDDDを着実に自分のプロダクトに活かす方法が見えてくる。軽量DDD(パターンのみの適用)は本来目指すところではないものの、それだけでもコードの改善にはつながる。できるところからはじめて、将来的にドメイン駆動設計ができるようになるための第一歩になる一冊と感じた。
忘備録 さん
2021-07-12
エンティティ、バリューオブジェクト、ドメインサービス、アプリケーションサービスなど、DDDの基本となる概念の理解が出来た。これらの知識は本格的にDDDを学ぶ上での下地になる。
つるたん さん
2021-07-04
再読。DDDについてとてもわかり易く書かれており読んでいて気持ちよかった。 Value ObjectとEntityの違い、Specificationを使用し仕様を外部へ切り出す、抽象へ依存させることによる依存関係逆転の法則など役立つ知識が多い。しかしこれらの知識を実装へ落とし込むことがDDDではなく、ドメインを主軸において開発することの重要性を説いていた。