编写代码过程中,随时需要命名。我们给变量、函数、参数、类和封包命名。差的命名对于计算机来说,是无所谓的,即使是a1、d3这种毫无意义的命名,甚至4sd23h55s这种人类根本无法记住的命名,计算机都能准确快速的识别。然而,一份好的代码,不仅是给计算机阅读的,更是给人类阅读的。所以,好的命名,对代码的阅读、维护、重构和debug都大有裨益。
名副其实
选个好名字需要花时间,但省下来的时间比花掉的多。如果一个名称需要注释来补充,那么这个命名就不是一个合格的命名。
int a; // elapsed time in days
其中,a这个变量毫无意义。我们应该选择指明了对方计量对象和计量单位的名称,例如:
int elapsedTimeInDays;
int dyasSinceCreation;
int fileAgeInDays;
通过名称,可以让读者知道发生了什么,为什么定义这个变量。这就是一个好名称的力量。
避免误导
- 避免使用平台或者系统的专用名称。比如string、int、aix和sco。
- 避免错误使用变量类型。比如accountList来指代账号,除非它真的是一个List。
- 避免使用相似的变量。比如axis2Help和aixs2help,这种相似的命名会给阅读带来极大的困扰。
做有意义的区分
如果程序员仅仅为了让编译器识别而写代码,这样的代码会不堪入目。比如下面的例子:
def copy_chars(a1, a2):
这种代码编译或者运行都是OK的,但是对于阅读来讲却是灾难性的。因为你在阅读copy_chars
代码中的逻辑时,要时刻想着a1是做什么的,a2是做什么的。如果使用source和destination,这样可读性就会好很多。
使用读的出来的名称
因为几百万年的进化,人类的大脑对能读的出来的信息更加敏感。如果变量名读不出来,讨论就会变得非常困难。比如,一个程序员命名学生家长的姓名,但他又不想使用names_of_students_parents
这种命名,于是便取了首字母拼成nosp作为变量名。如果此段代码review获取复盘,则只能读做n、o、s、 p,大大降低此变量的辨识度。
使用可搜索的名称
搜索在编程中的作用,是不言而喻的。给变量或者函数起一个便于搜索的名字,对于代码debug来说非常有用。
const int WORK_DAYS_PER_WEEK = 5;
本例中,使用WORK_DAYS_PER_WEEK
来替代5,不仅一目了然,而且便于搜索。如果搜索5,那么真正要看的逻辑就会淹没在海量的搜索结果中。
避免使用编码
带编码的名称通常不便发音,容易打错。也不必使用m_前缀来标明成员变量,因为IDE能够通过颜色区分成员变量。另外,你应该把类和函数做的足够小,以消除对成员前缀的需要。同样,接口也不必使用I来修饰,例如IShapeFactory
.我们不必让用户知道我给他们是一个接口,而就是让他们知道那是一个ShapeFactory。
避免思维映射
通常,编程中有些约定俗成的缩写。比如,在作用域小,没有名称冲突时,循环计数器可以被命名为i、j或者k。但如果没有约定俗称,建议不要使用思维映射。例如将count,命名为c。这样读者必须在脑中将它映射为真实概念。
网友评论