写在开篇之前
在日常的学习、生活中,拥有良好的行为习惯可以让我们受益无穷,同样,对于我们程序员来说,养成一个好的编程习惯,形成良好的代码风格也会给我们带来许多好处,比如:
- 使我们的代码看起来更加简洁、美观。
- 便于我们自己后续对代码进行修改与理解。
- 便于他人对我们的代码进行阅读与维护。
- 大大减少我们代码出现Bug的概率。
我们可以个人的代码风格比作“书法”,好的“书法”可让人对程序一目了然,看得兴致勃勃,而差的“书法”却如螃蟹爬行,让人看得索然无味,更令维护者烦恼有加。但是,由于国内大学的计算机教育对高质量程序设计的观念灌输较弱,同时教师们和学生们也很少自觉关心软件的质量,导致很大部分大学生甚至是行业从业者对代码的正确性、健壮性、可靠性、效率、易用性、可读性(可理解性)、可扩展性、可复用性、兼容性、可移植性等质量属性了解甚少,更不用说运用自如。
本人有幸在一个偶然的机会中接触了浙江大学计算机应用博士林锐的著作《高质量C/C++编程指南》,这本书让我知道了什么是优秀的代码风格,也很大程度上改变了我的编程习惯,所以,今天我以这本书里面的内容为基础写下了这篇文章,来和大家共同探讨学习好的代码风格,希望与诸君共勉。
1、文件结构
1.1、头文件结构
头文件应由三部分内容组成:
(1)头文件开头处的版权和版本声明。
(2)预处理块。
(3)函数和类结构声明等
【规则 1-2-1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预 处理块。
【规则 1-2-2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
【规则 1-2-3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开 始搜索)。
【建议 1-2-1】头文件中只存放“声明”而不存放“定义。
1.2、定义文件的结构
定义文件有三部分内容:
(1) 定义文件开头处的版权和版本声明。
(2) 对一些头文件的引用。
(3) 程序的实现体。(包括数据和代码)
1.3、目录结构
如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。例如可将头文件保存于 include 目录,将定义文件保存于 source 目录(可以是多级目录)。
如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。
2、程序的版式
2.1代码行
【规则 2-2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
【规则 2-2-2】if、for、while、do 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。
2.2代码行内的空格
【规则 2-3-1】关键字之后要留空格。像 const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。像 if、for、while 等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
【规则 2-3-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
【规则 2-3-3】‘,’之后要留空格,如 Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如 for (initialization; condition; update)。
【规则 2-3-4】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
【规则 2-3-5】一元操作符如“!”、“~”、“++”、“–”、“&”(地址运算符)等前后不加空格。
【规则 2-3-6】象“[]”、“.”、“->”这类操作符前后不加空格。
【建议 2-3-7】对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去掉一些空格,如 for (i=0; i<10; i++)和 if ((a<=b) && (c<=d))。
2.3对齐
【规则 2-4-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【规则 2-4-2】{ }之内的代码块在‘{’右边数格处左对齐。
3、命名规则
3.1共性规则
1、标识符应当直观且可以拼读,可望文知意,不必进行“解码”。标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。
2、标识符的长度应当符合“min-length && max-information”原则。
3、命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如 Windows 应用程序的标识符通常采用“大小写”混排的方式,如 AddChild。而 Unix 应用程序的标识符通常采用“小写加下划线”的方式,如add_child。
4、程序中不要出现仅靠大小写区分的相似的标识符。
5、程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
6、变量的名字应当使用“名词”或者“形容词+名词”。
7、反义词组命名具有互斥意义的变量或相反动作的函数等。
8、尽量避免名字中出现数字编号,如 Value1,Value2 等,除非逻辑上的确需要编号。
3.2 简单的 Windows 应用程序命名规则
1、类名和函数名用大写字母开头的单词组合而成
2、变量和参数用小写字母开头的单词组合而成。
3、常量全用大写的字母,用下划线分割单词。
4、静态变量加前缀 s_(表示 static)。
5、如果不得已需要全局变量,则使全局变量加前缀 g_(表示 global)。
6、类的数据成员加前缀 m_(表示 member),这样可以避免数据成员与成员函数的参数同名。
7、为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准 OpenGL 的所有库函数均以 gl 开头,所有常量(或宏定义)均以 GL 开头。
写在最后
上面是林锐博士《高质量C/C++编程指南》中提到的一部分优秀代码风格,但是,却已经能够让我们写出来的程序的规范度的超过80%的人;在这里我强烈建议大家去阅读一下林锐博士的这本书,而且这本书一共也就101页,静下心来一天就能看完,并且希望大家能把其中的代码规范应用于自己的日常代码书写中。
最后,附上《高质量C/C++编程指南》电子版书籍 (百度网盘链接):