原则3 嵌套循环的迭代变量的命名尽量表明其含义,而不是使用i,jk
如果循环下标变量只在循环内部使用,那么如此使用是没问题的,但是,如果该变量需要在循环之外使用,那么就应该为它取一个比i,j,k更有意义的名 字。举个栗子,如果你从文件中读取记录,并且需要记下所读取记录的数量,那么类似于redcordCount这样的名字就更合适:
recordCount = 0;
while ( moreScores() ) {
score[recordCount] = GetNextScore();
recordCount++;
}
// using recordCount
另一种情况就是嵌套循环,比较常犯的错误就是在想写j的时候写了i,想用i的时候却写了j。
如果你使用了多个嵌套的循环,那么就应该给循环变量赋予更长的名字以提高可读性:
for ( teamIndex = 0; teamIndex < teamCount; teamIndex++) {
for ( eventIndex = 0; eventIndex < eventCount[teamIndex]; eventIndex++) {
score[teamIndex][eventIndex] = 0;
}
}
变量名中的常用对仗词
对仗词要使用正确,不然会产生歧义。
常用对仗词如下:
- begin/end
- first/last
- locked/unlocked
- min/max
- next/previous
- old/new
- opened/closed
- visible/invisible
- source/target
- source/destination
- up/down
临时变量常用于存储计算的中间结果,作为临时占位符,以及存储内部值。它们常被赋予temp,tmp,x或者其他一些模糊且缺乏描述性的名字。通 常,临时变量是一个信号,表明程序缘还没有完全把问题弄清楚。而且,由于这些变量被正式地赋予了一种“临时”状态,因此程序员会倾向于比其他变量更为随意 地对待这些变量,从而增加了出错的可能。
警惕临时变量
临时地保存一些变量是很有必要的。但无论从哪种角度看,程序中的大多数变量都是临时性的。把其中几个称为临时的,可能表明你还没有弄清它们的实际用途。看看下面的示例:
temp = sqrt( b^2 - 4*a*c );
root[0] = ( -b + temp ) / ( 2*a ); root[1] = ( -b - temp ) / ( 2*a );
更好的做法:
discriminant = sqrt( b^2 - 4*a*c );
root[0] = ( -b + discriminant ) / ( 2*a ); root[1] = ( -b - discriminant ) / ( 2*a );
典型的布尔变量名:
- done
- error
- found
- success/ok
给布尔变量赋予隐含“真/假”含义的名字。像done和success一样,它们的值不是true就是 false,表示某件事情完成了或者没有完成;成功或者失败。另一方面,想status这样的名字却是很糟的布尔变量名,因为它们没有明确的true或者 false。status是true反映的是什么含义呢?表示某件事情拥有一个状态吗?然而,每件事情都有状态。true表明某件事情的状态是OK吗?或 者说false表明没有任何错误吗?对于status,你什么都说不出。
为了更好的效果,可以把status命名为error或者statusOK。
有时,也可以在布尔变量名前加上Is。这样,变量名就成了一个问题:isDone?isError?isFound?用true或false回答问 题也就为该变量给出了取值。优点是不能用于那些模糊不清的名字,比如:isStatus?毫无意义。缺点就是降低了简单逻辑表达式的可读 性:if(isFound)的可读性要略差于if(Found)。
使用肯定的布尔变量名。避免双重否定:not notFound。
与语言无关的命名规则的指导原则
- 区分变量名和子程序名字
- 区分类和对象
- 标识全局变量
- 标识成员变量
- 标识类型声明
- 标识具名常量
- 标识枚举类型的元素
- 在不能保证输入参数只读的语言里标识只读参数
- 格式化命名以提高可读性