命名的注意规则
1.名字要完全、准确地描述出该变量所代表的事物
2.用名字表达变量所代表的是什么,不包含晦涩的缩写,同时也没有歧义
命名的要点
1.以问题为导向 强调是 WHAT,而不是 HOW
2.最适当的名字长度 经研究发现,变量名的平均长度在10到16个字符的时候,调试花的力气是最小的。平均名字长度在8到20隔字符的程序也几乎同样容易调试
3.变量名中的计算值限定词
很多程序都有表示计算结果的变量:总额、平均值、最大值,等等。如果你要用类似Total、Sum、Average、Max、Min、Record、String、Pointer这样的限定词来修改某个名字,那么请记住把限定词加到名字的最后。
这种方法的优点:
变量名中最重要的那部分,即为这一变量赋予主要含义的部分应当位于最前面,这样,这一部分就可以显得最为突出,并会被首先阅读到;
避免了由于同时在程序中使用totalRevenue和revenueTotal而产生的歧义
使用统一的编码规范可以提高可读性,简化维护工作。比如,revenueTotal、expenseTotal、revenueAverage、expenseAverage这组名字具有非常优雅的对称性。而totalRevenue、expenseTotal、revenueAverage、averageRevenue这组名字中则看不出什么规律来。
这条规则也有例外,那就是Num的限定词的位置已经是约定俗成的。Num放在变量名的开始位置代表一个总数,比如:numCustomers表示员工的总数。Num放在变量名的结束位置代表一个下标:customerNum表示的是当前员工的序号。这样使用Num常常会带来麻烦,因此,最好的方法是避开这些问题,使用Count或者Total来代表总数,使用Index来指代某个特定的员工。这样,customerCount就代表员工的总数,customerIndex代表某个特定的员工。
4.变量名中的常用对仗词 对仗词要使用正确,不然会产生歧义
常用对仗词如下:
begin/end
first/last
locked/unlocked
min/max
next/previous
old/new
opened/closed
visible/invisible
source/target
source/destination
up/dow
5.为特定类型的数据命名
为变量命名,除了通常的考虑事项之外,为一些特定类型数据的命名还要求作出一些特殊的考虑。比如,循环变量、状态变量、临时变量等等。
为循环下标命名
在循环中,最常见的下标变量就是i,j,k,如:
for(i = 0; i < arrLen; i++) {
// ...
}
如果循环下标变量只在循环内部使用,那么如此使用是没问题的,但是,如果该变量需要在循环之外使用,那么就应该为它取一个比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;
}
}
score[teamIndex][eventIndex] 比 score[i][j]给出的信息更多。
注意:如果你一定要用i、j、k,那么不要把它们用于简单循环的循环下标之外的任何场合,避免造成误解。要想避免这种问题,最简单的方法就是使用更好的命名而不是i,j,k。
6.为状态变量取一个比flag更好的名字。
最好是把标记看作是状态变量。标记的名字中不应该含有flag,因为你从中丝毫看不出该标记是做什么的。
为清楚可见,标记应该使用枚举变量、具名常量,或用作具名常量的全局变量来对其赋值。
看看下面比较差的标记命名:
if ( flag ) ...
if ( statusFlag & 0x0F ) ...
if ( printFlag == 16 ) ...
if ( computeFlag == 0 ) ...
flag = 0x1;
statusFlag = 0x80;
printFlag = 16;
computeFlag = 0;
上面这段代码反映不出能做什么,如果没有文档,不知道statusFlag = 0x80的含义是什么。下面是作用相同但更为清晰的代码:
if ( dataReady ) ...
if ( characterType & PRINTABLE_CHAR ) ...
if ( reportType == ReportTyoe_Annual ) ...
if ( recalcNeeded == false ) ...
dataReady = true;
characterType = CONTRAL_CHARACTER;
reportType = ReportType_Annual;
recalNeeded = false;
这段代码更加清晰。而且说明你可以结合枚举类型和预定义的具名常量来使用这种方法。
如果你发现自己需要猜测某段代码的含义的时候,就该考虑为变量重新命名。代码应该尽可能直接读懂。
7.为临时变量命名
8.为布尔变量命名
典型的布尔变量名:
done
error
found
success/ok
使用肯定的布尔变量名。避免双重否定:not notFound
9.为枚举类型命名
在使用枚举类型的时候,可以通过使用组前缀,如Color_,Planet_或者Month_来明确标识该类型的成员都同属于一个组
10.为常量命名
在具名常量时,应该根据该常量所表示的含义,而不是该常量所具有的数值为该抽象事物命名。比如FIVE是个很糟糕的常量名,CYCLES_NEEDED是个不错的名字。
网友评论