13.1 不要使用goto语句
13.2 不要替换C语言组成要素
仔细观察程序员这个群体可以发现,个性保守或激进的程序员对编程的态度也趋于保守或激进。比如,仍然有些程序员对已经被人们遗忘的PASCAL语言年年不忘,它们一直致力于固守PASCAL的语法,甚至在使用C语言时都试图按照PASCAL的编码风格编写,甚至发明了专门的方法。
#define BEGIN {
#define END }
这些程序员用BEGIN和END替换C语言的两个大括号,并由此幻想和PASCAL的“秘密再会”。
除了这些保守的程序员,还有一群人错误使用C语言的预处理功能。可以将这些人成为“伪改良主义者”。与用BEGIN和END替换大括号不同,他们用@和$这种自己看起来更顺眼的符号替换大括号。这些人全凭自己的心意编写代码,但在熟悉C语言的程序员眼中,这种形态的代码只会让人闹心。
13.3 缩短过长数据类型名称
‘张有才有福聪明伶俐健康长寿……’
这是很久之前的一个笑话里出现的小孩儿的名字。父母期望自己的孩子未来能一切顺利,故而将所有美好的祝福聚集在一起,为孩子起了这样一个名字。然而有一天,孩子不幸掉进水里,父母还没有来得及叫完全名,孩子就已经一命呜呼了。这真是个悲伤的笑话。
以C语言为例,仅整形数据即可分化为多种形态,如下所示:
- int
- unsigned int
- short int
- unsigned short int
- long int
- unsigned long int
如此看来,数据类型名称只能像unsigned long int这样不断增加长度。和前文中的“张有才有福……”一样,这种较长的数据类型名读起来很别扭,而记住这种数据类型名更难上加难。
因此,程序员并不会直接使用数据类型名。很多程序员使用被typedef命令重定义后的较短的数据类型名,如下所示:
typedef unsigned long int ULI;
typedef unsigned short int USI;
仅缩短数据类型名还略显不足。大部分程序单元只会用到几个有限的数据类型,并不会使用编程语言提供的所有数据类型。而程序用到的这几个为数不多的数据类型,也通常只有在声明一些有特殊含义的变量时才会派上用场。
一编写汽车模拟系统的速度控制模块为例。时速可能不小于0,一般也不会超过300000米。因此,unsigned long int就足以表示速度。而瞬间加速度可能小于0,所以应该用long int表示。由此可知,如果将这两种数据类型用更容易理解的名字重命名,那么编写程序时会更加得心应手。如下所示:
typedef unsigned long int SPEED;
typedef long int ACCEL;
此时不可能用SPEED数据类型声明表示加速度的变量,同样,也不会用ACCEL数据类型声明表示速度的变量,而且程序也更容易理解。因此,用typedef命令重新定义数据类型名可以得到以下优点:
- 可以缩短原本较长的数据类型名
- 可以用于变量特性相吻合的数据类型声明变量
- 程序可读性更高、更容易理解
13.4 使用if语句而非三元运算符
从便于阅读,即可读性角度看,if语句更好。
13.5 数组维数应限制在三维之内
13.6 考虑驱动函数main函数的作用
13.7 将常量替换为符号常量或const形态常量
13.8 考虑变量声明部分的顺序
在变量声明部分中,安排变量声明语句时,最好按照一定标准排列。也就是说,根据用户自定义数据类型、外部变量、静态变量、全局变量、局部变量的顺序排列,或根据使用范围从宽到窄、变量名从长到短的顺序排列。
哪种顺序最优并不重要,最重要的是事先指定标准,之后严格遵守。只有这样,开发人员讨论程序或验收代码时,才能立刻找到特定变量。
13.9 尽可能不使用全局变量
扰乱程序逻辑、增大理解难度的重要因素之一就是全局变量。
优秀的编码习惯应该是避免使用全局变量。事实上,几乎所有全局变量都可以用局部变量和函数参数代替。不通过全局变量共用某值,而是在局部变量中保存该值,然后每次与函数之间以值传递的形式进行处理。
13.10 遵循KISS原则
KISS是Keep it simple and short的首字母缩写。
代码更易于理解会带来以下这些好处:
- 易于修复代码漏洞(debugging)
- 易于重构代码(refractoring)
- 易于维护代码(maintenance)
- 易于修复代码(rebuilding)
- 易于复用代码(reusing)
网友评论