第3章 间隔相关编码准则

3.1 一行只写一条语句

此处所谓的“行”(line)值得是在编辑器上显示的行,而不是C语言的一条“语句”。

3.2 区分声明语句和执行语句

通过插入空行进行区分声明语句和执行语句。

分析语句对数据会产生何种“直接”影响,可以轻松区分声明语句和执行语句。无论是输出、输入数据,或内存中的保存数据,只要是对数据进行处理和操作的语句,都可以视为执行语句。当然,比较数据的条件语句也是执行语句之一。

代码越长,该准则带来的效果越明显。特别是对于C++程序中变量声明位于程序中段的情况,更要注意遵循这一准则,即在声明语句前后各插入一行空行进行标注。

3.3 区分段落

在编写程序时,无论是声明语句还是执行语句,都应该注意将相似的部分集中在一起。有经验的程序员会有意将负责相似功能的执行语句集中在一起,并在其前后插入空行,以便区分于其他语句。

程序编写者应该按一下5部分分段编写函数内容:

  • 包含标准库的预处理命令
  • 定义字符串常量的预处理命令
  • 声明用户信息相关的结构体
  • 声明从插入、更新、删除功能中三选一的函数原型
  • 声明插入、更新、删除相关的函数原型

3.4 区分各种控制语句

表达统一思想的段落内部也应该插入空行,以划分更细的层次。最常见的情况是针对控制语句。

控制语句担负着改变程序执行顺序的作用,不同假定条件、不同情况下如何进行选择或循环,都由这些控制语句决定,直接关系到程序执行顺序是否正确。

if (num1 == num2)
    printf("%d和%d相同。\n", num1, num2);

if (num1 != num2)
    printf("%d和%d不同。\n", num1, num2);

if (num1 < num2)
    printf("%d小于%d。\n", num1, num2);

switch语句适用的准则整理如下。switch语句越长、越复杂,该准则的作用就越强大。

  1. switch语句开始部分单独占据一行
  2. 以空行区分各case语句
  3. 像case语句一样,用空行隔开default语句,以示区分

对于相互重叠的多种控制结构,每次变换控制语句的种类时都插入空行。

3.5 区分各函数

函数之间无空行的缺点:

  1. 难以掌握函数的起始位置和结束位置
  2. 难以了解程序由几个函数组成
  3. 难以定位某个特定函数

建议各函数之间最少插入两个空行,因为这样可以保证各函数之间的间距更大,如果依序阅读函数内部代码时,如果遇到间距较大的位置,就能自然而然地意识到下面开始是一个新的函数。

3.6 运算符前后需留出空格

3.7 不要在一元运算符与操作数之间插入空格

3.8 分号前不要插入空格

有时,人们会在分号前面插入若干空格,以对齐各语句末尾部分。但这种情况也会导致疑问:“分号和语句之间是否漏掉了某些标识符?”,因此,不要在分号前插入空格。

3.9 不要滥用Tab键

3.10 逗号后必须插入一个空格

更容易区分各参数

3.11 逗号后不要插入太多空格

过多空格同样会损害代码可读性。如果要表示强调,可以按照特定格式,通过添加注释强调特定语句。

3.12 变量初始化时的列对齐

int main(int, int) {
    int enterYear = 2012;
    int enterMonth = 01;
    int exitYear = 2015;
    int exitMonth = 12;
    int newItemStock = 0;
    int newItemFlow = 0;
    long double statofNewItemStock = 0;
    long double statofOldItemStock = 0;
    double bankCredit = 0;
    double bankDebit = 0;
    // ……略……
}

将变量的声明语句和执行语句分别集中到不同部分,这样有利于管理变量。并且还可以使用Tab键,对齐各变量初始值所在列,如下所示:

int main(int, int) {
    int enterYear         = 2012;
    int enterMonth        = 01;

    int exitYear          = 2015;
    int exitMonth         = 12;

    int newItemStock      = 0;
    int newItemFlow       = 0;

    long double statofNewItemStock = 0;
    long double statofOldItemStock = 0;

    double bankCredit     = 0;
    double bankDebit      = 0;
    // ……略……
}

这种对齐初始值所在列的方法很常见。但如果仅仅为了遵守公司“对齐初始值所在列”的编码规则而机械化地对齐,反而会损害代码可读性。公司制定这条规则地本意是,在提高而不是损害可读性地范围内对齐列。因此,应该在合适地范围内,即不能插入过多空格地前提下,对齐初始值所在列。

int main(int, int) {
    int enterYear  = 2012;
    int enterMonth = 01;

    int exitYear   = 2015;
    int exitMonth  = 12;

    int newItemStock  = 0;
    int newItemFlow   = 0;

    long double statofNewItemStock = 0;
    long double statofOldItemStock = 0;

    double bankCredit = 0;
    double bankDebit  = 0;
    // ……略……
}

总之,初始值应该按列对齐,但也要考虑变量的含义,通过空格的多少控制不同含义的变量初始值在不同位置对齐。

3.13 一行只声明一个变量

有些程序员会在同一行声明多个变量,如下所示:

int number1, number2, number3;
double number4, number5, number6;

无论这种形式的标记方法是否简便,它都存在其他问题。仅从程序的标记形式看,似乎并没有什么问题。但实际上,C编译器会将上述变量声明代码翻译为如下形式:

int number1, int number2, int number3;
double number4, int number5, int number6;

为什么会这样呢?在C语言中,如果变量前面没有指明变量类型,那么会默认将变量的数据类型指定为int型。这也就导致了与程序员意愿相违背的编译结果。

因此,如果考虑准备制定编码风格规则,那么应该规定“一行只声明一个变量”。

你可能感兴趣的:(第3章 间隔相关编码准则)