JavaScript中級

中級 JavaScriptで学ぶドメイン駆動設計|ケーススタディ編

導入

ドメイン駆動設計(DDD)は、複雑なビジネスロジックをシステムに適切に反映させるためのアプローチです。このケーススタディでは、架空のオンライン書店プロジェクトを通じて、JavaScriptを用いたDDDの適用方法を探ります。具体的なビジネスドメインを持つシステムの設計において、どのようにドメインモデルを構築し、実装するかを考察します。

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

重要な概念の整理

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

  • エンティティ: 一意に識別されるオブジェクト。例えば、書籍や著者など。
  • バリューオブジェクト: 属性で定義され、同一性を持たないオブジェクト。価格やISBNなどが該当します。
  • アグリゲート: 関連するエンティティとバリューオブジェクトの集合。整合性を保つための単位です。
  • リポジトリ: データの永続化を担当するオブジェクト。エンティティやアグリゲートの取得・保存を行います。

コード例(JavaScript)


// 書籍エンティティの定義
class Book {
    constructor(id, title, author, price) {
        this.id = id;
        this.title = title;
        this.author = author;
        this.price = price; // バリューオブジェクトとしての価格
    }
}

// 書籍のリポジトリ
class BookRepository {
    constructor() {
        this.books = new Map(); // 書籍を管理するためのマップ
    }

    add(book) {
        this.books.set(book.id, book);
    }

    findById(id) {
        return this.books.get(id);
    }

    findAll() {
        return Array.from(this.books.values());
    }
}

// 使用例
const bookRepo = new BookRepository();
const book1 = new Book(1, "JavaScript Basics", "John Doe", 2000);
bookRepo.add(book1);
console.log(bookRepo.findAll());

コードの行ごとの解説

  1. 1行目: 書籍エンティティを定義するクラスを作成。
  2. 2行目: コンストラクタで書籍の属性を初期化。
  3. 9行目: 書籍を管理するリポジトリクラスを定義。
  4. 10行目: 書籍を格納するためのマップを初期化。
  5. 12行目: 書籍をリポジトリに追加するメソッド。
  6. 15行目: IDで書籍を検索するメソッド。
  7. 18行目: すべての書籍を取得するメソッド。
  8. 21行目: リポジトリの使用例。書籍を追加して出力。

ケーススタディ編

架空のオンライン書店プロジェクトでは、書籍を管理するシステムを開発しています。初期段階では、シンプルなリポジトリを用いて書籍を管理していますが、ビジネスが拡大するにつれて、複雑な要件が増えてきました。特に、書籍の価格変更や在庫管理が必要となり、エンティティ間の整合性を保つことが課題となりました。

この場合、アグリゲートを導入することで、書籍の価格や在庫を一元管理し、ビジネスロジックを明確にすることが可能です。また、リポジトリパターンを用いることで、データの永続化をより効率的に行えるようになります。

例えば、書籍の価格を変更する際には、関連する在庫情報も同時に更新する必要があります。これをアグリゲートとしてまとめることで、整合性を保ちながら変更を行うことができます。このように、ドメイン駆動設計を適用することで、システムの可読性と保守性が向上します。

まとめ

  • ドメイン駆動設計は、ビジネスロジックを中心にシステムを構築する手法である。
  • エンティティやバリューオブジェクト、アグリゲートの概念を理解し、適切に使用することが重要。
  • 実際の業務においては、複雑な要件に対応するための設計が求められる。