演習 - 空白を使用してコードを読みやすくする

完了

印刷物や Web のデザイナーは、狭いスペースに大量の情報を詰め込むと、読む人に負担になることを理解しています。 そのため、デザイナーは、空白文字つまりネガティブ スペースを戦略的に使用して情報を分割し、作成物の主要なメッセージを読む人が最大限に理解できるようにします。

開発者は、エディターでコードを記述するときに、同様の戦略を使用できます。 空白文字を使用して意味を伝えることにより、開発者はコードの意図をいっそう明確にすることができます。

空白文字とは

"空白文字" という用語は、space bar によって生成される個々のスペース、tab キーによって生成されるタブ、および enter キーによって生成される改行を指します。

C# コンパイラでは空白文字は無視されます。 空白がどのように無視されるか、および空白文字を使用してできる限り明確にする方法を理解するため、次の演習を行います。

C# コンパイラによって空白が無視される方法を示すコードを追加する

  1. Visual Studio Code で空の Program.cs ファイルが開かれていることを確認します。

    必要であれば、Visual Studio Code を開き、次の手順のようにしてエディターで Program.cs ファイルを準備します。

    1. [ファイル] メニューの [フォルダーを開く] を選択します。

    2. [フォルダーを開く] ダイアログを使って CsharpProjects フォルダーに移動して開きます。

    3. Visual Studio Code のエクスプローラー パネルで、Program.cs を選びます。

    4. Visual Studio Code の [選択] メニューで、[すべて選択] を選択してから Delete キーを押します。

  2. 次のコードを入力します。

    // Example 1:
    Console
    .
    WriteLine
    (
    "Hello Example 1!"
    )
    ;
    
    // Example 2:
    string firstWord="Hello";string lastWord="Example 2";Console.WriteLine(firstWord+" "+lastWord+"!");
    
  3. Visual Studio Code の [ファイル] メニューで、[保存] を選択します。

  4. [エクスプローラー] パネルで、TestProject フォルダーの場所にあるターミナルを開くには、TestProject を右クリックし、[統合ターミナルで開く] を選択します。

  5. [ターミナル] のコマンド プロンプトで「dotnet run」と入力し、Enter キーを押してください。

    次の出力が表示されます。

    Hello Example 1!
    Hello Example 2!
    
  6. 少し時間をかけて、コードで空白文字を使用する方法について、この結果が示す内容をよく考えてみてください。

    これら 2 つのコード例では、2 つの重要なアイデアが示されています。

    • 空白文字はコンパイラには関係ありません。 ただし ...
    • 空白文字を適切に使用すると、コードの読みやすさやわかりやすさが向上します。

    コードを書くのはおそらく 1 回だけですが、コードは何回も読む必要があります。 したがって、読みやすいコードを書くように注意する必要があります。 経験を積むにつれて、いつ、どのようにスペース、タブ、改行などの空白文字を使えばよいかがわかってきます。

    初期のガイダンス:

    • 個々の完全なコマンド ("ステートメント") は、個別の行に属しています。
    • 1 行のコードが長くなった場合は、分割することができます。 ただし、正当な理由ができるまでは、恣意的に 1 つのステートメントを複数の行に分割することは避ける必要があります。
    • 代入演算子の左右にスペースを使用します。
  7. 既存のコードを次のコードに置き換えてください。

    Random dice = new Random();
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    int total = roll1 + roll2 + roll3;
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) {
        if ((roll1 == roll2) && (roll2 == roll3)) {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6; 
        } else {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    }
    

    このコードには空白があまり含まれていないことに注目してください。 このコードは、アプリケーションに空白文字を追加する方法を示すために使用されます。 効果的な空白文字を使用すると、コードの動作を理解しやすくなります。

    Note

    このコードでは、Random クラスを使用してシミュレートされたサイコロ ゲームを開発し、3 回振った (ロール) 目の数の合計値を使用して "勝利" スコアを評価します。 このコードでは、ダブル (2 個がゾロ目) またはトリプル (3 個がゾロ目) が出た場合に追加のポイントが与えられます。 空白文字を含める利点を確認するために、このコードを完全に理解する必要はありません。

  8. 少し時間をかけて、このコードの読みやすさを向上させるために空白を使用する方法を、よく考えてみてください。

    このコードには、注意すべき 2 つの特徴があります。

    • このコード例には、垂直方向の空白文字がありません。 つまり、コード行を分離する空の行がありません。 すべてが 1 つの詰まったコード リストになっています。
    • 開始と終了の中かっこ { } によって定義されたコード ブロックが一緒にまとめられているので、それらの境界を視覚的に識別するのが困難です。

    一般に、読みやすさを向上させるには、似たことや関連することが行われる 2 行、3 行、または 4 行のコードの間に、空白行を挿入します。

    垂直方向の空白文字を使用してコードを区切るのは主観的なことです。 最も読みやすいものや、空白文字を追加するタイミングについては、2 人の開発者の間でも意見が分かれる可能性があります。 自分が最適と考える判断を下してください。

  9. 読みやすさを向上させる垂直方向の空白文字を追加するには、次のようにコードを更新します。

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) {
        if ((roll1 == roll2) && (roll2 == roll3)) {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6; 
        } else {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    }
    

    最初の行の空白は、dice 変数の宣言を、ロール変数に値を割り当てるために使用されるコード行から分離するために使用されています。 この分離により、コードでの dice の使用方法を簡単に確認できます。

    次の行の空白は、ロール変数の宣言と total の宣言を分離します。 3 つのロール変数の宣言をグループ化すると、2 つの点で役立ちます。 最初に、これにより関連する変数を含むコード行のグループが作成されます。 2 つ目は、変数名が非常に似ていて、宣言が同じパターンに従うことです。 そのため、それらをグループ化すると類似点が目を引き、相違点を明らかにするのに役立ちます。

    最後に、3 行目の空白文字によって、別の関連するステートメント グループが入れ子になった if ステートメントから分離されます。 total および Console.WriteLine() メソッドの宣言を含むステートメントのグループは、外観ではなく目的別に関連付けられます。 このコードは、3 つのサイコロによって達成された合計値と、出目の数にダブルかトリプルが含まれているかどうかに焦点を当てています。 これらの行は、total を計算して目の数の結果をユーザーに報告する必要があるため、関連しています。

    一部の開発者は、totalConsole.WriteLine() の宣言の間に空白行を挿入する必要があると主張するかもしれません。 ここでも、空白を選択するのは最善の判断次第です。 ご自分にはどちらの方が読みやすいかを考え、そのスタイルを一貫して使用する必要があります。

    残りは if ステートメントです。 ここで、それを調べることができます。

  10. if キーワードの下の行に注目して、コードを次のように変更します。

    Random dice = new Random();
    
    int roll1 = dice.Next(1, 7);
    int roll2 = dice.Next(1, 7);
    int roll3 = dice.Next(1, 7);
    
    int total = roll1 + roll2 + roll3;
    Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");
    
    if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) 
    {
        if ((roll1 == roll2) && (roll2 == roll3)) 
        {
            Console.WriteLine("You rolled triples!  +6 bonus to total!");
            total += 6; 
        } 
        else 
        {
            Console.WriteLine("You rolled doubles!  +2 bonus to total!");
            total += 2;
        }
    }
    
  11. 間隔を改善するために、開始と終了の中かっこを独立した行に移動したことに注目してください。

    {} の記号によって、コード ブロックが作成されます。 C# の多くの構造にはコード ブロックが必要です。 境界が明確に見分けられ、読みやすくなるように、これらの記号は独立した行に配置する必要があります。

    さらに、tab キーを使用して、コード ブロックの記号をそれらが属しているキーワードの下に揃えることが重要です。 たとえば、キーワード if で始まっているコード行に注目してください。 その行の下に { 記号があります。 この配置により、{if ステートメントに "属している" ことがわかりやすくなります。 さらに、最後の } 記号も if ステートメントと並んでいます。 配置とインデントの組み合わせにより、コード ブロックの始まりと終わりを簡単に理解できます。

    このコード ブロックの内側のコード行はインデントされており、それらが、このコード ブロックに "属している" ことを示しています。

    内側の if ステートメントと else ステートメント、およびそれらのコード ブロック内のコードが、同様のパターンに従っています。

空白を含めるというこのスタイル ガイダンスには、賛成しない人もいるでしょう。 ただし、コードを記述する際の出発点として、このガイダンスの使用を検討する必要があります。 将来、このガイダンスから外れることを決定する場合は、目的を持ってそうすることができます。

要点

この演習では主に次のことを学習しました。

  • コードの読みやすさを向上させるには、空白文字をよく考えて使用します。
  • コードのフレーズを区切るには、改行を使用して空白行を作成します。 フレーズには、似ている、または連携するコード行が含まれます。
  • 改行を使用して、コード ブロック記号を独立したコード行に分けます。
  • tab キーを使用して、コード ブロックをそれが関連付けられているキーワードと揃えます。
  • コード ブロック内のコードをインデントして、従属関係を示します。