软件杂谈(2)- 正名

正名者,辨正名分也。

这一篇,我们简短聊一个很多人不屑于聊的话题,程序中的命名问题。

也就是说,我们在写程序的时候,一个函数、变量、类、名空间文件到底应该如何辨正名分。

这个问题看似不值一提,可在大叔眼里,命名非常重要,名字好坏有可能决定程序的命运。

什么!什么!没这么严重吧?


-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 蘭山 -

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,904评论 18 139
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,138评论 1 32
  • 要對自己足夠狠 才有可能得到想要的
    天娜日記阅读 163评论 0 0