目录
前言
本章所述原则主要适用于为变量——对象和基本数据———命名。不过它们也适用于为类、包、文件以及其他的编程实体命名。有关如何为子程序命名请参阅第7.3节“好的子程序名字”。
11.1 选择好变量名的注意事项
一个好的变量名是可读的、易记的和恰如其分的。你可以通过应用多条原则来实现这些目标。
11.1.1 最重要的命名注意事项
为变量命名时最重要的考虑事项是,该名字要完全、准确地描述出该变量所代表的事物。获得好名字的一种实用技巧就是用文字表达变量所代表的是什么。
- currentDate 和 todaysDate 都是很好的名字,因为它们都完全而且准确地描述出了“当前日期”这一概念。
- date 看上去不错,但经过最后推敲它也只是个坏名字,因为这里所说的日期并不是所有的日期均可,而只是特指当前日期;而 date 本身并未表达出这层含义。
11.1.2 最适当的变量名字
- 对于一个表示美国奥林匹克代表团成员数量的变量,你可能会把它命名为numberofPeopleonTheUsolympicream。
- 表示运动场中坐椅数量的变量可能会命名为 numberofseatsInThestadium。
- 表示某国代表团在现代奥运会上获得的最高分数的变量可能会命名为 maximumNumberofPointsInModernolympics。
- 表示当前利率的变量最好命名为 rate 或 interestRate,而不是r或x。
变量名的最佳长度似乎应该介于 x 和 maximumMumberofPointsInModernOlympics 之间。太短的名字无法传达足够的信息。诸如x1和 x2这样的名字所存在的问题是,即使你知道了x代表什么,你也无法获知x1 和x2之间的关系。太长的名字很难写,同时也会使程序的视觉结构变得模糊不清。
当变量名的平均长度在10 到16 个字符的时候,调试程序所需花费的气力是最小的(1990)。平均名字长度在8到20个字符的程序也几乎同样容易调试。这项原则并不意味着你应该尽量把变量名控制在9到15或者10到16 个字符长。它强调的是,如果你查看自己写的代码时发现了很多更短的名字,那么你需要认真检查,确保这些名字含义足够清晰。
11.1.3 变量名中的计算值限定词
很多程序都有表示计算结果的变量:总额、平均值、最大值,等等。如果你要用类似于 Total、 Sum、 Average、 Max、 Min、 Record、 String、 Pointer 这样的限定词来修改某个名字,那么请记住把限定词加到名字的最后。
这种方法具有很多优点。首先,变量名中最重要的那部分,即为这一变量赋值主要含义的部分应当位于最前面,这样,这一部分就可以显得最为突出,并会被首先阅读到。类似 revenuerTotal(总收入)、expenserTotal(总支出)、revenueAverage(评价收入)、expenseAverage(平均支出)这组名字的变量具有非常优雅的对称性。
- 用 Count 或者 Total 来代表员工的总数;
- 用 Index 来指代某个特定的员工。这样,customercount 就代表员工的数,customerIndex 代表某个特定的员工。
11.1.4 变量名中常用的对仗词
- begin/end
- first/last
- locked/unlocked
- min/max
- next/previous
- old/new
- opened/closed
- visible/invisible
- source/target
- source/destination
- up/down
11.2 为特定类型的数据命名
在为数据命名的时候,除了通常的考虑事项之外,为一些特定类型数据的命名还要求做出一些特殊的考虑。本节将讲述与循环变量、状态变量、临时变量、布尔变量、枚举类型和具名常量有关的考虑事项。
11.2.1 为循环下标命名
循环是一种极为常见的计算机编程特征,为循环中的变量进行命名的原则也由此应运而生。i、j和k这些名字都是约定俗成的。
1、 如果一个变量要在循环之外使用,那么就应该为它取一个比i、j或者k更有意义的名字。举个例子,如果你在从文件中读取记录,并且需要记下所读取记录的数量,那么类似于 recordCount 这样的名字就很合适:
2、如果循环体有较多行,那么读者会很容易忘记 i本来具有的含义,因此你最好给循环下标换一个更有意义的名字。由于代码会经常修改、扩充,或者复制到其他程序中去,因此,很多有经验的程序员索性不使用类似于 i这样的名字。导致循环变长的常见原因之一是出现循环的嵌套使用。如果你使用了多个嵌套的循环,那么就应该给循环变量赋予更长的名字以提高可读性:
11.2.2 为状态变量命名
状态变量用于描述你的程序的状态。下面给出它的命名原则。
为状态变量取一个比 flag 更好的名字 。最好是把标记(flag)看做状态变量。标记的名字中不应该含有 flag,因为你从中丝毫看不出该标记是做什么的。为了清楚起见,标记应该用枚举类型、具名常量,或用作具名常量的全局变量来对其赋值,而且其值应该与上面这些量做比较。下面例子中标记的命名都很差:
像 statusF1ag= 0x80 这样的语句是反映不出这段代码能做什么的,除非你亲自写了这段代码,或者有文档能告诉你 statusFlag 和 0x80 的含义。下面是作用相同但更为清晰的代码:
11.2.3 为临时变量命名
略。
11.2.4 为布尔变量命名
下面是为布尔变量命名时要遵循的几条原则。
1、谨记典型的布尔变量名 。下面是一些格外有用的布尔变量名:
- done。 用 done 表示某件事情已经完成。这一变量可用于表示循环结束或者一些其他的操作己完成。在事情完成之前把 done 设为 false,在事情完成之后把它设为 true。
- error。 用 error 表示有错误发生。在错误发生之前把变量值设为 false,在错误已经发生时把它设为 true。
- found 。用 found 来表明某个值已经找到了。在还没有找到该值的时候把found 设为 false,一旦找到该值就把 found 设为 true。在一个数组中查找某个值,在文件中搜寻某员工的 ID,在一沓支票中寻找某张特定金额的支票等等的时候,都可以用 found。
- Success 或 ok。 用 success 或 ok 来表明一项操作是否成功。在操作失败的时候把该变量设为 false,在操作成功的时候把其设为 true。如果可以,请用一个更具体的名字代替success,以便更具体地描述成功的含义。如果完成处理就表示这个程序执行成功,那么或许你应该用 processingComplete 来取而代之。如果找到某个值就是程序执行成功,那么你也许应该换用 found。
2、使用肯定的布尔变量名。 否定的名字如 notFound、 notdone 以及 notSuccessful等较难阅读,特别是如果它们被求反:if not notFound。
- 这样的名字应该替换为 found、 done 或者 processingComplete,然后再用适当的运算符求反。如果你找到了想找的结果,那么就可以用 found 而不必写双重否定的 not notFound了。
11.2.5 为枚举变量命名
在使用枚举类型的时候,可以通过使用组前缀,如 Color_,Planet_或者Month_来明确表示该类型的成员都同属于一个组。下面举一些通过前缀来确定枚举类型元素的例子:
在有些编程语言里,枚举类型的处理很像类,枚举成员也总是被冠以枚举名字前缀,比如 Color.Color_Red 或者 Planet. Planet_Earth(java语言就是这样)。如果你正在使用这样的编程语言,那么重复上述前缀的意义就不大了,因此你可以把枚举类型自身的名字作为前缀,并把上述名字简化为 Color. Red 和 Planet. Earth。
11.2.6 为常量命名
在具名常量时,应该根据该常量所表示的含义,而不是该常量所具有的数值为该抽象事物命名。FIVE 是个很糟的常量名(不论它所代表的值是否为 5.0)。CYCLES_NEBDED 是个不错的名字。CYCLES_NEEDED 可以等于 5.0 或者 6.0。而 FIVE=6.0 就显得太可笑了。出于同样原因,BAKERS_DOZEN 就是个很糟的常量名;而DONUTS_MAX 则很不错。
11.3 命名规则的力量
11.3.2 何时采用命名规则
没有金科玉律表明何时应该建立命名规则,但是在下列情况下规则是很有价值的:
- 当多个程序员合作开发一个项目时
- 当你计划把一个程序转交给另一位程序员来修改和维护的时候(这几乎总是会发生)
- 当你所在组织中的其他程序员评估你写的程序的时候
- 当你写的程序规模太大,以致于你无法在脑海里同时了解事情的全貌,而必须分而治之的时候
- 当你写的程序生命期足够长,长到你可能会在把它搁置几个星期或几个月之后又重新启动有关该程序的工作时
- 当在一个项目中存在一些不常见的术语,并且你希望在编写代码阶段使用标准的术语或者缩写的时候
你一定会因使用了某种命名规则而受益。上述诸多注意事项将会帮助你决定在一个特定项目中按照何种程度来制定规则里所使用的规则的范围。
11.4 非正式命名规则
略
11.5 标准前缀
略
11.6 创建具备可读性的短名字
略
11.7 应该避免的名字
略