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

ドメイン駆動設計(Domain-Driven Design: DDD)

1. DDDとは?(読み方:ディーディーディー)

DDD(ドメイン駆動設計:Domain-Driven Design)とは、ソフトウェア開発の設計手法の一つであり、ビジネスドメイン(業務領域)を中心に設計を進める方法論です。


2. DDDの基本概念

初学者向け説明

DDDは、単なるプログラムの作り方ではなく、「ビジネスを正しく理解し、それを設計に落とし込む」 ことを目的としています。
業務知識を整理しながら、実装につなげる手法です。

  • ドメイン(Domain) : ある業務領域やビジネスロジックのこと
  • ユビキタス言語(Ubiquitous Language) : 開発者とビジネス担当者が共通して使う言葉
  • エンティティ(Entity) : 一意の識別子を持つオブジェクト(例:注文、顧客)
  • 値オブジェクト(Value Object) : 識別子を持たないが意味を持つオブジェクト(例:住所、金額)

専門家向け説明

DDDでは、オブジェクト指向の原則に基づき、以下の概念を活用します。

概念 説明
アグリゲート(Aggregate) 関連するエンティティと値オブジェクトをグループ化し、整合性を保証する単位
リポジトリ(Repository) 永続化の詳細を隠蔽し、ドメインオブジェクトを取得・保存するインターフェース
サービス(Service) エンティティや値オブジェクトに属さない業務ロジックをカプセル化
ファクトリ(Factory) 複雑なオブジェクトの生成を管理するオブジェクト
境界付けられたコンテキスト(Bounded Context) システムの中で明確な境界を持つ独立した領域

3. DDDの全体フロー

graph TD;
  A[ビジネス要件の整理] --> B[ユビキタス言語の定義];
  B --> C[モデル設計(エンティティ、値オブジェクト、アグリゲート)];
  C --> D[リポジトリ・サービスの設計];
  D --> E[アプリケーション層の設計];
  E --> F[実装とテスト];
Loading

4. DDDの実装例(サンプルコード)

エンティティの実装例(注文)

public class Order {
    private final String orderId;
    private final Customer customer;
    private final List<OrderItem> items;
    private final LocalDateTime orderDate;
    
    public Order(String orderId, Customer customer, List<OrderItem> items) {
        this.orderId = orderId;
        this.customer = customer;
        this.items = new ArrayList<>(items);
        this.orderDate = LocalDateTime.now();
    }
    
    public BigDecimal getTotalPrice() {
        return items.stream()
                .map(OrderItem::getPrice)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}

値オブジェクトの実装例(住所)

public class Address {
    private final String street;
    private final String city;
    private final String zipCode;
    
    public Address(String street, String city, String zipCode) {
        this.street = street;
        this.city = city;
        this.zipCode = zipCode;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return street.equals(address.street) && 
               city.equals(address.city) && 
               zipCode.equals(address.zipCode);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(street, city, zipCode);
    }
}

5. まとめ

  • DDDはビジネスを中心に考え、コードの設計をする手法
  • ユビキタス言語を活用して、開発者とビジネス側が共通認識を持つことが重要
  • 実装ではエンティティ、値オブジェクト、アグリゲート、リポジトリなどを適切に設計する
  • DDDは複雑なドメインロジックの管理に適しているが、すべてのプロジェクトに適用すべきではない

以上がDDDの概要と実装例です!

⚠️ **GitHub.com Fallback** ⚠️