ISBN 9784798150727
ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
概要
実装パターンから入って DDD の設計思想を体得する
想定読者
Evans 本に挑戦する前の橋渡しを必要とするバックエンドエンジニア。特にコントローラや Service クラスへのビジネスロジック集積に課題を感じ始めた実装経験 1〜3 年程度の人
こんな人には向いていない
- Evans の原著・Vernon の『実践ドメイン駆動設計』をすでに読破し、境界づけられたコンテキストやコンテキストマップの実践まで進んでいるエンジニアには、カバー範囲が戦術的パターンに留まり物足りない
- 戦略的 DDD(ユビキタス言語の組織的整備・コンテキストマッピング・イベントストーミング)を扱う内容を期待する場合は範囲外。本書は値オブジェクト・集約・リポジトリ等の戦術パターンに特化している
- サンプルコードは C# 中心のため、特定言語の具体的な実装コード優先で学びたい読者は、自身の言語向けの実装記事を別途併読する必要がある
この本で身につくこと
- 値オブジェクトとエンティティの区別基準(同一性 vs 値の等価性)を実装レベルで説明できる
- ドメインサービスとアプリケーションサービスの責務を分離し、ビジネスロジックの置き場所を設計として決定できる
- リポジトリパターンを用いてデータアクセス実装をドメイン層から隔離できる
- 集約の境界を「整合性を守るべき単位」として設計できる
- 仕様パターンでビジネスルール(バリデーション・検索条件)をオブジェクトとして表現できる
- ファクトリパターンでオブジェクト生成の複雑さをカプセル化できる
ハイライト(外部からの言及)
ドメイン駆動設計において、実践が難しいものは後回しにして、理解しやすい実装パターンからドメイン駆動設計の世界に飛び込んでもらうことを目的としています。 — 出典
本書のアプローチを端的に示す記述。Evans 本の難解さに挫折した読者が本書に辿り着く理由そのものを著者自身が言語化している
読了後にできること
Before(読む前): コントローラや Service クラスにビジネスロジックが散在し、どこに何を書くべきか判断基準を持てない
After(読み終えた後): 値オブジェクト・エンティティ・ドメインサービスの責務を区別し、ロジックの置き場所を設計として決定できる
章立て
値オブジェクト
DDD の入口。Qiita で最も個別に解説記事が書かれているパターン。ここを手を動かして実装してから残章に進むと吸収が速い
エンティティ
値オブジェクトとの対比で同一性の概念を掴む章。直後に読むとコントラストが鮮明になる
ドメインサービス
エンティティや値オブジェクトに書きづらいロジックの受け皿。使いすぎへの警告も含まれており実践での境界判断に役立つ
リポジトリ
データアクセス抽象化の設計。現在使っている ORM の実装と対比しながら読むと抽象化の意図が実感しやすい
アプリケーションサービス
ユースケース層の実装。コントローラとドメイン層の橋渡し役であり、アーキテクチャの全体像がここで結びつく
集約
本書後半の山場。整合性境界の設計は現場での設計議論に直結し、読了後に最も参照頻度が高くなる章
仕様
ビジネスルールをオブジェクトとして表現するパターン。検索条件や入力バリデーションの設計に特に有用
関連記事 / 参考情報
- 「Controller にビジネスロジックを書くな」の対応パターン — ビジネスロジックをコントローラから排除する実装パターンを整理。本書の ApplicationService/DomainService 分離が参照される
- 今年入社の新卒エンジニアがこの一年間に読んだ技術書15冊を紹介する — 設計入門から DDD まで新卒 1 年の学習ロードマップを追える記事。本書が入門段階で推薦されている
- 駆動開発が多すぎる件 — TDD / DDD / BDD 等の「駆動開発」系用語を整理・比較する俯瞰記事。DDD の立ち位置を他手法と対比して確認できる
- ワイと学ぶ、値オブジェクト — 値オブジェクトの概念と実装を会話形式で解説。本書の該当章を読んだ後の定着確認に使いやすい
- おい!なんでその処理をコントローラに書いているんだい? — コントローラへのロジック集中を問題提起し、ドメイン層への移行を解説する実践向け記事
- Laravelで同じ実装をドメイン駆動設計(DDD)とMVCで比較してみた — PHP/Laravel で DDD と MVC の実装を並べて比較。本書のパターンを実際のフレームワークに適用するイメージをつかむのに有用
- DDDをざっくり理解してみる① ~エンティティと値オブジェクト編~ — 本書前半パターン(エンティティ・値オブジェクト)を独自に整理した学習ノート。章ごとの理解チェックに使える
- オニオンアーキテクチャとは — DDD の戦術パターンを前提にオニオンアーキテクチャを解説。本書で基礎習得後にアーキテクチャ全体像へ進む際の参照先
学習のヒント
- 第2〜4章(値オブジェクト・エンティティ・ドメインサービス)は手を動かして実装しコードが通るところまで確認してから進む。この 3 パターンを体で覚えると後半の集約・仕様の設計判断が自然に理解できる
- Evans 本を先に積読してしまった場合でも、本書を先に通読すると Evans 本の「戦略的 DDD」部分(ユビキタス言語・境界づけられたコンテキスト)の文脈が読み取りやすくなる
- サンプルコードは C# 中心だが、PHP / Python / TypeScript 向けに本書の内容を追いかけた Qiita 記事が多数公開されているため、自分の言語の記事と並走すると理解が定着しやすい
- リポジトリパターン章は、現在使っている ORM の抽象化レイヤと対比させながら読む。「なぜ直接 ORM を呼ばないのか」という問いを持って読むと設計意図が実感できる
前提知識
- オブジェクト指向の基礎(クラス・インタフェース・カプセル化)の実装経験
- いずれかの Web フレームワーク(MVC ベース)での実装経験が 1 プロジェクト以上あること
- RDB を使った CRUD 実装経験(ORM 経由で可)
次に読む本
エリック・エヴァンスのドメイン駆動設計
本書が扱わない戦略的 DDD(境界づけられたコンテキスト・コンテキストマップ・ユビキタス言語の組織的整備)に進むための原典。本書で戦術パターンを体得してから読むと吸収が格段に速い
実践ドメイン駆動設計
集約の高度な設計・CQRS・イベントソーシングへ進む次のステップ。本書の description でも参照先として明示されている
良いコード/悪いコードで学ぶ設計入門
DDD パターンの背後にある「なぜこう書くか」の設計原則を補強する相補的な設計書。本書の前後どちらに置いても有効
出版社による内容紹介
学習しやすいパターンが満載! ドメイン駆動設計をやさしく学べる入門書! 【本書の概要】 本書は、 『エリック・エヴァンスのドメイン駆動設計』(ISBN978-4-7981-2196-3、翔泳社)、 『実践ドメイン駆動設計』(ISBN978-4-7981-3161-0、翔泳社) に感銘を受けた著者が贈る、ドメイン駆動設計の入門書です。 【対象読者】 『エリック・エヴァンスのドメイン駆動設計』や 『実践ドメイン駆動設計』をこれから読もうとしている方、 もしくはすでに読んだものの、「もう少しやさしい入門書も読みたい」 と感じているエンジニアの方を対象としています。 【本書の特徴】 ドメイン駆動設計において、実践が難しいものは後回しにして、 理解しやすい実装パターンからドメイン駆動設計の世界に 飛び込んでもらうことを目的としています。 そこで初心者にとって、理解しやすい、そして実践しやすいパターンからスタートできるよう、 解説を工夫しています。 またドメイン駆動設計で頻出するパターンの記述方法やその目的も併せて解説しています。 本書で解説するパターンは以下のとおりです。 【知識を表現するパターン】 ・値オブジェクト ・エンティティ ・ドメインサービス 【アプリケーションを実現するためのパターン】 ・リポジトリ ・アプリケーションサービス ・ファクトリ 【知識を表現する、より発展的なパターン】 ・集約 ・仕様
この本がどの学習段階で役立つかは、 関連する ロードマップ から確認できます。