关于命名的点点

2016-08-19  本文已影响60人  Iris_Fighting

命名的注意规则

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是个不错的名字。

详情请见https://mp.weixin.qq.com/s?__biz=MjM5OTA1MDUyMA==&mid=2655436637&idx=2&sn=a2a9c57ebad535f31b91f7de700de569&scene=0&key=305bc10ec50ec19b387e7ff7c1ac3174c278cddf7a3b416485e9f33cc2792df88550720cb8d96d5bd5f03fb0327a5a31&ascene=0&uin=OTc2NjEzNjAw&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.11.5+build(15F34)&version=11020201&pass_ticket=ei4r2jx8g2HNdl%2FG%2BZ7FRaSyyrPTkW5SPpUFQirdO0bygn03ETTno2RqU2Ht9mtQ

上一篇 下一篇

猜你喜欢

热点阅读