SHOEISHA iD

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

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

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

実践DDD本 第7章「ドメインサービス」~複数の物を扱うビジネスルール~

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

ドメインサービスの設計方法

 最後にドメインサービスの設計方法について紹介します。ドメインサービスの設計ポイントは次の2つです。

  1. セパレートインターフェイスが必要かどうか検討
  2. サービスの生成方法を検討

セパレートインターフェイスとは

 セパレートインターフェイスとは、マーチン・ファウラー氏が、書籍「エンタープライズ アプリケーション アーキテクチャ(PofEAA:2005年)」にて紹介しているパターンです。

セパレートインターフェイス
セパレートインターフェイス

 実装クラスとは別のパッケージでインターフェイスを定義することを「セパレートインターフェイス」と呼びます。上図では「IEncryptionService」がインターフェイスで、「MD5EncryptionService」が実装クラスです。このパターンのメリットは、実装クラスもクライアントもインターフェイスに依存するため、依存関係が複雑にならないことです。

セパレートインターフェイスを導入する理由

 通常の開発では、システム間の結合度を下げるために、クラスをパッケージ(JavaではJar、.NETではDLL)にまとめて依存関係を管理します。例えば、アプリケーション層のパッケージからドメイン層のパッケージは呼び出し可能ですが、その逆は不可という制約をかけています。しかし、単純な依存関係では管理できない場合があります。

 SaaSOvationの例の場合、暗号化サービスに関して、現在はMD5方式による暗号化を行っていますが、今後、別の暗号化方式が採用される可能性があります。このようなときにセパレートインターフェイスを導入して実装クラスを分離するメリットがあります。

実装クラスとセパレートインターフェイスの使い分け[C#]
実装クラスとセパレートインターフェイスの使い分け[C#]

実装クラスとセパレートインターフェイスの使い分け

 なお、必ずしもセパレートインターフェイスが必要なわけではありません。暗号化サービスのクライアントである認証サービス「AuthenticationService」には、インターフェイスが存在していません。理由としては現時点で複数の実装が存在していないためで、今後実装クラスを差し替える可能性があればセパレートインターフェイスを使えばよいとしています。

サービスの生成方法(セパレートインターフェイスの場合)

 セパレートインターフェイスの場合、インターフェイスと実装をひも付ける方法として、大きく分けて次の3つの方法が紹介されています。

  1. コンスタラクタやメソッドのパラメータを使って、インスタンスを設定する
  2. オブジェクトを生成する(サービス)ファクトリを使う
  3. SpringやUnity ContainerなどのIoC/DIコンテナを用いて、サービスのインスタンスを注入する(依存性の注入)

 IDDD本ではどれが正解とは明言せず、状況に応じた選択をするとよいとしています。ただし、GitHubのSaaSOvationのサンプルも含めDIコンテナの普及により、最近は3番目の依存性の注入が使われることが多いようです。

最後に

 以上、本稿ではDDDのサービスについて紹介し、DDDにおけるサービスの役割、分類、実装ポイントなどを解説しました。ドメインサービスを適切に導入することで、ドメインモデルを適切に表現できることが理解できたと思います。第8回ではDDDの「ドメインイベント」について紹介します。

参考資料

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
IDDD本から理解するドメイン駆動設計連載記事一覧

もっと読む

この記事の著者

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10318 2017/09/05 16:32

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング