😸
ドメイン駆動設計(DDD) 単語集
ドメイン駆動設計(DDD) 単語集
ドメイン駆動設計(DDD)を学んでいて思ったこと。
単語が多い!!!
個人的にはこの「単語の多さ」がドメイン駆動をわかりにくくしてる要素の1つでもあると感じております。実際、DDDの考え自体はエヴァンス本から来ていますが、アプリケーションアーキテクチャや周辺技術は他の本を読まなければ理解できなかったりしてこんがらがります。
「どの単語が何に由来するのか」も分かりづらく、何がDDDで何がそうでないのか混乱しそうです。
なので、ChatGPTに隅から隅まで網羅させてみました。
ドメイン駆動(DDD)
まずはDDDの基本から。
用語 | 説明 |
---|---|
ドメイン(Domain) | ソフトウェアで解決したい問題領域のこと。現実世界のビジネスやルールを表します。 |
モデル(Model) | ドメインをソフトウェア的に表現したもの。クラスやロジックに落とし込んだかたち。 |
ユビキタス言語(Ubiquitous Language) | エンジニアとドメインエキスパートが共通して使う言葉。ドキュメントにもコードにも登場。 |
境界づけられたコンテキスト(Bounded Context) | 特定の意味でモデルや用語が一貫して使われる「言葉と振る舞いのまとまり」。コンテキストごとにユビキタス言語や設計方針が変わることがあり、組織構造やチーム構成にも影響する重要な単位。 |
サブドメイン(Subdomain) | ドメインをさらに細かく分けた領域。コア、サポート、汎用の3つに分類されることが多い。 |
ドメインエキスパート | ドメインに関する知識を持っている人。DDDにおいては、この人の言うことが金言。 |
アーキテクチャパターン
DDDは設計思想ですが、実装にあたってよく使われるアーキテクチャもあります。それぞれに関連用語が存在し、理解を深める助けになります。
用語 | 説明 |
---|---|
レイヤードアーキテクチャ(Layered Architecture) | プレゼンテーション、アプリケーション、ドメイン、インフラといったレイヤーに分ける構造。レイヤー間の依存関係がポイント。各レイヤーに対応する責任を持つ。 例:Controller, Service, Repository。 |
クリーンアーキテクチャ(Clean Architecture) | ドメインを中心に置いた同心円構造のアーキテクチャ。依存性逆転の原則がキモ。 例:UseCase、Entity、Interface Adapterなどのレイヤーに分かれる。 |
ヘキサゴナルアーキテクチャ(Hexagonal Architecture) | 別名「Ports and Adapters」。外部との接続部分(例:DB、UI)を明示して柔軟な構成を可能にする。 例:Port、Adapter、Primary/Secondary Adapter。 |
オニオンアーキテクチャ(Onion Architecture) | ドメインモデルを中心に据えた同心円構造。インフラは最外周に位置し、中心のドメインに依存しない。クリーンアーキテクチャと似ているが、よりDDD寄りに構成される。 例:Core Domain、Application Services、Infrastructure。 |
CQRS(Command Query Responsibility Segregation) | 読み取りと書き込みを分けて考えるパターン。スケーラビリティに有効。Command(書き込み)とQuery(読み取り)を明確に分離。 |
Event Sourcing | データの状態を「イベントの履歴」で管理する方法。履歴をたどって現在を導く。 関連用語:ドメインイベント、イベントストア、再構築(Rehydration)。 |
戦術的パターン(Tactical Patterns)
用語 | 説明 |
---|---|
エンティティ(Entity) | 一意の識別子(ID)を持ち、ライフサイクルを通じて識別されるクラス。 例:データベースのテーブルや User クラスのような設計に該当。 |
値オブジェクト(Value Object) | イミュータブルなオブジェクトで、値そのものが重要。 例: Money 、Address など。equals やhashCode を実装して等価性を重視する。 |
集約(Aggregate) | 関連するエンティティや値オブジェクトのまとまり。外部からのアクセスは集約ルートを経由して行い、整合性を保つ。トランザクション境界の単位。 |
集約ルート(Aggregate Root) | 集約内の代表エンティティ。他のオブジェクトはこのルート経由でしかアクセスできないように制御される。 |
リポジトリ(Repository) | 集約ルートを取得・保存するためのインターフェース。 例: UserRepository 。インフラ層の実装を隠蔽し、永続化の責務を持つ。 |
ファクトリ(Factory) | 複雑な集約やエンティティの生成処理をカプセル化。 例: static factory method やFactoryクラス などで表現される。 |
ドメインサービス(Domain Service) | 1つのエンティティや値オブジェクトに属さないビジネスロジックを実装。純粋関数に近く、TransferService のような形で表現されることが多い。 |
アプリケーションサービス | ユースケース単位でアプリケーションの振る舞いをまとめる。ドメインサービスやリポジトリを組み合わせて業務処理を構成。Controllerの下に置かれることが多い。 |
その他の関連用語
用語 | 説明 |
---|---|
アンチコラプションレイヤー(ACL) | 外部システムのモデルが自分のモデルに「悪影響」を与えないように守るレイヤー。 |
コンテキストマップ | 境界づけられたコンテキスト間の関係を図示したもの。協調、共有、分離などの関係性を表す。 |
セパレート・ウェイ(Separate Ways) | チーム・コード・モデルが完全に分離されている関係。交流なし。 |
パブリッシュ・サブスクライブ(Publish-Subscribe) | ドメインイベントなどを通知するためのイベント駆動な仕組み。 |
おわりに
用語が多いと混乱しますが、「とりあえず一通り見ておいて、必要な時に戻ってくる」くらいのライトな使い方でも十分だと思っています。
また、私自身完全に理解できているわけではないので、もし間違いがあればご指摘ください。
Discussion