ブログトップ 記事一覧 ログイン 無料ブログ開設

Strategic Choice

2011-05-26

[]ドメイン駆動設計・アプリケーション構築編・サービス

SERVICES

どのオブジェクトにも属さない操作

俯瞰図

所属するストーリの俯瞰図です。

どういうこと?

ドメインモデリングを進めていくと、概念的にどのオブジェクトにも属さないような操作が含まれることがあります。その場合、既存のオブジェクトに強引に押し込むのではなく、ドメインの輪郭に従って、「サービス」という形でモデルの中に組み込みます。

どうして?

ドメインから生まれる概念の中には、オブジェクトとしてモデル化すると不自然なものもあります。

  • 複数のエンティティにまたがる処理
  • 外部システムとの通信を伴う処理

こうした機能をエンティティや値オブジェクトの責務として押しつけると、モデルに基づくオブジェクトの定義を歪めてしまったり、意味のない不自然なオブジェクトを追加することになってしまいます。

どうすれば?

独立インターフェイスを作成

ドメインにおける重要なプロセスや変換処理が、エンティティや値オブジェクトの自然な責務ではない場合、その操作は、独立したインタフェース「サービス」としてモデルに追加します。

ドメインモデルは、手順的に、まずエンティティや値オブジェクトで考えて、そこにどうしても嵌らない操作のみ、サービスとして表現します。

操作名はユビキタス言語

モデルの言語を用いてインタフェースを定義し、操作名が必ずユビキタス言語の一部となるようにします。

状態を持たせない

サービスは、エンティティや値オブジェクトのように、状態をカプセル化しません。

たとえば?

銀行業務アプリケーション「資金振替」機能のモデルを、他のレイヤ*1を含めて考えます。

  • アプリケーション層
    • 資金振替アプリケーションサービス
      • 入力(XMLリクエストなど)を理解する。
      • 処理を実行するよう、ドメインサービスにメッセージを送信し、確認を待つ。
      • インフラストラクチャサーピスを使用して、通知を送信する。
  • ドメイン層
    • 口座エンティティ
    • 元帳エンティティ
    • 資金振替ドメインサービス
      • 口座オブジェクトおよび元帳オブジェクトとやり取りし、適切な引き落としと振り込みを行う。
      • 結果(振替の可否など)の証跡を出力する。
  • インフラストラクチャ層
    • 通知送信サービス
      • アプリケーションの指示に従って、電子メールや手紙、その他のメッセージを送信する。

関連

*1:ややこしいですが、サービスに限っては、ドメイン層以外にもその役割のオブジェクトは存在します。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証