1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
namespace decision_table.utils
{
/// <summary>
/// DecisionTableを構築するためのビルダークラス
/// Fluent APIパターンを使用して直感的にDecisionTableを作成できる
/// </summary>
/// <typeparam name="T">入力データの型</typeparam>
/// <typeparam name="R">戻り値の型</typeparam>
public class DecisionTableBuilder<T, R> :
IDecisionTableConditionBuilder<T, R>,
IDecisionTableActionBuilder<T, R>,
IDecisionTableEntryBuilder<T, R>,
IDecisionTableInstanceBuilder<T, R>
{
private readonly DecisionTable<T, R> decisionTable = new DecisionTable<T, R>();
private ConditionChecker<T, R> tmpConditionChecker = null!;
/// <summary>
/// 条件を定義する
/// </summary>
/// <param name="predicates">条件のリスト(全てがtrueの場合に一致)</param>
/// <returns>アクションビルダー</returns>
public IDecisionTableActionBuilder<T, R> When(params Func<T, bool>[] predicates)
{
tmpConditionChecker = new ConditionChecker<T, R>();
tmpConditionChecker.Predicates = predicates.ToList();
return this;
}
/// <summary>
/// 条件が一致した場合の結果を定義する
/// </summary>
/// <param name="result">返す結果</param>
/// <returns>エントリビルダー</returns>
public IDecisionTableEntryBuilder<T, R> Then(R result)
{
tmpConditionChecker.Result = result;
return this;
}
/// <summary>
/// 現在の条件と結果のペアをDecisionTableに追加する
/// </summary>
/// <returns>インスタンスビルダー</returns>
public IDecisionTableInstanceBuilder<T, R> Entry()
{
decisionTable.AddConditionChecker(tmpConditionChecker);
return this;
}
/// <summary>
/// DecisionTableを構築して返す
/// </summary>
/// <returns>構築されたDecisionTable</returns>
public DecisionTable<T, R> Build()
{
return decisionTable;
}
}
/// <summary>
/// DecisionTableBuilderを作成するためのファクトリクラス
/// </summary>
public static class DecisionTableFactory
{
/// <summary>
/// 新しいDecisionTableBuilderを作成する
/// </summary>
/// <typeparam name="T">入力データの型</typeparam>
/// <typeparam name="R">戻り値の型</typeparam>
/// <returns>新しいDecisionTableBuilder</returns>
public static IDecisionTableConditionBuilder<T, R> CreateBuilder<T, R>()
{
return new DecisionTableBuilder<T, R>();
}
}
}
|