前言
本文内容主要是摘抄自《代码大全》中与变量名相关章节的内容,阐述当需要一个好的变量名需要注意哪些点。
变量名的力量
一个好的变量名是可读的,易记的和恰如其分的。考虑变量名时,名字需要完全、准确地描述出该变量所代表的事物。
x = xx - xxx;
balance = balance - lastpayment
一般对变量的描述就是最佳的变量名。 并且注意长度。
一个好的变量名通常反应的是问题,而不是解决方案,其通常表达的是”什么“(what)而不是”如何“(how)。 例如财务软件中,calcVal 变量名就比 sum 变量名更能表现问题领域。 员工数据记录则取名 employeeData 而不是简单的 data。
短的变量名也不总是不好的,例如 i, j ,k 这类变量名,一般就是在表示普通的循环计数器或者是数组下标,并且在这几行之外它没有任何作用。
程序中表示计算结果的变量: 总额,平均值,最大值等,如果要用类似,Total, sum, average, max ,min, record, string, pointer 这类的限定词来修改某名字,记住把限定词放在名字的最后。 就不会出现风格不统一同时使用 totalRevenue 和 revenuetotal 而产生的歧义。 且风格一致,提高可读性。
Num 限定词的位置也约定俗成。Num 放在变量名的开始位置表示总数: numCustomers 是员工总数。 Num 放在变量名结束的位置表示下标,customerNum 表示员工的序号。 当然由于这样会带来麻烦,更好的办法也是避开这个问题,通过 Count 或者 total 表示总数, index 来表示某个特定员工。
对仗词会让命名更加一致性,方便理解和记忆,下面是书中记录的常用的对仗词:
begin / end | | opened / closed
first / last | | visible / invisble
locked / unlocked | | source / target
min / max | | up / down
next / previous | | old / new
特定数据类型命名
循环变量
i,j,k 像是约定俗成的循环变量命名方式,如果循环体并不长,且循环变量不会在循环之外使用,那么可以用 i,j,k 简单表示。相反一旦循环体比较长,或者在循环体外还要使用,就需要一个更有意义的名字了。否则代码一长,编程人员可能就忘记了 i 本来具有的含义,更容易出错。
状态变量
要为状态变量取一个比 flag 更好的名字。标记的名字中不应该含有 flag, 因为从中丝毫看不出该标记是做什么的。为了清楚起见,标记应该用枚举类型、具名常量(const xxx)。
// NO
if(flag) ...
if(statusFlag & 0x0F) ...
if(printFlag == 16) ...
if(computeFlag == 0) ...
//Yes
if(dataReady) ...
if(characterType & PRINTABLE_CHAR) ...
if(reportType == ReportType_Annual) ...
if(recalcNeeded == false) ...
临时变量
临时变量用于存储计算的中间结果。它们通常被赋予 tmp,x 等一些模糊且缺乏描述性的名字。临时变量也最好是可以给出一个更加准确的变量名来增加代码的可读性。
布尔变量
一些比较常用的布尔变量名: done,error,found,success 等。 上面都是给布尔变量赋予隐含”真/假“ 含义的名字。 done 这样要么是 true 要么是 false。 如果是 status, sourceFile 这样的名字,是没有明确的 true 或者 false 在里面的,每件事情都有状态, true 就代表状态是 OK 的吗?不一定。 可以将 status 替换成 error 或者是 statusOK。
有一些喜欢在布尔名前面加上 is。 这边变量名变成了一个问题: isdone? isfound? 这种做法的好处是避免了模糊不清的名字, isStatus。 但是可读性略差, if(isFound) 可读性略差于 if(found)。
与语言无关的指导原则
区分变量和子程序名字,区分类和对象,标识全局变量,标识成员变量,标识类型声明等,上述未必有固定的风格,或者答案,有一些建议是加前缀,例如全局加 g_ 前缀,类型加 t_ 前缀,成员变量加 m_ 前缀等,包括是驼峰命名,还是下划线间隔,等等,选择一种格式并统坚持下去,就可以增加代码可读性。
从某种程度上,要求使用短变量名是早期计算的遗留物。早期语言一般要求把变量名长度限制在 2 ~ 8 个字符。于是慢慢有了一些简短的缩写名字。而缩写也有一般指导原则:
- 使用标准的缩写(字典中常见的缩写)
- 去掉素有非前置元音(computer → cmptr, screen→scrn)
- 去掉虚词:and, or , the 等
- 使用后每个单词的第一个或前几个字母
- 统一地使用每个单词的第一、第二或第三个字母后截断
- 使用名字中每一个重要单词,最多不超过三个
- 去掉无用的后缀 - ing, ed 等
上述一些原则本身就有冲突的地方,所以不需要满足所有的原则,选择其中一条即可。
- 避免使用令人误解的名字或缩写
- 避免使用具有相似含义的名字:recordNum 和 Numrecoeds 同时使用, fileNumber 和 fileIndex 等
- 避免使用不同含义却相似名字的变量。
- 避免使用发音相近的名字: wrap 和 rap
- 避免在名字中使用数字。
- 避免在名字中拼错单词。
- 不要仅靠大小写来区分变量名。
- 不要使用与变量含义完全无关的名字。
代码阅读的次数远远多于编写的次数。确保你所取的名字更侧重于阅读而不是编写方便。
以上只是书中列出的一些点,可以让我们有意识的去注意哪些点,想要写出可读性好,风格一致的代码还是在日常接触优秀开源项目源码时多加留意,学习和模仿。