Slide 25
Slide 25 text
© LY Corporation
Public
25
その他に採用したデザインパターン
シナリオクラスによって
ユースケースの流れを整理する public class CandidateScenario {
......
public Coupons candidate(User user, Basket basket) {
// 1. ドメインサービスの呼び出し
CompletableFuture futureCoupons = couponService.fetch(user, basket);
CompletableFuture futureBasket = basketService.complete(basket);
CompletableFuture futureUser = userService.complete(user);
// 2. 三者のドメインモデルがそろうまで待機
CompletableFuture.allOf(futureCoupons, futureUser, futureBasket).join();
// 3. ドメインモデルを取得
Coupons coupons = futureCoupons.join();
Basket completedBasket = futureBasket.join();
User completedUser = futureUser.join();
// 4. パーソナライズ判定による判定を行う(マイクロサービスへ)
Judgements judgements = judgementService.judge(coupons, completedBasket, completedUser);
// 5. 「適用可能なクーポン一覧」という集約を生成する
CandidatesAggregate aggregate = CandidatesAggregateFactroy.create(coupons, completedBasket,
completedUser, judgements);
return aggregate;
}
}
Point
1. 複数ドメインサービスやモデルファクトリーの
呼び出し処理
2. 非同期処理によるフロー制御
メリット
✓ Controllerクラスがビジネスロジックの呼び出し処
理でファットになることを防げる
✓ ビジネスロジックの順序性が明確化され、実装の
見通しが良くなる
✓ 新しいビジネスロジックをどこに挿入すれ
ばよいか
✓ パフォーマンス由来でビジネスロジックの
順序変更をしたい