
2.6 程序编码规范
俗话说,“没有规矩,不成方圆”,程序编码也不例外。通常每个软件公司都有一套自己的编码规则,这样既有利于形成自己的风格,又有利于公司内部人员的沟通和交流。本节将介绍程序编码的一些注意事项和通用规则。
2.6.1 合理使用注释
注释是用于帮助程序员阅读程序的一种语言结构,它不会对程序的功能产生任何影响,也不会增加可执行代码的长度,因为编译器在编译代码时会将注释过滤掉。在程序中注释通常有两个作用:一是对代码进行简要解释;二是标注文件的版权、作者、版本号等信息。例如,下面的注释是许多开发人员标注文件采用的通用格式。

在C++语言中,注释有两种,一种是行注释“//”,另一种是语句注释“/*…*/”。例如:

行注释“//”只注释当前行,语句注释“/*…*/”能够注释掉“/*”与“*/”之间的语句。
注意
在使用语句注释时,需要注意“/*”与“*/”并不能按层次对应。
例如,下面的注释是非法的。

在上面的代码中,外层注释“/*”是与内层注释“*/”匹配的,而不是与外层注释“*/”匹配。因此,代码“int age = 20;printf(“%d\n”, age)”没有被注释掉,外层注释“*/”成了代码的一部分,代码不能够被编译。
此外,在使用注释时还应注意以下事项。
(1)不可过多地使用注释
注释只是对代码的简要说明,并不是文档,注释过多,会让人感觉眼花缭乱,有些喧宾夺主的“味道”。如果代码简洁、清楚,则不需要使用注释。例如:

上面的代码注释显得多此一举了。但是本书中出现的代码多数都标有注释,其目的一是使页面更加工整,连读多行注释,突然一段代码没有注释,页面显得有些凌乱;二是使读者通过注释中的文字描述来理解代码的作用。实际上,用户在开发程序时没有必要这么做(每行都标有注释)。
(2)代码与注释同时进行
在写代码后马上写注释,甚至在写代码前,应先写注释。此外,修改代码的同时修改注释,使注释与代码的功能对应。
(3)注释要简洁、准确
在写注释时,不要写得过长,将代码的语义描述清楚即可。注释一定要准确,不要产生歧义,错误的注释会适得其反,使其他开发人员产生误解。
(4)注释位置要适当
注释通常放置在代码的上方或右方,不要放置在代码的下方,让人误以为是下行代码的注释。
(5)较长的代码要分段注释
在写某个函数时,如果代码较长,层次结构比较复杂,则要在每层结束后添加注释标识。例如:

2.6.2 统一代码缩进
在编写代码时要统一代码的缩进,如确定每一层的代码缩进为几个空格或一个tab制表位,这样编写出的代码既工整又利于阅读。例如:

技巧
在Visual C++ 6.0开发环境中,选择一段代码,然后按Alt+F8键可以根据缩进情况对齐凌乱的代码。
2.6.3 代码换行
在开发程序时,有时一行代码会很长。例如:

在书写代码时,对于长代码应将其分成多行显示。例如,将上述代码转换为如下格式,让人产生一目了然的感觉。

在分行时,应保证在低优先级运算符处分行,运算符放在新行的开始位置,拆分的新行要按一定规则缩进。
2.6.4 合理使用空格
空格在程序中不起任何作用,但是合理地使用空格会使代码更易于阅读和理解。如下是笔者总结的空格使用规则。
(1)关键字之后使用空格
在程序中使用关键字时,关键字之后建议保留一个空格,以突出显示关键字。例如:

if关键字与“(”之间添加空格以示区分关键字。
(2)逗号之后应添加空格
在定义函数时,如果函数有多个参数,各个参数之间需要使用“,”分隔。例如:

(3)赋值运算符、关系运算符和算术运算符等二目元运算符前后加空格
对于二目元运算符,为了使表达式更清晰,应在运算符前后添加空格。例如:

但是,对于for语句和if语句,为了使表达式更紧凑,可以适当地去掉空格。例如:

(4)“,”“)”和“;”号向前紧跟,与前边的标识符之间不留空格
当程序代码中出现“. ”“)”和“;”等符号时,与前边的标识符之间不留空格。例如:

2.6.5 命名规则
提到命名规则,不得不说的是微软公司的“匈牙利命名规则”。其主导思想是在变量或函数名前加前缀,以增强对程序的理解。例如,定义一个变量int x,如果采用“匈牙利命名规则”,应写为“int ix”,其中前缀i表示整型。
使用“匈牙利命名规则”的最大缺点是烦琐,因此许多开发人员并不赞同使用“匈牙利命名规则”。本节笔者不会定义一套命名规则,因为很难定义适合于所有开发人员的命名规则。这里只介绍一些通用的命名规则。
(1)标识符命名应直观、易懂
标识符的命名应该让人望文知意,而不应该不着边际。标识符的命名应采用英文单词、英文单词的缩写或英文单词的组合,而不要以汉语拼音来命名标识符。例如,“int MaxValue;”不要定义为“int zdz;”,让人难以理解。
(2)标识符的命名不要太长
标识符的名称需要体现其含义,但是名称不能太长。例如,“int LacaoTemporaryValue;”应写为“int TmpValue”。对于一些局部变量,可以使用单个的字母作为标识符的名称,如“int i, j, m, n;”等。
(3)标识符的区分不要以大小写来区分
众所周知,C++语言是区分大小写的。但是,在命名标识符时,不要以此来区分不同的标识符,那样容易让人误解。例如,下面两个函数的命名并不是好的习惯,在调用时很容易误解。

(4)程序中不要出现同名的全局变量和局部变量
当出现全局变量与局部变量同名时,全局变量被隐藏,而不会产生编译错误,但是容易让人误解。
(5)变量的命名应采用名词或形容词+名词的形式
在命名变量时,建议以名词或形容词+名词的形式。例如:

(6)函数的命名应使用动词或动词+名词的形式
对于全局函数或类成员函数,应使用动词或动词+名词的形式。例如:

(7)标识符的命名尽量不使用数字编号
许多程序开发人员在命名标识符时,使用数字编号区分变量。例如:

这并不是好的命名习惯,除非逻辑上确实需要编号,否则不要使用类似的命名习惯。
(8)类和函数名首字母应大写
在命名类和函数名时,首字母应大写。如果类或函数名由多个单词构成,每个单词的首字母都应大写。例如:

(9)局部变量和参数首字母应小写
在命名局部变量或函数参数时,首字母应小写。例如:

(10)常量的所有字母应大写
对于常量,所有字母应大写。如果常量由多个单词构成,单词间用下画线分隔。例如:
