第13章 编写易于理解的代码所需编码准则

2019-08-05  本文已影响0人  FelixDai

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语言为例,仅整形数据即可分化为多种形态,如下所示:

如此看来,数据类型名称只能像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命令重新定义数据类型名可以得到以下优点:

  1. 可以缩短原本较长的数据类型名
  2. 可以用于变量特性相吻合的数据类型声明变量
  3. 程序可读性更高、更容易理解

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的首字母缩写。

代码更易于理解会带来以下这些好处:

  1. 易于修复代码漏洞(debugging)
  2. 易于重构代码(refractoring)
  3. 易于维护代码(maintenance)
  4. 易于修复代码(rebuilding)
  5. 易于复用代码(reusing)
上一篇 下一篇

猜你喜欢

热点阅读