EvansとVernonで学ぶDDD

20年の歴史を持つDDDの2つの原典(青本・赤本)の思想差と実装アプローチを、採用管理システムを題材に比較する。

EvansとVernonで学ぶDDD

20年の歴史を持つDDDの2つの原典(青本・赤本)の思想差と実装アプローチを、採用管理システムを題材に比較する。

目次

  1. 背景 ドメイン駆動設計(DDD)は、ソフトウェアの複雑さに向き合うための設計手法です。2003年にEric Evansが体系化して以来、20年以上にわたりエンタープライズ開発の世界で支持を受け続けています。
  2. 第2章 ユビキタス言語 ── 言葉を統一することの意味 Eric Evansは『Domain-Driven Design』(2003年)の中で、ユビキタス言語(Ubiquitous Language)を「開発者とドメインエキスパートが共有する共通言語」と定義した。この言語はコード・テスト・ドキュメント・会話のすべてで一貫して使われる。どれか一つだけで使われる言語はユビキタス言語ではない。
  3. [共通] 境界づけられたコンテキスト(Bounded Context)── モデルに境界を引く 採用管理システムの設計を始めるとき、「候補者(Candidate)」という概念は最初から存在する。採用担当者も開発者も、この言葉を日常的に使う。問題は、この言葉が指す実体がコンテキストによって異なることだ。
  4. [共通] Context Map(コンテキストマップ)── コンテキスト間の関係を設計する 境界づけられたコンテキストを複数定義すると、次の問いが生まれる。「それぞれのコンテキストはどのように連携するのか」「あるコンテキストの変更が別のコンテキストに影響を与えるのはどのような経路か」。Evansはこの問いに答えるために、コンテキストマップという概念を導入した。
  5. [Vernon追加] Event Storming(イベントストーミング)── 境界を"発見"する技法 Event Stormingは、Alberto Brandoliniが考案したワークショップ形式の設計技法である。大きな壁面に付箋を貼り、ドメインイベントを時系列に並べながらドメインの全体像を短時間で可視化する。参加者は開発者だけでなく、ドメインエキスパートや業務担当者を含む。
  6. [共通] エンティティ(Entity)と値オブジェクト(Value Object)── 同一性とは何か Evansは「ドメイン駆動設計」の中で、エンティティを次のように定義している。オブジェクトの本質が属性の組み合わせではなく、「同一性の連続性(continuity of identity)」によって規定されるもの、それがエンティティである。
  7. [比較] 集約(Aggregate)── Evansの原典とVernonの4つのルール Evansは青本の中で集約を次のように定義した。「データ変更を目的として1つの単位として扱う、関連オブジェクトのクラスター(cluster of associated objects that we treat as a unit for the purpose of data changes)」。
  8. [Vernon追加] ドメインイベント(Domain Events)── 青本にはなかったもの Evansの「Domain-Driven Design」(2003年)にはドメインイベントという概念が体系的に定義されていない。エンティティや値オブジェクト、集約、リポジトリといった戦術的設計パターンは青本の中心をなすが、「ドメイン内で何かが起きたという事実をどう表現するか」という問いに対して、青本は明確な答えを示していない。
  9. [Vernon追加] CQRS と Event Sourcing ── 読み書きを分け、変化を記録する Evans の「ドメイン駆動設計」(2003年)には、コマンドクエリ責務分離(Command Query Responsibility Segregation、以下CQRS)についての記述はない。Evans がその著作で集中して扱ったのは、ドメインモデルそのものの設計であり、そのモデルをどのようにアーキテクチャへ反映させるかという問いは次世代の課題として残された。
  10. [比較] アーキテクチャ ── Layered(Evans)vs Hexagonal(Vernon) アーキテクチャの選択はDDDの実践において中心的な関心事のひとつだ。Evansは青本でレイヤードアーキテクチャを提示し、Vernonは赤本でヘキサゴナルアーキテクチャをDDDの文脈で体系化した。本章では両者のアプローチを採用管理システムを題材に比較し、それぞれの設計判断の背景と実装への影響を整理する。
  11. [実装] TypeScriptで全パターンを繋げる 本章は、これまでの章で個別に解説した概念を1つのコードベースに統合する。対象は選考管理コンテキストの実装である。
  12. エピローグ ── EvansとVernonのどちらを選ぶか 各章の核心を以下に列挙する。