ドメイン駆動設計では「アプリケーションサービス」と「ドメインサービス」の二つのサービスがあります。ここでは「ドメインサービス」について解説します。
ドメインサービスとは?
「値オブジェクト」や「ドメインオブジェクト」には振る舞い(文字数制限や文字種など)が記述されます。ただ、それらのドメインオブジェクトでは表現しにくいオブジェクトも存在します。そういったものを表現するのに適したオブジェクトが「ドメインサービス」になります。
用途
Repositoryを使った処理
ユーザーの重複を確認するコードを、Userクラスに書くのはUser.existsなどとなって不自然。UserServiceなどのドメインサービスを定義してそこにexistsメソッドを追加するのが自然です。
基本的に、重複チェックなどの入出力(DBからデータの取得)などが伴う処理はアプリケーションの関心ごとであり、ドメインサービスに記述するのはあまり望ましくないと言われていますが、重複チェックなどはドメインに関連することなので記述するのも良いとは思います。
複数のドメインオブジェクトを使った処理
複数の関連するドメインオブジェクトを使って計算する処理などもドメインオブジェクトではなく、ドメインサービスに記述した方が良いでしょう。
特徴
値オブジェクトやエンティティと異なり「ドメイン特有のインスタンス変数」を持ちません。
あくまでドメインサービスは振る舞いに特化したクラスになります。
注意点
ドメイン特有のインスタンス変数は持ちませんが、「アプリケーション特有のインスタンス変数」は持ちます。(例えば、DBに接続するためにRepositoryを持つなどです)
注意点
なんでもかんでもドメインサービスに記述しないこと
例えば、ユーザーの名前を変更するChangeNameメソッドなども全てドメインサービスに記述できてしまいます。
しかし、なんでもドメインサービスに記述するのではドメインオブジェクトの利点を活用しきレテレテいません。
ユーザー名の変更などの自然な振る舞いはクラスから分離して、クラスを見ただけですぐに判断できる状態が望ましいです。
ドメインサービスから別のドメインサービスを切り出すことも考えること
例えば、部署クラスの中に、別の部署に荷物を配送する処理(例えば、配送メソッド)を記述することになったとして配送処理の中でユーザーに直接関係ないような複雑な処理などを記述することになりそうであるならば配送クラスとして別のドメインサービスとして切り出すことも検討します。
この記事へのコメントはありません。