ドメインサービスの例
それでは概要を理解したところで、ドメインサービスの具体的な例を見てみましょう。
SaaSOvationのコード例
ここではSaaSOvationのドメインサービスのソースコード「businessPriorityTotalsクラス」を見てみましょう。
この処理では、Scrumプロダクトの中から未処理のバックログアイテムを取り出し、ビジネス優先度を合計する処理を実装しています。
package com.saasovation.agilepm.domain.model.product.backlogitem;
// ビジネス優先度計算用ドメインサービス
public class BusinessPriorityCalculator {
// リポジトリ
private BacklogItemRepository backlogItemRepository;
// コンストラクタ
public BusinessPriorityCalculator(
BacklogItemRepository aBacklogItemRepository) {
super();
this.backlogItemRepository = aBacklogItemRepository;
}
// 「ビジネス優先度を合計する」メソッド
public BusinessPriorityTotals businessPriorityTotals(
TenantId aTenantId,
ProductId aProductId) {
int totalBenefit = 0;
int totalPenalty = 0;
int totalCost = 0;
int totalRisk = 0;
// リポジトリからBacklogItemのコレクションを取得
Collection<BacklogItem> outstandingBacklogItems =
this.backlogItemRepository()
.allOutstandingProductBacklogItems(aTenantId, aProductId);
// 複数のBaklogアイテムの集計処理を実施
for (BacklogItem backlogItem : outstandingBacklogItems) {
if (backlogItem.hasBusinessPriority()) {
BusinessPriorityRatings ratings =
backlogItem.businessPriority().ratings();
totalBenefit += ratings.benefit();
totalPenalty += ratings.penalty();
totalCost += ratings.cost();
totalRisk += ratings.risk();
}
}
// 戻り値であるBusinessPriorityTotalsの値オブジェクトを設定
BusinessPriorityTotals businessPriorityTotals =
new BusinessPriorityTotals(
totalBenefit,
totalPenalty,
totalBenefit + totalPenalty,
totalCost,
totalRisk);
return businessPriorityTotals;
}
private BacklogItemRepository backlogItemRepository() {
return this.backlogItemRepository;
}
}
このドメインサービスでは、リポジトリを利用してバックログアイテムを取得して計算を行い、ビジネス優先度合計を示す値オブジェクトを生成しています。これまで解説してきた通り、複数のドメインオブジェクトを組み合わせ、変換を行う処理を実装していることがわかります。
