正名者,辨正名分也。
这一篇,我们简短聊一个很多人不屑于聊的话题,程序中的命名问题。
也就是说,我们在写程序的时候,一个函数、变量、类、名空间、文件到底应该如何辨正名分。
这个问题看似不值一提,可在大叔眼里,命名非常重要,名字好坏有可能决定程序的命运。
什么!什么!没这么严重吧?
-1- 正名很重要
古人云:“立品为先,字如其人”。
意思是,先端正做人,再端正写字,通过写字能够影射出一个人的性格、心理、能力。
写程序也类似,通过代码中的命名也能够看出一个程序员的修养与功底。欲正其名,先正其心,一个连变量名都起不好的程序员,很难写出漂亮的代码。
《论语·子路》篇有“名不正则言不顺,言不顺则事不成”之说。名分不当、名实不符,说话就不合理,事情就很难办成。
程序既然是由编程语言表达的,名不正也会导致言不顺。命名不恰当,会造成大问题。如果你无法想出一个合适的名字,也许意味着你的设计有问题,需要加以重视。
试着想一想,假如把高级语言程序中的关键字、保留字、逻辑运算符号统统去掉,可不就剩下你那些命名了吗?这么大体量的内容,怎能不重要?
著名的问题调查网站Quora,曾经问过程序员觉得最难的事情是什么,经过大量反馈,命名占却了一半。
可见,命名是普遍问题,是难问题,是大问题。
那么,如何处理好这个问题呢?
大叔认为:欲正其名,必使其从类、符实、达意、守一,别无它法。
什么意思?让我们分而叙之。
-2- 从其类
所谓从其类,是说名字要能准确表达事物类别。
不需解释,这个名字是成员变量、是类、是方法、是函数,是单例、是集合、一目了然。
表达类别的习惯有很多,例如,用'm_'表达成员变量,‘f_'表明函数,前缀'_'表明私有,匈牙利命名法中把变量类型冠以名字。
这里不多累述,标准习惯实在太多,无论通用的还是公司自己制定的,统一即可。
-3- 符其实
所谓符其实,是说名字要能够符合事物的真实性。
既要简短,又无歧义;
要做到简短就要:
1)无多余表达
例如: isPageRedirectInCurrentWorkflow
如果没有Other Workflow的情况,InCurrentWorkflow就是多余的。
如果上下文就是表达Page Redirect,PageRedirect就是多余的。
例如: getAllCustomers
如果没有Partial Customers, All就是多余的。
例如:labelString
如果是表达label字符串,String是多余的。
2)无重复表达
例如:类Customer的实例方法getCustomerName
getName即可,不必重复Customer
-4- 达其意
所谓达其意,是说名字要准确表达意图。
命名常会用动词、形容词来加以修饰,选好修饰词也很重要。
“鸟宿池中树,僧敲月下门。”
唐代诗人贾岛,为了斟酌“推”“敲”二字,行路中都在思考。准确表达命名的意图,也需要有推敲的精神。
例如:isXXX常用来判别变量是否是XXX类型。isShouldPay就不恰当,shouldPay即可;isInRange也不恰当, inRange即可。
例如:用getXXX, readXXX, fetchXXX, loadXXX要看行为的主体,有没有读取的过程,有没有网络传输,有没有加载的意图。
例如:少用when, if这些词。getPaymentPlanSchedulesWhenModification就是很丑的名字,可以用getModifiedPaymentPlan。
有些行业性软件,长久以来已经形成了些惯用的叫法,类似于行内话,最好能够参考行业惯例。
-5- 守其一
所谓守其一,是说名字要前后一致保持统一。
既是习惯的统一,也是情志的统一。
这一点非常重要,也是最常出的问题所在。即使命名不准确,也比前后不统一、混乱无章好。
例如:表达某个集合数据,有时候用data,有时候用items,有时候用list,有时候用collection,这就糟了。
命名的一致性,是代码整洁的基础,也能体现程序员修养的地方。
君子尚德,对内有诚的一面:言行一致,情志一致。对外有敬的一面:为人着想,不蔓不枝。
今天叫个猫,明天叫个咪,在这里不行。
事无巨细,欲写出漂亮的代码,要先从好的命名开始。
望诸君三思而命名。
-2018.07.04 蘭山 -