Java中級

中級 Javaで学ぶドメイン駆動設計|練習問題編

導入

ドメイン駆動設計(DDD)は、複雑なビジネスロジックを効果的にモデル化するためのアプローチです。特に、ビジネスの要件が頻繁に変わる現場では、ドメインの理解がシステム全体の品質に直結します。本記事では、特定の業務シナリオに基づいたドメイン駆動設計の実践方法を探ります。

教科書レベルの解説(ドメイン駆動設計)

重要な概念の整理

ドメイン駆動設計では、ビジネスドメインを中心にシステムを構築します。以下の概念が特に重要です:

  • エンティティ:一意の識別子を持ち、ライフサイクルを通じて変化するオブジェクト。
  • 値オブジェクト:識別子を持たず、属性の集合として扱われるオブジェクト。
  • アグリゲート:関連するエンティティと値オブジェクトの集まり。整合性を保つためのルートエンティティが存在する。
  • リポジトリ:アグリゲートを永続化するためのインターフェース。

コード例(Java)


import java.util.HashMap;
import java.util.Map;

class Product {
    private final String id;
    private String name;
    private double price;

    public Product(String id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

class ProductRepository {
    private final Map productStore = new HashMap<>();

    public void addProduct(Product product) {
        productStore.put(product.getId(), product);
    }

    public Product findById(String id) {
        return productStore.get(id);
    }
}

public class Main {
    public static void main(String[] args) {
        Product product = new Product("1", "Laptop", 1500.00);
        ProductRepository repository = new ProductRepository();
        repository.addProduct(product);

        Product fetchedProduct = repository.findById("1");
        System.out.println("Fetched Product: " + fetchedProduct.getName() + " - Price: " + fetchedProduct.getPrice());
    }
}

コードの行ごとの解説

  1. クラス Product を定義し、プロダクトの属性(ID、名前、価格)を持たせる。
  2. コンストラクタで属性を初期化し、ゲッターとセッターを提供する。
  3. クラス ProductRepository を実装し、プロダクトを管理するためのメソッドを持つ。
  4. プロダクトの追加および取得を行うメソッドを実装し、内部に HashMap を使用する。
  5. メインメソッドでプロダクトを作成し、リポジトリに追加した後、取得して表示する。

練習問題編

以下の練習問題に挑戦して、ドメイン駆動設計の理解を深めましょう。

  1. 問題1:エンティティと値オブジェクトの違いを説明してください。
  2. 問題2:アグリゲートの役割について述べ、具体的な例を挙げてください。
  3. 問題3:リポジトリパターンを使用するメリットは何ですか?
  4. 問題4:以下のコードに対して、値オブジェクトを用いる場合の修正を提案してください。
  5. 
    class Order {
        private String orderId;
        private String productId;
        private int quantity;
    }
    
  6. 問題5:ドメイン駆動設計における境界づけられたコンテキストの重要性を説明してください。

まとめ

  • ドメイン駆動設計は、ビジネスロジックを中心にシステムを構築するための強力な手法です。
  • エンティティ、値オブジェクト、アグリゲート、リポジトリの概念を理解し、実装に活かすことが求められます。