
为什么要有规则?
很多程序员,包括我自己都很讨厌规则,但是不能一概而论 命名规则有他的好处:
- 要求你更多地按规矩行事,集中精力关注代码更重要的特征;
- 有助于在项目之间传递知识;
- 有助于在新项目中更快速地学习代码;
- 有助于减少名字增生,在没有规则下,很容易给同一个对象起两个不同的名字;
- 弥补编程语言的不足之处;
- 强调相关变量之间的关系。
重点是要有一个规则,采用任何一个规则都好于不用规则
语义前缀 | 含义 |
---|---|
c | 数量(count) |
g | 全局变量 |
i | 数组的下标 |
p | 指针(pointer) |
first | 数组中需要处理的第一个元素 |
last | 数组中需要处理的最后一个元素,与first对应 |
lim | 数组中需要处理的元素的上限,通常,lim等于last+1 |
m | 类一级的变量 |
max | 数组或其他种类的列表中绝对的最后一个元素 |
min | 数组或其他种类的列表中绝对的第一个元素 |
- 能更为精确地描述一些含义比较模糊的名字
- 使名字变得更加紧凑
最重要的命名注意事项
- 名字要完全、准确地描述出该变量所代表的事物
- 用名字表达变量所代表的是什么,不包含晦涩的缩写,同时也没有歧义
例子
变量用途好名字,好描述坏名字,差描述
- 到期的支票累计额
runningTotal,checkTotal written,ct,checks,CHKTTL,x,x1,x2
高速列车的运行速度velocity,trainVelocity,velocityInMph velt,v,tv,x,x1,x2,train
当前日期currentDate,todaysDate cd,current,c,x,x1,x2,date
每页的行数linesPerPage lpp,lines,l,x,x1,x2
以问题为导向
一个好记的名字反映的通常都是问题,而不是解决方案。即,一个好名字通常表达的是什么(What),而不是怎么样(How)。通常来说,如果一个名字反映了计算机的某些方面而不是问题本身,那么它反映的就是“How”而非“What”了。
比如,考虑下面这两个变量命名:inputRec
和employeeData
。inputRec
是一个反映输入、记录这些计算概念的计算机术语。employeeData则直指问题领域,与计算机无关。
类似地,printerReady
比bitFlag
更能表达打印机的状态;在财务软件里,calcVar比sum
来得更准确。
最适当的名字长度
经研究发现,变量名的平均长度在10到16个字符的时候,调试花的力气是最小的。平均名字长度在8到20隔字符的程序也几乎同样容易调试。这并不意味着你的变量名一定要在8到20个字符,它强调的是,如果你查看自己写的代码时发现了很多更短的名字,那么你就需要认真检查,确保这些名字含义足够清晰。
下面展示变量名太长、太短或刚好的示例:
太长 : numberOfPeopleOnTheUsOlympicTeam; numberOfSeatsInTheStadium; maximumNumberOfPointsInModernOlympics
太短 : n, np, ntm; n, ms, nsisd; m, mp, max, points
正好 : numTeamMembers, teamMemberCount; numSeatsInStadium, seatCount; teamPointsMax, pointsRecord
变量名中的计算值限定词
很多程序都有表示计算结果的变量:总额、平均值、最大值,等等。如果你要用类似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
代表某个特定的员工。
变量名中的常用对仗词
对仗词要使用正确,不然会产生歧义。
常用对仗词如下:
- begin/end
- first/last
- locked/unlocked
- min/max
- next/previous
- old/new
- opened/closed
- visible/invisible
- source/target
- source/destination
- up/down
为特定类型的数据命名
- 为循环下标命名 不要使用i j 等 除非是非常简单的循环函数
- 状态变量命名 不要使用flag status 等 而是使用能反应出状态的具体的名字
- 临时变量 不要使用temp等 要把临时变量和变量同样对待
创建具备可读性的短名字
如果环境真的要求你创建简短的名字,请注意有些缩短名字的方法要好于其他的方法。
缩写的一般指导原则
下面列出几项用于创建缩写的指导原则。其中一些原则彼此冲突,所以不要试图同时应用所有的原则
- 使用标准的缩写
- 去掉所有非前置元音(computer => cmptr, screen => scrn, apple => appl, interger => intgr)
- 去掉虚词and,or,the等
- 使用每个单词的第一个或前几个字母
- 统一在每个单词的第一、第二或者第三个字母后截断
- 保留每个单词的第一个和最后一个字母
- 使用名字中的每一个重要单词,最多不超过三个
- 去掉无用的后缀--ing,ed等
- 保留每个音节中最引人注意的发音
- 确保不要改变变量的含义
- 反复使用上述技术,直到把每个变量名的长度缩减到了8-20个字符。
应当避免使用的命名
- 避免使用令人误解的名字或缩写,比如将"Fig and Almond Season"缩写为FALSE
- 避免使用具有相似含义的名字
- 避免使用具有不同含义但却有相似名字的变量
- 避免使用发音相近的名字
- 避免在名字中使用数字
- 避免在名字中拼错单词
- 避免使用英语中常常拼错的单词
- 不要仅靠大小写来区分变量名
- 避免使用多种自然语言
- 避免使用标准类型、变量和子程序的名字
- 不要使用与变量含义完全无关的名字
- 避免在名字中包含易混淆的字符,比如1(数字1)和l(字母l),0(数字0)和O(字母O)
参考: 《代码大全》《编写可维护的js》
链接:https://github.com/airbnb/javascript#naming-conventions
网友评论