switch文Wikipediaはswitch文を「選択制御機構の一種で、変数や式の値によってプログラムの制御の流れを変えるためのもの」と説明しています。
この仕組みには、switch、case、break、defaultというキーワードが関わってきます。
最も単純な使い方では、プリミティブ型や文字列の式を調べ、その値に基づいて判断を下します。たとえば、次のようになります。
string direction = GetDirection();
switch (direction)
{
case "left":
GoLeft();
break;
case "right":
GoRight();
break;
default:
MarkTime();
break;
}
最も高度な使い方になると、ダウンキャストcase <Type> <variable>:やガード(when)が登場します。
Animal animal = GetAnimal();
switch (animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
サッカークラブのウェブサイトで、試合のレポートを作成するスタッフを支援するシステムを開発しています。 このシステムは、フィールドの内外を問わず試合のさまざまな側面を分析し、それらをイベントのストリームに変換できます。
このチームは4-3-3のフォーメーションしか使わず、選手交代を認める1965年のルール変更にも同意していません。ましてや選手数の拡大など論外です。
選手の説明は次のとおりです。
1 -> "goalie"
2 -> "left back"
3 & 4 -> "center back"
5 -> "right back"
6, 7 & 8 -> "midfielder"
9 -> "left wing"
10 -> "striker"
11 -> "right wing"
静的メソッドPlayAnalyzer.AnalyzeOnField()を実装して、背番号に基づいた選手の説明を出力しましょう。
PlayAnalyzer.AnalyzeOnField(10);
// => "striker"
PlayAnalyzer.AnalyzeOnField()メソッドを変更して、1〜11の範囲外の背番号が処理されたときにUNKNOWNを報告するようにしましょう。
PlayAnalyzer.AnalyzeOffField()メソッドを実装して、フィールド周辺の活動や人物の説明を出力しましょう。
このメソッドはさまざまな型のデータを受け取り、それらを分析して、ジャーナリストの役に立つ適切なテキストに変換します。
まずは、スタジアムに関するデータを扱います。
int)string)未知の型のデータは処理しません。そのため、メソッドが別の型のデータを受け取った場合は、空の文字列を返します。
PlayAnalyzer.AnalyzeOffField(5000);
// => "There are 5000 supporters at the match."
PlayAnalyzer.AnalyzeOffField("5 minutes to go!");
// => "5 minutes to go!"
PlayAnalyzer.AnalyzeOffField(0.5);
// => ""
PlayAnalyzer.AnalyzeOffField()メソッドを変更して、試合中に起きる出来事の説明を出力しましょう。
出来事はIncident型の任意のサブクラスで、その出来事の説明を含みます。
負傷は特別な種類の出来事です。試合を中断させるため、別の扱いをする必要があります。
PlayAnalyzer.AnalyzeOffField(new Foul());
// => "The referee deemed a foul."
PlayAnalyzer.AnalyzeOffField(new Injury(8));
// => "Oh no! Player 8 is injured. Medics are on the field."
PlayAnalyzer.AnalyzeOffField()メソッドを変更して、試合に立ち会っているクラブの監督について言及しましょう。
監督はManager型のインスタンスで、名前と、その監督が率いるクラブの名前を持ちます。
監督のクラブが不明な場合、nullに設定されます。
監督のクラブがわからない場合は、説明に含めません。
PlayAnalyzer.AnalyzeOffField(new Manager("José Mário dos Santos Mourinho Félix", null));
// => "José Mário dos Santos Mourinho Félix"
PlayAnalyzer.AnalyzeOffField(new Manager("Jürgen Klopp", "Liverpool"));
// => "Jürgen Klopp (Liverpool)"