Java上級

上級 Javaで学ぶドメイン駆動設計|解説編

導入

ドメイン駆動設計(DDD)は、ソフトウェア開発においてビジネスの複雑さを管理するための強力なアプローチです。特に、実務で遭遇する多様なビジネスルールや要件に対応するためには、しっかりとした設計が求められます。この記事では、上級Javaプログラマー向けに、具体的なシチュエーションを通じてドメイン駆動設計の概念を深掘りします。

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

重要な概念の整理

ドメイン駆動設計は、ソフトウェアが解決すべきビジネスの「ドメイン」に焦点を当て、ドメインモデルを中心に据えた設計手法です。ここでの「ドメイン」とは、特定のビジネス領域や問題領域を指し、ドメインモデルはその領域を表現するオブジェクトの集合です。DDDの核心には、以下のような概念があります:

  • エンティティ:一意の識別子を持つオブジェクト。
  • 値オブジェクト:不変で、属性によって定義されるオブジェクト。
  • 集約:エンティティとその関連する値オブジェクトを一つにまとめたもの。
  • リポジトリ:集約を永続化するためのインターフェース。

コード例(Java)


public class Order {
    private String orderId;
    private List items;
    private OrderStatus status;

    public Order(String orderId) {
        this.orderId = orderId;
        this.items = new ArrayList<>();
        this.status = OrderStatus.NEW;
    }

    public void addItem(Item item) {
        if (status != OrderStatus.NEW) {
            throw new IllegalStateException("Cannot add items to a completed order.");
        }
        items.add(item);
    }

    public void completeOrder() {
        status = OrderStatus.COMPLETED;
    }

    // getters and other methods
}

class Item {
    private String productId;
    private int quantity;

    public Item(String productId, int quantity) {
        this.productId = productId;
        this.quantity = quantity;
    }

    // getters
}

enum OrderStatus {
    NEW, COMPLETED
}

コードの行ごとの解説

  1. Orderクラス:注文を表すエンティティで、注文ID、アイテムのリスト、注文の状態を持つ。
  2. addItemメソッド:新しいアイテムを追加するメソッド。注文が完了している場合には例外を投げることで、ビジネスルールを強制する。
  3. completeOrderメソッド:注文を完了させるメソッド。状態を更新することで、アイテムの追加を制限する。
  4. Itemクラス:注文に含まれるアイテムを表現する値オブジェクト。商品IDと数量を持つ。
  5. OrderStatus列挙型:注文の状態を管理するための列挙型。注文のライフサイクルを明確にする。

解説編

この例では、注文管理システムにおける基本的なエンティティとビジネスルールを示しました。特に注意すべきは、状態に応じた振る舞いの制御です。注文が完了した後にアイテムを追加できないようにすることで、ビジネスの整合性を保っています。このような設計は、他のプログラミング言語でも同様のアプローチが可能であり、ドメイン駆動設計の原則は普遍的です。

まとめ

  • ドメイン駆動設計はビジネスの複雑さを管理するための有効な手法。
  • エンティティや値オブジェクトを適切に使うことで、ビジネスルールをコードに反映できる。
  • 状態に基づく振る舞いの制御は、システムの整合性を保つために重要。