コマンドオブジェクトとは?
「アプリケーションサービス」の処理(登録処理や更新処理)を呼ぶ際に、今後の変更でいちいちシグネチャが変わってしまう可能性があります。
「アプリケーションサービス」のメソッドのシグネチャが増えるたびにいちいちメソッドを書き換えなくても良いように、シグネチャを管理するためのオブジェクトです。
近年の開発ではコードチェックツールのリンターなどを使って開発することが多いと思いますが、「シグネチャの数が多すぎないか」や「メソッドの行数が長すぎないか」もチェックに入っているリンターも多いかと思いますが、その対策にもなります。
実装
ユーザー登録処理(UserApplicationServiceクラスのRegisterメソッド)であれば、「UserRegisterCommand」という名前をとり、メンバにはユーザー名などを取ります。
コマンドオブジェクト
1 2 3 4 5 |
class UserRegisterCommand { ユーザーid; ユーザー名; メールアドレス; } |
使う側
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class UserApplicationService { IUserRepository userRepository; public void Register(UserRegisterCommand command) { if (command.ユーザー名 === null) { throw new Exception("ユーザー名が指定されていません。") } if (command.メールアドレス=== null) { throw new Exception("メールアドレスが指定されていません。") } var user = new User(command.ユーザー名,command.メールアドレス) userRepository.Save(user); } } |
今後ユーザーに項目が増えた場合(例えば、年齢が増えた場合)などでもコマンドオブジェクトに追加す流だけで、アプリケーションサービス側のシグネチャをいちいちいじる必要がなくなります。
注意点
あくまで特定のメソッドを実行する際のシグネチャを生成するために使います。「アプリケーションサービス」クラスの初期化のために使うものではないので注意てです。(その役割はDIやDIコンテナとかになります。)
この記事へのコメントはありません。