练习 - 使用空格让代码更易于阅读

已完成

平面设计师和网页设计师知道,在小空间中塞入太多信息会让浏览器不知所措。 因此,他们战略性地使用空格或负空间来分散信息,以最大程度地使观看者能够消化其作品中的主要消息。

当开发者在编辑器中编写代码时,他们可以使用类似的策略。 通过使用空格传达含义,开发者可以更清楚地传达代码意图。

什么是空格?

术语“空格”指的是由 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. 花一点时间思考可通过此结果了解的有关应如何在代码中使用空格的内容。

    这两个代码示例说明了两个重要概念:

    • 空格对编译器而言不重要。 但是...
    • 正确使用空格可以提高你阅读和理解代码的能力。

    你可能只编写一次代码,但需要多次阅读代码。 因此,应注重所编写代码的可读性。 你会逐渐意识到使用空格(如空格字符、制表符和新行)的好处方式。

    提前指导:

    • 每个完整的命令(语句)都属于单独的一行。
    • 如果单个代码行过长,可以将其拆分。 但是,不应随意将单个语句拆分为多行,除非你有充分的理由这样做。
    • 在赋值运算符的左侧和右侧使用空格。
  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;
        }
    }
    

    请注意,此代码不包含太多空格。 此代码将用于演示向应用程序添加空格的方法。 有效的空格可让你更轻松地理解代码的作用。

    注意

    该代码使用 Random 类来帮助开发模拟骰子游戏,其中三次掷出的总点数用于计算“获胜”分数。 代码会为掷出两个或三个相同的点数奖励额外得分。 无需完全了解此代码即可了解包含空格的好处。

  8. 花一点时间考虑如何使用空格来提高此代码的可读性。

    需要记下此代码的两个特点:

    • 此代码示例中没有垂直空格。 换言之,没有分隔代码行的空行。 所有内容都整合到一个密集的代码列表中。
    • 由左大括号和右大括号 { } 定义的代码块压缩在一起,使其边界难以在视觉上辨别出来。

    一般而言,为了提高可读性,可在执行相似或相关操作的两个、三个或四个代码行之间引入空行。

    使用垂直空格表述代码是主观操作。 关于哪种形式更加易读或者何时添加空格,不同的开发人员可能意见不同。 请根据你的最佳判断来使用。

  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 的声明分隔开。 对三个掷骰变量的声明进行分组会在两个方面很有用。 首先,它会创建一组包含相关变量的代码行。 其次,变量名称非常相似,声明遵循相同的模式。 因此,将它们分组到一起可让你看到相似之处,并且有助于揭示差异。

    最后,第三行空格将另一组相关语句与嵌套的 if 语句分隔开。 包含 total 声明和 Console.WriteLine() 方法的语句组是按用途(而不是外观)相关联的。 代码侧重于三个骰子掷出的总值,以及是否掷出了两个或三个相同的点数。 这些代码行是相关联的,因为你需要计算 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 键将代码块与相关的关键字对齐。
  • 缩进代码块中的代码以显示所有权。