Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。最後に参考資料(3)サービスに実装するファクトリ次に、サービスに実装するファクトリを見ていきましょう。ファクトリを呼び出す部分から見ていきます。}}上記のコードは「ForumApplicationService」クラスの「AssignModeratorToForum」メソッドで、フォーラムにモデレーターをアサインしています。この中で、ファクトリの「GetModeratorFrom」を呼び出していることが分かります。ドメインサービス上のファクトリのコード例このファクトリのコードを見てみましょう。このドメインサービスでは「Get<生成する種類>From」という複数のファクトリのメソッドが用意されています。戻り値として「投稿者/作成者/モデレーター/所有者/参加者」のインスタンスを生成して戻しています。}}6章の「値オブジェクト」でも紹介した通り、「人」という概念でも、認証・アクセスコンテキストでは「ユーザー/ロール」というモデルになったり、コラボレーションコンテキストでは「投稿者/作成者/モデレーター/所有者/参加者」という別のモデル(ユビキタス言語)になったりします。IDDDにおけるサービスの「ファクトリ」メソッドの例このように他の境界づけられたコンテキストの情報を使ってオブジェクトを生成する時にもファクトリを使用します。このオブジェクトの生成に関する主要なクラス群は下図の通りです。他のコンテキストを参照する「ファクトリ」の実装例(Java)このファクトリでは、認証アクセスコンテキストの公開ホストサービスを呼び出してユーザー情報を取り出し、必要とするコラボレータの派生クラスを生成しています。RESTサービスを呼び出したり、型の変換を行ったりと、生成処理は複雑ですが、ファクトリを呼び出すクライアント側では、その複雑さが見えないように実装できていることが分かります。この具体的な実装については、GitHubのコード(ドメインモデル側やインフラストラクチャ側)を見てみると良いでしょう。以上、サービス上のファクトリにて、境界づけられたコンテキスト間の変換が可能なことが理解できたかと思います。[コラム]優れたファクトリとデザインパターン優れたファクトリの設計について、エヴァンス氏はDDD本において下記のように述べています。複雑な組み立てをすべてカプセル化するインターフェイスを提供すること。その際に、インスタンス化されるオブジェクトの具象クラスを、クライアントが参照しなくても良いようにすること。この説明として、優れたファクトリは「生成される具象クラスではなく、要求される型に応じて抽象化されないといけない」と述べています。これらを満たすファクトリの実装には、書籍「オブジェクト指向の再利用のためのデザインパターン」の「ファクトリメソッド」「アブストラクトファクトリ」「ビルダー」といったプログラミングパターンがよく使われます。変換を行う場合には「アダプター」パターンがよく使用されます。これらのデザインパターンに興味がある方は、書籍や各リンク先のページをご覧いただくと良いでしょう。最後に本稿ではDDDにおけるファクトリについて紹介しました。オブジェクト生成を担当するシンプルな考え方ですが、設計指針や生成パターンがあることが理解できたと思います。次回の第12回ではDDDの「リポジトリ」について紹介します。