SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

IDDD本から理解するドメイン駆動設計

実践DDD本 第11章「ファクトリ」~複雑な生成をユビキタス言語でシンプルに~

IDDD本から理解するドメイン駆動設計 第11回

(3)サービスに実装するファクトリ

 次に、サービスに実装するファクトリを見ていきましょう。まず、ファクトリを呼び出す部分から見ていきます。

[リスト]ファクトリを呼び出すアプリケーションサービス(C#)
namespace SaaSOvation.Collaboration.Application.Forums
{
  // フォーラムのアプリケーションサービス
  public class ForumApplicationService
  {
    // フォーラムにモデレーターをアサインする
    public void AssignModeratorToForum(string tenantId, 
      string forumId, string moderatorId)
    {
      var tenant = new Tenant(tenantId);
      var forum = this.forumRepository.Get(tenant, new ForumId(forumId));

      // ファクトリ「GetModeratorFrom」経由でモデレーターを生成する
      var moderator = this.collaboratorService.GetModeratorFrom(tenant, moderatorId);

      forum.AssignModerator(moderator);
      this.forumRepository.Save(forum);
    }
  }
}

 上記のコードは「ForumApplicationService」クラスの「AssignModeratorToForum」メソッドで、フォーラムにモデレーターをアサインしています。この中で、ファクトリの「GetModeratorFrom」を呼び出していることが分かります。

ドメインサービス上のファクトリのコード例

 このファクトリのコードを見てみましょう。このドメインサービスでは「Get<生成する種類>From」という複数のファクトリのメソッドが用意されています。戻り値として「投稿者/作成者/モデレーター/所有者/参加者」のインスタンスを生成して戻しています。

[リスト]コラボレーションコンテキストのオブジェクトを生成するファクトリ(C#)
namespace SaaSOvation.Collaboration.Domain.Model.Collaborators
{
  // 変換用のドメインサービス
  public interface ICollaboratorService
  {
      // 投稿者を生成して取得
      Author GetAuthorFrom(Tenant tenant, string identity);

      // 作成者を生成して取得
      Creator GetCreatorFrom(Tenant tenant, string identity);

      // モデレーターを生成して取得
      Moderator GetModeratorFrom(Tenant tenant, string identity);

      // 所有者を生成して取得
      Owner GetOwnerFrom(Tenant tenant, string identity);

      // 参加者を生成して取得
      Participant GetParticipantFrom(Tenant tenant, string identity);
  }
}

 6章の「値オブジェクト」でも紹介した通り、「人」という概念でも、認証・アクセスコンテキストでは「ユーザー/ロール」というモデルになったり、コラボレーションコンテキストでは「投稿者/作成者/モデレーター/所有者/参加者」という別のモデル(ユビキタス言語)になったりします。

IDDDにおけるサービスの「ファクトリ」メソッドの例
IDDDにおけるサービスの「ファクトリ」メソッドの例

 このように他の境界づけられたコンテキストの情報を使ってオブジェクトを生成する時にもファクトリを使用します。このオブジェクトの生成に関する主要なクラス群は下図の通りです。

他のコンテキストを参照する「ファクトリ」の実装例(Java)
他のコンテキストを参照する「ファクトリ」の実装例(Java)

 このファクトリでは、認証アクセスコンテキストの公開ホストサービスを呼び出してユーザー情報を取り出し、必要とするコラボレータの派生クラスを生成しています。RESTサービスを呼び出したり、型の変換を行ったりと、生成処理は複雑ですが、ファクトリを呼び出すクライアント側では、その複雑さが見えないように実装できていることが分かります。

 この具体的な実装については、GitHubのコード(ドメインモデル側インフラストラクチャ側)を見てみると良いでしょう。

 以上、サービス上のファクトリにて、境界づけられたコンテキスト間の変換が可能なことが理解できたかと思います。

[コラム]優れたファクトリとデザインパターン

 優れたファクトリの設計について、エヴァンス氏はDDD本において下記のように述べています。

 複雑な組み立てをすべてカプセル化するインターフェイスを提供すること。その際に、インスタンス化されるオブジェクトの具象クラスを、クライアントが参照しなくても良いようにすること。

 さらにこの説明として、優れたファクトリは「生成される具象クラスではなく、要求される型に応じて抽象化されないといけない」と述べています。

 これらを満たすファクトリの実装には、書籍「オブジェクト指向の再利用のためのデザインパターン」の「ファクトリメソッド」「アブストラクトファクトリ」「ビルダー」といったプログラミングパターンがよく使われます。また、変換を行う場合には「アダプター」パターンがよく使用されます。これらのデザインパターンに興味がある方は、書籍や各リンク先のページをご覧いただくと良いでしょう。

最後に

 本稿ではDDDにおけるファクトリについて紹介しました。オブジェクト生成を担当するシンプルな考え方ですが、設計指針や生成パターンがあることが理解できたと思います。次回の第12回ではDDDの「リポジトリ」について紹介します。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
IDDD本から理解するドメイン駆動設計連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10903 2018/06/26 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー