トラック
/
C#
C#
/
演習
/
サッカーの試合レポート
サッカーの試合レポート

サッカーの試合レポート

学習演習

はじめに

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;
}

説明

サッカークラブのウェブサイトで、試合のレポートを作成するスタッフを支援するシステムを開発しています。 このシステムは、フィールドの内外を問わず試合のさまざまな側面を分析し、それらをイベントのストリームに変換できます。

1. 背番号に基づいて選手の説明を出力する

このチームは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"

2. 未知の背番号を処理する

PlayAnalyzer.AnalyzeOnField()メソッドを変更して、1〜11の範囲外の背番号が処理されたときにUNKNOWNを報告するようにしましょう。

3. 対象をフィールド外の活動にも広げる

PlayAnalyzer.AnalyzeOffField()メソッドを実装して、フィールド周辺の活動や人物の説明を出力しましょう。 このメソッドはさまざまな型のデータを受け取り、それらを分析して、ジャーナリストの役に立つ適切なテキストに変換します。

まずは、スタジアムに関するデータを扱います。

  • スタジアムに現在いるサポーターの数(任意のint)
  • スタジアムのPAシステムで流されるアナウンス(任意の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);
// => ""

4. 試合中の出来事を報告する

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."

5. クラブの監督について報告する

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)"
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
C# Exercism

サッカーの試合レポートを始める準備はできましたか?

Exercismに登録すれば、62個のコンセプト178個の演習、そして本物の人間によるメンタリングとともに、C#を学んでマスターできます。すべて無料です。