“为变量命名” 恐怕是编程中最普通的一项活动, 一般介绍编程风格的书都会用几页的 篇幅给出一些好的建议[KP99, Section 1.1],而《代码大全》用了整整一章 30 多页的篇幅 (第 11 章)来讨论变量的命名,另外第 7.3 节专门讨论子程序的命名,第 6.2 节讨论了类 的命名。如果变量、子程序和类型命名得当,代码本身就能用作程序的文档,可以减少注释 和外部
文档(第 32.2 节)。 变量名 为变量命名时最重要的考虑事项是, 该名字要完全、 准确地描述出该变量所代表的事物。 currentDate 和 todaysDate 都是很好的名字,因为它们都完全而且准确地描述出了“当前 日期”这一概念。事实上,这两个名字都用了非常直白的词。程序员们有时候会忽视这些普 通词语,而它们往往却是最明确的。cd 和 c 是很糟的命名,因为它们太短,同时又不具有 描述性。current 也很糟,因为它并没有告诉你是当前的什么。date 看上去不错,但经过最 后推敲它也只是个坏名字, 因为这里所说的日期并不是所有的日期均可, 而只是特指当前日 期;而 date 本身并未表达出这层含义。x、x1 和 x2 永远是坏名字——传统上用 x 代表一个 未知量;如果你不希望你的变量所代表的是一个未知量,那么请考虑取一个更好的名字吧。 名字应该尽可能地明确。像 x、temp、i 这些名字都泛泛得可以用于多种目的,它们并 没有像应该的那样提供足够信息,因此通常都是命名上的败
笔。有人也许会反驳说,把 i 用作循环下标是最正常不过的了,难道非得写成 indexOfTheLoop 这种又臭又长的名字才算 好吗? Steve McConnell 认为,如果循环只有寥寥数行,而且只是单层循环,那么用 i 是也是 可行的。不过试想一下,如果你一直习惯用 i 作循环下标,而你将来可能需要把这个循环放 到另一个循环中去执行,即循环嵌套,那么内外层循环都用 i 作下标肯定是不行的。如果编 译器提醒你说变量 i 重复定义,那还算走运;如果编译器默不作声,而你自己又忘了修改, 呃,你听见虫子飞舞的声音了吗?由于代码会经常修改、扩充,或者复制到其他程序中去, 因此很多有经验的程序员索性不使用类似于 i 这样的名字。
如果循环不是只有几行, 那么代码阅读者会很容易忘记 i 本来具有的含义, 因此最好给 循环下标换一个更有意义的名字。 导致循环变长的常见原因之一是出现循环的嵌套使用。 如 果你使用了多个嵌套的循环,那么就应该给循环变量赋予更长的名字以提高可读性: for (int teamIndex = 0; teamIndex < teamCount; teamIndex++){ for (int eventIndex = 0; eventIndex < eventCount[teamIndex]; eventIndex++){ score[teamIndex][eventIndex] = 0; } } 谨慎地为循环下标变量命名可以避免产生常见的下标串话(index cross-talk)问题: 想用 j 的时候写了 i,想用 i 的时候却写了 j。同时这也使得数据访问变得更加清晰: score[teamIndex][eventIndex]要比 score[i][j]给出的信息更多。 如果你一定要用 i、j、k,那么不要把它们用于简单循环的循环下标之外的任何场合— —这种传统已经太深入人心了, 一旦违背该原则, 将这些变量用于其他用途就可能造成误解。 要想避免出现这样的问题,最简单的方法就是想出一个比 i、j、k 更具描述性的名字来。 变量名的最佳长度似乎应该介于 x 和 maximumNumberOfPointsInModernOlympics 之间。 太短的名字无法传达足够的信息。 诸如 x1 和 x2 这样的名字所存在的问题是, 即使你知道了 x 代表什么,也无法获知 x1 和 x2 之间的关系。太长的名字很难写,同时也会使得程序的视 觉结构变得模糊不清。 研究发现, 当变量名的平均长度在 10 到 16 个字符的时候, 调试程序所需花费的气力是 最小的。平均名字长度在 8 到 20 个字符的程序也几乎同样容易调试。这项原则并不意味着 你应该尽量把变量名的长度控