1. 前言

你写代码时最头疼的是什么,算法?逻辑?还是框架技术?我个人感觉最头疼的一直都是变量命名,今天来聊聊这个话题。欢迎加入微信圈子程序员交流圈 交流编程经验,欢迎投稿。

2. 命名是一门艺术

在中国传统文化中,起名(命名)是十分严肃和庄重的事情。有辈分、生辰八字、以及其它的一些纪念意义之说。当别人告诉你他叫 “王伯堂”时,你会从中知道他可能是家中的老大,如果他告诉你他还有个弟弟,你可能会想到他叫“王仲堂”。

编程中的命名也应当如此,良好的命名可以提高代码的可读性,可理解性,让阅读者直接有代入感。所以在我看来命名更像一门艺术。

3. 一些实践中的经验

我也时常为之而头疼,但是我尽量做好这件事。接下来来讲讲我的一些命名经验。我们命名一定要把其功用描述出来,否则你遇到 abbc01sb 这些变量估计要疯掉,缩写如果是公认约定俗成的也是可以的。言之有物 是最低的要求。

3.1 变量的命名

变量常

用来标识一些属性,比如我们用一个变量height来表示身高。但是这足够清晰地表达这个变量的含义吗?如果是人的身高,或许你加上一个 human 更加明确,即 humanHeight。可总结为 谁的(什么样的)具体属性。对于一些具有集合属性的变量我们命名中体现其集合特性也是极好的,比如 studentList 或者 students。临时变量我通常会包含 temp 后缀。其它比如还有一些约定俗成的命名,比如 i 通常用来代指索引(index)。总的一般来说变量命名以名词和其修饰词组合为主。

约定俗成也具有语言的局限性,eJava 中为异常(exception)而在 JavaScript 通常为事件(event)。

3.2 方法中的命名

对于方法的命名同样需要我们能从名字上知道该方法的具体作用(do what)。是否应该表明方法具体的作用取决于你的具体逻辑,如果就是获取人的身高我们可以命名为 getHumanHeight, 如果不确定只获取人的身高我们可以泛化地命名为 getHeight 。方法的入参也应该采取同样的策略。

想出好的命名的确很难,但是有难的道理,因为好的命名需要只用一两个单词出表达你的根本意思。通常,如果你无法想出一个合适的名字,意味着你的设计可能有问题。你的一个方法里是不是实现了太多的功能?或者你的类的封装,凝聚性不够强?—— Stackoverflow 创始人 Jeff Atwood

3.3 接口的命名

我认为 接口 通常是某种特定的功能的抽象,因此通常接口以 able 结尾, Java 中的 CloneableRunnable等等。但是也不一定,如果接口表达的是同一类事物的共性,也可以这一类的抽象概括命名,比较知名的就是 Servlet 规范中的Filter。还有一些命名方式体现了其使用了某个设计模式,比如 工厂模式使用了 Factory、模版方法模式通常会以 Template 结尾。总之 只要你的命名体现出了该接口的能力我觉得都是合适的

有些规范认为接口应该以大写字母 I 开头,我并不认为这是一个好的选择,而且它不美观。

3.4 类的命名

如果说 接口 是功能的泛化,那么其实现类应该是功能的具体化。类的命名相对会具体一些,而且不一定必须要体现出接口的功能。但是对于基础类往往以 Base 开头,默认使用的实现类以 Default开头,如果是抽象类请以 Abstract 开头。3.3章节 提到的设计模式也通常是一个类命名的选择。总的来说类名称也是以名词和其修饰词组合为主。

4. 如何提高命名水平

首先需要有一些强迫症,否则自己会不在意这个事情。然后就是多阅读知名框架的源码,从大佬的代码中获取灵感。提高英语水平不但提高你命名能力而且对你上限的提升也是非常重要的。

不积硅步,无以至千里;不积小流,无以成江海。

5. 总结

简单写了一些我对编程中命名的一些看法和经验。完全一家之言!其实并没有什么银弹,一切都是积累。不知道你对编程命名有什么好的经验,不妨通过留言分享出来。