Java上級

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

導入

ドメイン駆動設計(DDD)は、複雑なビジネスロジックを扱う際に非常に有効なアプローチです。特に、エンタープライズアプリケーションにおいては、ビジネスのニーズに応じた柔軟な設計が求められます。本記事では、DDDの実践的な側面に焦点を当て、特定のシナリオを通じて理解を深めます。

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

重要な概念の整理

ドメイン駆動設計では、ビジネスドメインを中心に据え、実際のビジネスプロセスを反映したモデルを構築します。これにより、コードとビジネスの整合性が高まり、変更が発生した際にも柔軟に対応できるようになります。特に、エンティティ、バリューオブジェクト、集約、リポジトリといった概念が重要です。

コード例(Java)


public class Order {
    private final String orderId;
    private final List items;
    private final Customer customer;

    public Order(String orderId, List items, Customer customer) {
        this.orderId = orderId;
        this.items = items;
        this.customer = customer;
    }

    public double calculateTotal() {
        return items.stream()
                    .mapToDouble(Item::getPrice)
                    .sum();
    }

    // その他のメソッド
}

public class Item {
    private final String itemId;
    private final double price;

    public Item(String itemId, double price) {
        this.itemId = itemId;
        this.price = price;
    }

    public double getPrice() {
        return price;
    }
}

public class Customer {
    private final String customerId;
    private final String name;

    public Customer(String customerId, String name) {
        this.customerId = customerId;
        this.name = name;
    }
}

コードの行ごとの解説

  1. Orderクラスは、注文を表現するエンティティです。注文ID、アイテムリスト、顧客情報を持ちます。
  2. calculateTotalメソッドは、注文内の全アイテムの価格を合計して返します。このロジックは、ビジネスルールに基づいており、変更があった場合にも容易に修正できます。
  3. Itemクラスは、個々のアイテムを表現し、価格を取得するメソッドを持っています。これにより、アイテムに関連する情報を明確に管理できます。
  4. Customerクラスは、顧客の情報を保持します。顧客IDや名前を管理し、他のクラスとの関連性を持たせます。

練習問題編

以下の練習問題に挑戦してみてください。各問題に対して模範解答と解説を用意しました。

  1. 問題1: Orderクラスに、アイテムを追加するメソッドを実装してください。
  2. 模範解答:

    
    public void addItem(Item item) {
        items.add(item);
    }
    

    解説: このメソッドは、Orderクラスのitemsリストに新しいアイテムを追加する役割を果たします。

  3. 問題2: Orderクラスに、顧客情報を更新するメソッドを実装してください。
  4. 模範解答:

    
    public void updateCustomer(Customer customer) {
        this.customer = customer;
    }
    

    解説: 顧客情報を変更するためのメソッドです。新しいCustomerオブジェクトを受け取って、フィールドを更新します。

  5. 問題3: Orderクラスに、アイテムの合計数を計算するメソッドを実装してください。
  6. 模範解答:

    
    public int getTotalItemCount() {
        return items.size();
    }
    

    解説: このメソッドは、注文内のアイテムの数を返します。シンプルですが、ビジネスロジックにおいて重要な情報です。

まとめ

  • ドメイン駆動設計は、ビジネスロジックを中心に据えた設計手法です。
  • エンティティやバリューオブジェクトの概念を理解し、実際の業務に適用することで、柔軟なシステムを構築できます。
  • 練習問題を通じて、実践的なスキルを磨くことが重要です。