9.4.1 与语言无关的约定准则
以下是一些与语言无关的约定准则:
标识全局变量。常见的编程问题之一是误用全局变量。可以在所有的全局变量前面都加
上g_作为前缀来解决。比如看到g_Running Total时,程序员就会知道这是一个全局变量,从而
把它作为全局变量对待。
标识模块变量。模块变量是在模块内部供几个子程序使用的变量。要能清楚地表明它既不
是全局变量也不是局部变量。这可以用在变量前加m_作为前缀来解决。在C 中,你可以通过在
任何子程序外说明Static 变量来建立模块层次的数据。这样的变量对文件中子程序来说都是可
用的,但文件外的子程序则无法使用。
标识类型定义。类型的命名约定需要有两个功能:它们要明确地指出某一名称是类型名称,
同时要可以避免类型名称与变量名称相冲突。为了达到这两个要求,使用前缀或后缀不失为一
个好办法。在 Pascal 中,可以使用小写的_t 来表示类型名称,例如 Color_t 或 Menu_t。在C
中用这种办法稍有些困难,常见的办法是用大写字母组合如COLOR或MENU来表示类型名,但这
可能与命名预处理程序常量相混淆。而“_t”这一约定已经被标准类型size_t 所采用了,因此可
以用“_T"表示类型名称,如COLOR_T 和MENU_T。
标识命名常量。需要对命名常量加以标识,以便可以使你知道是在用一个变量(其值可能
变动)还是在用一个命名常量给某个变量赋值。在Pascal或C 中,你还可能是在用函数给某一
变量赋值。这些语言,并不要求函数使用括号。而在C中,即使是不带参数的函数也必须使用
括号。
给命名常量命名的一种办法是“_C”作为其名称的后缀。在Pascal中,用这种方法可以产
生出像MaxRecs_C或MaxlinesPerPage_ C之类的名字。在C 中,你可以用“_C”作为其后缀。
标识枚举类型。与命名常量同样的原因,枚举类型也需要被标识出来。即将其与变量、命
名常量和函数加以区别。常用的方式是用“_e”或“_E”作为后缀。
标识输入参数。有时输入参数会被错误改动。在像C 或Pascal这样的语言中,当一个被改
变过的值返回调用子程序时,必须予以明确地说明。在C 中,这是用“*”说明的,在Pascal
中用的是VAR,Ada语言中使用的是out限定词。在其它语言如Fortran 中,如果你改变了一个
输入值,那么不管你是否愿意,它都将被返回,但假如你建立了命名约定,在约定中规定只用
于输入的参数前面要采用IP 作为前缀,那么当发现在等号左边出现了带有IP 前缀的变量时,
你就可以知道发生了错误。比如在程序中看到IPMAX = IPMAX+l语句,就可以立刻认定它是
错误的,因为前缀IP 表明IPMAX 的值是不允许变动的。
对名字作格式化以增强可读性。增强可读性常见的两项技术是用分隔字符或大写字母将单
词分隔开来。例如,GymnasticsPointTotal 或Gymnastic_Point_Total 的可读性显然是要强于
GYMNASTICSPOINTTOTAL。C、PASCAL、Ada 和其它语言都允许大小写混用的方式。C、
Pascal和其它语言都允许使用的下划线“_”作为分隔符。
尽量不要混合使用这两项技术,那样会降低可读性。如果坚持采用其中任何一种,那么你的
代码的可读性将大为改观,关于变量名第一个字母是否应该大写的问题,激烈的争论已经持续
了很长时间(是TotalPoints 好还是totalPoints好?)。但是只要保持一致性,我认为二者区
别实际上并不大。