【アーキテクチャ】ドメイン駆動設計(DDD) - j-komatsu/myCheatSheet GitHub Wiki

ドメイン駆動設計(DDD)

1. 概要

ドメイン駆動設計(DDD: Domain-Driven Design) は、ソフトウェア設計の手法の一つであり、ビジネスロジック(ドメイン)を中心にシステムを構築する考え方です。


初学者向け

DDDとは?

DDDは、ビジネス上の課題(ドメイン)を解決するために、ソフトウェアの構造をドメインに基づいて設計する方法です。単なる技術的な設計ではなく、ビジネスの専門家(ドメインエキスパート)とエンジニアが協力してシステムを作ることが特徴です。

項目 説明
ドメイン ビジネス領域(例:ECサイトなら「注文管理」)
エンティティ IDを持ち、一意性を持つオブジェクト(例:注文)
値オブジェクト IDを持たず、属性だけで判断されるオブジェクト(例:金額)
集約 いくつかのエンティティをまとめた単位(例:注文とその明細)
リポジトリ データを永続化するための仕組み(例:データベース)
サービス エンティティに持たせるべきでないロジックを実装する層
ユビキタス言語 開発者とビジネス側が共通で使う言葉

図で理解するDDDの概念

classDiagram
    class Entity {
        - ID
        - 属性
    }
    class ValueObject {
        - 属性のみ
    }
    class Aggregate {
        - ルートエンティティ
        - 複数のエンティティを管理
    }
    class Repository {
        - エンティティの永続化
    }
    Entity --|> ValueObject
    Aggregate --|> Entity
    Aggregate --|> Repository

専門者向け

DDDの原則

  • 境界づけられたコンテキスト(Bounded Context):システムを小さな意味的領域に分割し、それぞれの領域を独立して管理する
  • ユビキタス言語(Ubiquitous Language):開発チームとビジネス側が共通の用語を使用することで、認識のずれを防ぐ
  • アグリゲート(Aggregate):一貫性を保つためのデータのグループ単位を定義し、外部からの直接変更を制限する

DDDの実装例(TypeScript)

class Order {
    private orderId: string;
    private amount: number;

    constructor(orderId: string, amount: number) {
        this.orderId = orderId;
        this.amount = amount;
    }

    getOrderId(): string {
        return this.orderId;
    }
    getAmount(): number {
        return this.amount;
    }
}

DDDのメリット・デメリット

メリット デメリット
ビジネスロジックの明確化 学習コストが高い
ソフトウェアの保守性向上 小規模開発にはオーバースペックになる可能性
開発者とビジネス側の認識統一 設計に時間がかかる

まとめ

DDDは、単なる技術的なアプローチではなく、ビジネスと開発の間に共通認識を持たせるための設計手法です。適切に適用することで、スケーラブルで保守しやすいシステムを構築できます。