2015年6月21日日曜日

[業務ロジック][機能単位][実装][サービス]DomainDrivenService

 直前までのいくつかの記事で、大規模システムの設計について記述してきた。本項以降では、実際に呼び出す業務ロジックが実装として最終的にどのようになるか、Javaを使って解説する。ここで紹介するのは1つのサンプルであり、必ずこうでなければならないというものではない。
 業務ロジックは最終的には画面からサーブレットなどを経由してAPIとして呼び出すか、バッチから呼び出すことになる。ソフトウェアの実装としては、両方の呼び出しに最初から対応した形式であると使い勝手が良い。ここでは業務ロジックの機能単位を「サービス」と呼び、サービスを呼び出す方法について記述する。
 まずサービスインターフェースの実装は、次の通りである。

package service;

import service.param.ServiceInputParameter;
import service.param.ServiceOutputParameter;

/**
 * ドメイン駆動サービス
 */
public interface DomainDrivenService {

    /**
     * サービスを実行します。
     *
     * @param sip
     *            サービス入力パラメータ
     * @return サービス出力パラメータ
     */
    public ServiceOutputParameter doService(ServiceInputParameter sip) throws BusinessRuleViolationException, ApplicationInternalException;
}

 ポイントは、次の通り。
 (1) パッケージは「service」などとし、それと分かるところに配置する。
 (2) サービスは、必ずServiceInputParameterを引数とする。
 (3) サービスは、必ずServiceOutputParameterを戻り値とする。
 (4) ビジネスルール違反時、BusinessRuleViolationExceptionをスローする。
 (5) プログラム的なエラーが起きた場合、ApplicationInternalExceptionをスローする。

 上記インターフェースではドメイン駆動の仕組みを使うサービスに、共通のインターフェースを与えるものである。ドメイン駆動は必須ではないが、過去の記事にある通りメンテナンス性が高い手法であるため、採用している。全てのサービス実行を「doService」という名前のメソッドで抽象化している。サービス入力パラメータ、サービス出力パラメータについても同様にクラスとすることで抽象化している。(パラメータのクラスについては、別途掲載する)

0 件のコメント:

コメントを投稿