变量名的力量Word文档下载推荐.docx
《变量名的力量Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《变量名的力量Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
子程序命名:
第7.3节
类的命名:
第6.2节
是使用变量的一般事项:
第10章
格式化数据声明:
第31.5节中的“数据声明的布局”
注释变量:
第32.5节中的“注释数据声明”
尽管讨论如何为变量取好的名字与讨论如何高效编程同样重要,我却还没看到任何资料能将创建好的名字的注意事项涵盖一二。
很多教科书只用几段的篇幅讲讲如何选择缩写,几句老生常谈,指望你能自己解决这个问题。
我却要反其道而行之:
就如何去一个好的名字给你大量的信息,多的你可能根本都不会用到!
怂阐譜鯪迳導嘯畫長凉馴鸨。
本章所诉原则主要适用于为变量------对象和基本数据---命名。
不过它们也适用于为类,包,文件以及其它的编成实体命名。
有关如何为子程序请参阅第7.3节“好的子程序名字”谚辞調担鈧谄动禪泻類谨觋。
11.1选择好变量名的注意事项
你可不能像给狗取名字那样给变量命名----仅仅因为它很可爱或者听上去不错。
狗和狗的名字不一样,它们是不同的东西,变量和变量名酒本质而言却是同一事物。
这样一来,变量的好与坏就在很大程度上取决于它的命名的好坏。
在给变量命名的时候需要小心谨慎。
嘰觐詿缧铴嗫偽純铪锩癱恳。
下面举一个使用不良变量名的例子:
Java示例糟糕的变量名
x=x–xx;
xxx=fido+SalesTax(fido);
x=x+LataFee(x1,x);
+xxx;
x=x+Interest(x1,x);
这段代码究竟在做什么?
x1,xx和xxx代表什么?
fido又是什么意思?
假如说有人告诉你这段代码基于一项余额和一组新开销来计算一位顾客的支付总额,那么你应该适用哪个变量来为该顾客的那组新的花销打印账单呢?
熒绐譏钲鏌觶鷹緇機库圆鍰。
下面是这些代码的另一种写法,它可以使上述问题回答起来非常容易:
Java示例:
良好的变量名
balance=balance–lastPayment;
monthlyTotal=newPurchases+SalseTax(newPurchases);
鶼渍螻偉阅劍鲰腎邏蘞阕簣。
balance=balance+LatFee(customerID,balance)+monthlyTotal;
纣忧蔣氳頑莶驅藥悯骛覲僨。
balance=balance+Insert(customerID,balance);
从上述两段代码的比较中可以看出,一个好的变量名是可读的,易记的和恰如其分的。
你可以通过应用多条原则来实现这些目标。
颖刍莖蛺饽亿顿裊赔泷涨负。
最重要的命名注意事项
为变量命名时最重要的考虑事项是,该名字要完全,准确地描述出该变量所代表的事物。
获得的好名字的一种实用技巧就是用文字表达所代表的是什么。
通常,对变量的描述就是最佳的变量名。
这种名字很容易阅读,因为其中并不包含晦涩的缩写,同时也没有歧义。
因为它是对该事物的完整描述,因此不会和其它事物混淆。
另外,由于这一名字与所表达的概念相似,因此也容易记忆。
濫驂膽閉驟羥闈詔寢賻減栖。
对于一个表示美国奥林匹克代表团成员数量的变量,你可能会把它命名为numberOf
PeopleOnTheUsOlympicTeam.表示运动场中座椅数量的变量可能会命名为numberOfSeatInTheStadiu.表示某国代表团在现代奥运会上获得的最高分数的变量可能会命名为maxmumNumberOfPointsInModernOliympics.表示当前利率的变量最好命名为rate或interestRate,而不是r或x。
你明白了吧。
銚銻縵哜鳗鸿锓謎諏涼鏗穎。
请留意上述这些命名所共有的两个特征。
首先,它们都很容易理解。
事实上它们更笨不需要什么解释,因为你可以很轻松地读懂它们。
不过第二点,有些字太长了——长的很不实用。
下面我很快就会讲到变量名的长度问题。
挤貼綬电麥结鈺贖哓类芈罷。
表11-1中给出了更多变量名称的例子,其中有好的也有差的。
变量用途
好名字,好描述
坏名字,差描述
到期的支票累计额
runningTotal,checkTotal
written,ct,checks,CHKTTL,x
高速列车的运行速度
velocity,trainVelocity,velocityInMph
velt,v,tv,x,x1,x2,data
当前日期
currentDate,todaysDate
cd,current,c,x,x1,x2,data
每页的行数
linesPerPage
lpp,lines,1,x,x1,x2
currentDate和todaysDate都是很好的名字,因为他们都完全而且准确地描述了“当前日期”这一概念。
事实上,这两个名字都用了非常直白的词。
程序员有时候会忽视这些普通词语,而它们往往却是最明确的。
cd和c是很糟的命名,因为它们太短,同时又不具有描述性。
Current也很糟,因为它并没有告诉你它当前是什么。
Data看上去不错,但经过最后推敲它也只是个坏名字,因为这里所说的日期不是所有的日期均可,而是特指当前日期;
而data本身并未表达出这层含义。
X,x1,和x2永远是坏名字——传统上用x代表一个未知量;
如果不希望你的变量所代表的变量是一个未知量,那么请考虑取一个更好的名字吧。
名字应该尽可能地明确。
像x,temp,i这些名字都泛泛得可以用于多种目的,它们并没有像应该的那样提供足够信息,因此通常都是命名上的败笔。
赔荊紳谘侖驟辽輩袜錈極嚕。
以问题为向导
一个好记的名字反映的通常都是问题,而不是解决方案。
一个好名字通常表达的是“什么”(what),而不是“如何”(how)。
一般而言,如果一个名字反映了计算机的某方面而不是问题本身,那么它反映的就是“how”而非“what”了。
请避免选取这样的名字,而应该在名字中反映出问题本身。
塤礙籟馐决穩賽釙冊庫麩适。
一条员工数据记录可以称作inputRec或者employeeData。
inputRec是一个反映输入、记录这些计算概念的计算机术语。
employeeData则是直指问题领域,与计算机的世界无关。
于此类似,对一个用于表示打印机状态的位域来说,bitFlag就要比printerReady更具计算机特征。
在财务软件里,calcVal的计算痕迹也要比sum更明显。
裊樣祕廬廂颤谚鍘羋蔺递灿。
OptimumNameLength
最适当的名字长度
变量名的最佳长度似乎应该介于x和maximumNumberOfPointsInModernOlympics之间。
太短的名字无法传达足够的信息。
诸如x1和x2这样的名字所存在的问题是,即使你知道了x代表什么,你也无法获知x1和x2之间的关系。
太长的名字很难写,同时也会使程序的视觉结构变得模糊不清。
仓嫗盤紲嘱珑詁鍬齊驁絛鯛。
Gorla、Benander和Benander发现,当变量名的平均长度在10到16个字符的时候,调试程序需要花费的力气使最小的(1990)。
平均名字长度在8到20个字符的程序也几乎同样容易调试。
这项原则并不意味着你应该尽可能把变量名控制在9到15或者10到16个字符长。
它更强调的是,如果你查看自己写的代码时发现了很多更短的名字,那么你需要认真检查,确保这些名字的含义足够清晰。
绽萬璉轆娛閬蛏鬮绾瀧恒蟬。
你可能几经通过Goldilocks-and-the-Three-Bears(金发姑娘喻三只小熊的经典通话,予以权衡比较)的方法理解了如何为变量命名,正如表11-2所示。
骁顾燁鶚巯瀆蕪領鲡赙骠弒。
表11-2变更量名太长、太短或刚好合适的示例
太长:
numberOfPeopleOnTheUsOlympicTeam
numberOfSeatsInTheStadium
maximunNumberOfPointsInModernOlympics
太短:
n,np,ntm
N,ms,nsisd
M,mp,max,points
正好:
numTeamMembers,teamMemberCount
numSeatInStadium,seatCount
teamPointsMax,pointsRecord
变量名对作用域的影响
短的变量名总是不好吗?
不,不总是这样。
当你把一个变更名取得很短的时候,如i,这一长度本身就对该变量做出了一些说明——也就是说,该变量代表的是一个临时的数据,它的作用域非常有限。
瑣钋濺暧惲锟缟馭篩凉貿锕。
阅读该变量的程序员应该也会明白,这一数值只会用于几行代码之内。
当你把变量名命名为i的时候,你就是在表示,“这是一个普通的循环技术七或者数组下标,在这几行代码之外它没有任何作用。
”鎦诗涇艳损楼紲鯗餳類碍穑。
W.J.Hansen所作的一项研究表明,较长的名字适用于到的变量或者全局便变量,而较短的名字则适用于局部变量或者循环变量(Shneiderman1980)。
不过,短的变量常常会带来一些麻烦,因此,作为一项防御式编程策略,一些细心的程序员会避免使用短的变量名。
栉缏歐锄棗鈕种鵑瑶锬奧伛。
对位于全局命名空间中的名字加以限定词如果你在全局中定义了一些变量(具名常量,类名等),那么请考虑你是否需要采用某种方式对全局命名空间进行划分,并避免产生命名冲突。
在C++和C#里,你可以使用namespace关键字来划分全局命名空间。
辔烨棟剛殓攬瑤丽阄应頁諳。
C++示例:
使用namespace关键字来划分全局命名空间
namespaceUserInterfaceSubsystem{
………
//lotsofdeclarations
}
namespaceDatabaseSubsystem{
如果你同时在UserInterfaceSubsystem和DatabaseSubsystem命名空间里声明了Employee类,那么你可以通过写UserInterfaceSubsystem:
:
Employee或者DatabaseSubsystem:
Employee来确定引用哪一个Employee。
在Java中,你也可以通过使用包(package)来达到同样的目的。
峴扬斕滾澗辐滠兴渙藺诈機。
在那些不支持命名空间或者包的语言里,你同样也可以使用命名规则来划分全局命名空间。
其中一项规则要求为全局可见的类加上带有子系统特征的前缀。
用户接口部分的雇员类可能命名为uiEmployee,数据库部分的雇员类可能命名为dbEmployee,这样做能把全局命名空间的命名冲突降到最低。
詩叁撻訥烬忧毀厉鋨骜靈韬。
变量名中的计算值限定词
很多程序都有表示计算结果的变量:
总额、平均值、最大值,等等。
如果你要用类似于Total、Sum、Average、Max、Min、Record、String、Pointer这样的限定词来修改某个名字,那么请记住把限定词加到名字的后面。
则鯤愜韋瘓賈晖园栋泷华缙。
这种方法具有很多优点。
首先,变量名中最重要的那部分,即为这一变量赋予主要含义的部分应当位于最前面,这样,这一部分就可以显得最为突出,并会被首先阅读到。
其次,采纳这一规则,你将避免由于同时在程序中使用totalRevenue和revenueTotal而产生的歧义。
这些名字在语义上示等价的,上述规则可以避