谈谈命名|TW洞见

今日洞见

文章作者、部分图片来自ThoughtWorks:黄博文。本文封面来自网络。

本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表。已经本网协议授权的媒体、网站,在使用时必须注明"内容来源:ThoughtWorks洞见",并指定原文链接,违者本网将依法追究责任。

Martin Fowler曾经在一篇文章中引用过Phil Karlton的话:

There are only two hard things in Computer Science: cache invalidation and naming things.

他说这句话在很长的一段时间内都是他最喜欢的话,可见命名对于广大程序员来说的确是个大问题。对于我们中国人而言,问题可能出在两个方面:

• 自打学编程开始就没被教育过要重视命名。

这个问题在谭浩强所著的《C语言入门》一书中可见一斑。这本书可以说是大多数程序员的大学入门教材,但本书通篇都是各种a,b,c以及x,y,z的命名方式。这种poor naming的方式被广大程序员纷纷效仿,导致如今大多数项目代码都充斥着诸如此类的命名。

• 命名需要一定的英文功底,而国内程序员的英文水平参差不齐。

很多程序员被教育后开始逐渐重视命名,但是自身英文水平有限,不知道该如何选取合适的英文词汇来进行命名。有的甚至直接将中文译成英文,抑或是用拼音来进行命名,这样反而适得其反。

关于命名的重要性,我想不需要过于强调。如今的软件开发已经脱离了求伯君那种单枪匹马的时代,你写下的每一行代码都会在日后被团队成员甚至自己多次查看。如果是个开源项目,那么更会被全球各地的人查看源代码,所以代码的可读性就显得尤为重要。如果读者能够轻松从代码中读出你的意图,那么就说明你的命名功底相当扎实。

比如在一个管理系统中,你使用这样的代码:

a = b * c;

这很容易让人摸不着头脑,虽然程序能够正常运作,但恐怕没人敢轻易修改这行他们不了解的代码。而如果修改成为这样:

weekly_pay = hours_worked * pay_rate;

那恐怕极少有人不懂这行代码的意图。

糟糕的命名也会导致大量无谓的注释,这是一个很容易跳进去的陷阱。在编写下一段代码时,为避免别人不明白代码的含义而加上注释,这貌似是一个很精妙的想法,实际上却南辕北辙。比如以下的注释:

int d; // elapsed time in days;

貌似很容易让人读懂,但是问题还是很多。首先注释不能跟着所有的引用,在定义处了解了“d”的含义,继续往下看的话却很容易忘记。其次,在更新代码时很可能会忘记修改注释,反而给把读者带入歧途。

与其用这样的注释,还不如直接重命名:

int elapsedTimeInDays;

这样清晰易懂,还不用维护注释,何乐而不为?

那么如何着手来提高的自己的命名技巧呢?

首先寻找一份公认的代码规范,并严格按照这样的标准执行。比如Google开源了自己内部使用的语言编码规范,我们可以直接拿来使用,Google Java中的style guide对此作了详细的介绍,除此之外还有C++等。这里收集了Google对各种语言的编码规范,非常具有参考价值。

标准代码规范中的每一条都有胜出的理由,值得我们遵从。但某些命名问题不一定只有一种最好的解决方式,这就需要与团队成员共同协商。比如对于Java单元测试类的命名方式,不同的团队可能不一样:有的团队喜欢以should开头,有的喜欢以test开头;有的喜欢用骆驼命名法,有些喜欢用下划线命名法。每种方式都有各自的利弊,没有一种能完全脱颖而出,因此团队要根据实际情况来制定规则。一旦确定使用某一种,那么一定要保持一致。

某些命名规范其实是可以进行自动化检查的,比如在Java应用的构建过程中可以引用“CheckStyle”这款插件,对命名进行一些基本的检查,比如方法名、变量名是否遵循了一定模式等。这样在一定程度上可以强制大家遵守某些约定。关于这类问题,自己以前也曾写过一篇文章,请参见http://www.huangbowen.net/blog/2013/06/21/introduce-checkstyle/。

最后要在团队中建立起code review的机制,通过code review来相互监督、纠正命名问题,而且这样更容易在命名约定上达成一致,方便协作开发。Code review可以采取非正式会议评审的方式:最简单的方式就是每天找个固定时间把大家一起聚在一个显示器前,review每个人的代码,现场提出问题,当事人记录下来会后更改,这种方式非常高效。另外,有的团队在嵌入代码时可能会引入一些代码评审机制,比如pull request、cherry pick等。这种review方式比较重量级,反馈周期也较长,好处是可以保证最终嵌入的代码是没有问题的。

很多语言和框架为了增加可读性,都把命名玩出花来了。比如JavaScript生态圈中重要的单元测试工具Jasmine把测试函数以“it”命名,这样可以与参数连接起来成为一种表意的自然语言:

总之,命名问题只是整个编码规范中的一小部分,但是起的作用举足轻重,它是判断一个程序员是否专业的必要标准。

原文发布于微信公众号 - 思特沃克(ThoughtWorks)

原文发表时间:2016-06-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

程序员之痛点:取个好名字

19530
来自专栏程序员互动联盟

八招让你成为C/C++的编程大牛

这个题目的噱头太大,要真的写起来, 足够写一本书了。 本人是过来人, 结合自身的体会和大家交流一下,希望新人能少走弯路。 每个人的情况不一样,我下面的描述可能并...

40560
来自专栏博岩Java大讲堂

Java虚拟机--Java发展史Java虚拟机

40170
来自专栏Java社区

粉丝福利 |超1000套项目源码及其他编程资源分享

28430
来自专栏瓜大三哥

matlab GUI基础9

数字图像的采集 一、USB摄像头设置 在matlab中通过函数imaqhwinfo()检测用户的matlab软件是否安装了图像采集工作箱,并显示图像采集工具箱的...

25890
来自专栏Crossin的编程教室

【每周一坑】用代码给图片配上文字

我们的『每日一坑』栏目里都是一些练手的小题目,难度不高,适合新手用来熟悉编程。如果想要更复杂的大项目,可以上我们的实验室栏目 lab.crossincode.c...

33860
来自专栏编程

6本PHP必备书籍,你值得拥有

PHP(Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,...

24660
来自专栏程序人生

永恒不变的魅力

一个程序员,无论你人生的第一个hello world是从basic开始,c开始,抑或javascript开始,接下来了解的一个概念一定是「变量」(variabl...

367120
来自专栏博岩Java大讲堂

Java虚拟机--虚拟机发展史

37650
来自专栏新智元

网易有道CEO周枫:Go语言继承了C语言的灵活简单

来源:周枫 转载编辑:常佩琦 【新智元导读】网易有道CEO周枫推荐Go语言。他认为Go很好地继承了C语言灵活、简单有效的思想;Go有很高的生产效率;Go精选了一...

397120

扫码关注云+社区

领取腾讯云代金券