コード
using InsuranceProductManager2.Models;
using System;
namespace InsuranceProductManager2.Services
{
public class AutoPremiumCalculator : IAutoPremiumCalculator
{
public AutoPremiumCalculationResult CalculatePremium(Customer customer, AutoInsurancePolicy policy)
{
decimal baseRate = 0.02m; // 自動車保険の基準料率(例)
// 年齢補正
decimal ageFactor = policy.DriverAgeCategory switch
{
"全年齢" => 1.5m,
"21歳以上" => 1.2m,
"26歳以上" => 1.0m,
_ => 1.0m
};
// 車の年式による補正
int carAge = DateTime.Now.Year - policy.CarYear;
decimal carAgeFactor = carAge > 10 ? 1.2m : 1.0m;
// 事故歴補正
decimal accidentFactor = policy.HasAccidentHistory ? 1.3m : 1.0m;
// 等級補正(1〜20)
decimal gradeFactor = 1.0m - (policy.GradeLevel - 6) * 0.03m;
if (gradeFactor < 0.6m) gradeFactor = 0.6m;
// 契約期間補正
int termYears = policy.EndDate.Year - policy.StartDate.Year;
decimal termFactor = 1.0m + (termYears / 10m) * 0.05m;
// 年間保険料計算
decimal annualPremium = policy.InsuredValue * baseRate * ageFactor * carAgeFactor * accidentFactor * gradeFactor * termFactor;
return new AutoPremiumCalculationResult
{
CustomerId = customer.CustomerId,
PolicyId = policy.PolicyId,
InsuredValue = policy.InsuredValue,
AnnualPremium = Math.Round(annualPremium, 0),
BaseRate = baseRate,
AgeFactor = ageFactor,
CarAgeFactor = carAgeFactor,
AccidentFactor = accidentFactor,
GradeFactor = gradeFactor,
TermFactor = termFactor,
StartDate = policy.StartDate,
EndDate = policy.EndDate,
CalculatedAt = DateTime.Now
};
}
}
}
🔷全体の役割
• CalculatePremium メソッドで、顧客 (Customer) と契約情報 (AutoInsurancePolicy) を入力に、計算結果 (AutoPremiumCalculationResult) を出力します。
🔷インターフェース
public class AutoPremiumCalculator : IAutoPremiumCalculator
• IAutoPremiumCalculator(インターフェース)を実装するクラス。
🔹 1️⃣ baseRate(基準料率)
decimal baseRate = 0.02m;
• 基本の保険料率。
• m は decimal 型リテラル(金額計算に使う高精度型)。小数点を含む値を正確に表現するためのものです。
🔹 2️⃣ 年齢補正(ageFactor)
decimal ageFactor = policy.DriverAgeCategory switch
{
"全年齢" => 1.5m,
"21歳以上" => 1.2m,
"26歳以上" => 1.0m,
_ => 1.0m
};
• switch 式で運転者の年齢区分ごとにリスク補正。
• 若いほど事故リスクが高く、保険料が上がる(1.5倍など)。
🔹 3️⃣ 車の年式による補正(carAgeFactor)
int carAge = DateTime.Now.Year - policy.CarYear;
decimal carAgeFactor = carAge > 10 ? 1.2m : 1.0m;
• 車の経過年数を計算し、古い車(10年以上)は補正 1.2倍。
→ 故障・事故リスク増。
🔹 4️⃣ 事故歴補正(accidentFactor)
decimal accidentFactor = policy.HasAccidentHistory ? 1.3m : 1.0m;
• 事故歴があれば保険料1.3倍。
→ リスクが高いため。
🔹 5️⃣ 等級補正(gradeFactor)
decimal gradeFactor = 1.0m - (policy.GradeLevel - 6) * 0.03m;
if (gradeFactor < 0.6m) gradeFactor = 0.6m;
• 等級(1〜20)に応じて割引。
等級が高いほど(安全運転者)割引される。
• 下限は 0.6(つまり最大で40%割引まで)。
🔹 6️⃣ 契約期間補正(termFactor)
int termYears = policy.EndDate.Year - policy.StartDate.Year;
decimal termFactor = 1.0m + (termYears / 10m) * 0.05m;
• 契約が長期になるほど少し割増(例:10年で+5%)。
• 長期間の補償コストを考慮。
🔹 7️⃣ 年間保険料の算出
decimal annualPremium = policy.InsuredValue * baseRate
* ageFactor * carAgeFactor * accidentFactor * gradeFactor * termFactor;
• 全ての補正を掛け合わせた結果が年間保険料。
🔹 8️⃣ 結果の返却
return new AutoPremiumCalculationResult
{
CustomerId = customer.CustomerId,
PolicyId = policy.PolicyId,
InsuredValue = policy.InsuredValue,
AnnualPremium = Math.Round(annualPremium, 0), // 四捨五入
...
CalculatedAt = DateTime.Now
};
保険料や各補正要素を AutoPremiumCalculationResult モデルにまとめて返す。
• 小数点は四捨五入して整数に。
🔹 このクラスの構造的な意図
| 構成要素 | 意味 |
|---|---|
| IAutoPremiumCalculator | 保険料計算サービスの共通インターフェース |
| AutoPremiumCalculator | その具体的な実装クラス |
| Customer, AutoInsurancePolicy | 入力データモデル |
| AutoPremiumCalculationResult | 計算結果モデル |
| CalculatePremium | 実際に保険料を計算するメソッド |
🔹 まとめ
このクラスは:
• 責務が明確(計算だけを担当)
• 保守性が高い(補正ルールを簡単に変更可能)
• DI(依存性注入)対応(IAutoPremiumCalculator 経由で利用)