ユースケースの概要
from ユースケースの実装
ユースケース は以下のフローで処理を進める
1. 受信アダプタ から入力値を受け取る
筆者は、入力値の妥当性チェック はここでは行わない ほうが良いと考えている
ユースケース(ドメイン層)は ビジネスロジック に注力すべきであり、このチェックは ビジネスロジックに含まれない
代わりに、アプリケーション層 で行う
入力値の妥当性チェック
シリアライズのための設計#66ad875075d04f000096799b
2. ビジネスルールに関する妥当性チェックを行う
「ビジネスルールに関する妥当性チェック」はユースケースの責務
ドメインモデル と共に担う
3. ドメインオブジェクト(エンティティ)の状態を変える
一般的に、変更したエンティティの状態は 永続化 する
そのため、エンティティは永続化 アダプタ によって実装される 送信ポート に渡される
もし、永続化以外の副作用 を持つ処理が存在する場合、他の適切な送信ポートも呼び出す
4. 処理結果を返す
送信ポートから受け取った値を別のオブジェクトに変換する
このユースケースの呼び出し元である 受信アダプタ に返す
hr.icon
上記を踏まえて、「送金する」ユースケースを実装する
radish-miyazaki.icon による Go のサンプルコード
warning.icon SendMoneyService は 受信ポートである SendMonyServiceUseCase インタフェースを満たすものとする
code:buckpal/application/domain/service/send_money_service.go
type SendMoneyService struct {
loadAccountPort LoadAccountPort
updateAccountStatePort UpdateAccountStatePort
}
// ...
func (s *SendMoneyService) SendMoney(command SendMoneyCommand) bool {
// 詳細は次の章以降
}
SendMoney が呼び出されると、
1. 送信ポートとなる LoadAccountPort インタフェースを呼び出し、口座の状態を取得する
2. 取得した口座の状態を持ったエンティティを使って送金を行い、状態を変更する
3. 新しくなった口座の状態を DB に保存するため、 送信ポートとなる UpdateAccountStatePort を呼び出す
idea.icon LoadAccountPort と UpdateAccountStatePort を一緒に使う頻度が高ければ、より大きな 1 つのインタフェースにするのも手
code:go
type AccountRepositoryPort {
LoadAccountPort
UpdateAccountStatePort
}
コンポーネント間の関係を図式化する
https://scrapbox.io/files/66c0bc2066e9c4001cff2949.png