mizoguche.info

サービス - エリック・エヴァンスのDDD読んだメモ

概念的にどのオブジェクトにも属さないような操作は、サービスが引き受ける。

TL; DR

  • エンティティや値オブジェクトに置くと不自然な操作はサービスが引き受ける
  • サービスは状態を持たないこと
  • サービスはドメイン層だけでなく、アプリケーション層やインフラストラクチャ層にも存在する

サービス

  • ドメインの重要な操作でありながら、エンティティにも値オブジェクトにも落ち着き場所がない操作を提供する
  • エンティティと値オブジェクトのようには状態をカプセル化しない
  • 実態よりも活動、名刺よりも動詞にちなんで命名される傾向がある
  • 責務と責務を満たすインタフェースはドメインモデルの一部として定義すべき
  • 操作名はユビキタス言語に由来しなければならない
    • ユビキタス言語にないなら、ユビキタス言語に取り入れられなければならない

優れたサービスの3つの特徴

  • 操作がドメインの概念に関連していて、その概念がエンティティや値オブジェクトの自然な一部ではないこと
  • ドメインモデルの他の要素の観点からインタフェースが定義されていること
  • 操作に状態がないこと
    • どのクライアントでも、特定のサービスの任意のインスタンスを使うにあたって、インスタンスの持つ個々の履歴を気にする必要がない

サービスと隔離されたドメイン層

  • サービスはドメイン層だけで使用されるわけではない
  • ドメイン層に属するサービスを他のレイヤのサービスから区別すること
  • その区別をはっきり保つように責務を分解すること

レイヤごとのサービスの例

アプリケーション層

資金振替アプリケーションサービス

  • XMLなどの入力を理解する
  • 処理を実行するようドメインサービスにメッセージを送信する
  • 確認を待つ
  • インフラストラクチャサービスを使用して通知を送信することを決定する

ドメイン層

資金振替ドメインサービス

  • 必要な口座オブジェクトおよび元帳オブジェクトとやり取りし、適切な引き落としと振込を行う
  • 結果(振替の可否など)の証跡を出力する

インフラストラクチャ層

通知送信サービス

  • アプリケーションの指示に従って、電子メールや手紙、その他のメッセージを送信する

粒度

  • サービスは中粒度で状態を持たないので巨大なシステムで再利用しやすい
    • 細粒度のドメインオブジェクトを用いると、ドメイン層からアプリケーション層へ知識が流出するかもしれない
  • クライアントの操作や用途の広さよりも、インタフェースの単純さが優先される
4798121967
このエントリーをはてなブックマークに追加