導入
優先度のように「決まった選択肢の中から1つを選ぶ」種類の値は、TaskTitleほど複雑な検証ロジックを必要としないことが多く、C#の**enum**でシンプルに表現できます。enumは内部的に整数(既定はint)なので、宣言順を工夫すると比較演算子で大小関係も表現できます。
説明
flowchart LR
L["Low = 0"] --> M["Medium = 1"] --> H["High = 2"]
サンプル
Rank r1 = Rank.Bronze;
Rank r2 = Rank.Gold;
Assert(r2 > r1, "宣言順が大小関係になる(Gold > Bronze)");
Console.WriteLine("全テスト成功");
enum Rank { Bronze, Silver, Gold }
void Assert(bool condition, string name)
{
if (!condition) throw new Exception($"FAIL: {name}");
}
enumは宣言順に0, 1, 2, ...という整数値を持つ- 比較演算子(
<,>,<=,>=)がそのまま使える。追加のクラスを作る必要はない - 選択肢が増減しても、呼び出し側のコードは
switchや比較演算子のままでよい
演習
契約どおりのPriority(Low・Medium・High)を使い、2つのうち優先度が高い方を返す関数をTDDで実装します。
Assert(Higher(Priority.Low, Priority.High) == Priority.High, "Highの方が優先度が高い");
Assert(Higher(Priority.Medium, Priority.Low) == Priority.Medium, "Mediumの方が優先度が高い");
Assert(Higher(Priority.Medium, Priority.Medium) == Priority.Medium, "同じなら同じ値でよい");
Console.WriteLine("全テスト成功");
enum Priority { Low, Medium, High }
// TODO: 2つのPriorityのうち高い方を返す Higher を実装してください(比較演算子が使えます)
void Assert(bool condition, string name)
{
if (!condition) throw new Exception($"FAIL: {name}");
}
___
- 期待される出力:
全テスト成功
ヒント1を見る
Priority Higher(Priority a, Priority b) => a > b ? a : b;
ヒント2を見る
enumは宣言順に整数値を持つので、Low < Medium < Highが成り立ちます
まとめ
- 決まった選択肢から1つを選ぶ値は
enumで十分なことが多い enumは宣言順に整数値を持ち、比較演算子で大小を表現できるPriority { Low, Medium, High }はこの後の章でもそのまま使い続ける
次回: TaskTitleとPriorityを組み込んで、TaskItemを契約どおりの最終形にします。