专栏首页ThoughtWorks谈谈命名|TW洞见

谈谈命名|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),作者:黄博文

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从程序员到培养者

    最近,看到越来越多当初一起写代码的程序员朋友,成为了Team Lead,Tech Lead,Manager,Buddy,Sponsor,Coach,Traine...

    ThoughtWorks
  • 关注成效而非产出

    我一直认为成效是我们应该关注的重点。试想一个团队提供了很多功能(无论我们是用代码量、功能点、还是用户故事来度量),只要这些功能没有帮助用户改善生产活动,其实都是...

    ThoughtWorks
  • 从分布式计算到分布式训练

    对计算机来讲,所谓的计算,不过是将存储在各个地方的数据通过数据总线进行传输,然后经过算术逻辑单元执行一系列预设好的规则,最终再将输出写入到某个位置。 在计算能力...

    ThoughtWorks
  • 编程十诫你知道了吗

    编程十诫你知道了吗 1.理解并承认自己也会犯错误。 关于此点的关键就是要在发布之前早点发现。不过幸运的是,除非你是在喷射推进实验室开发火箭制导软件,否则很少...

    用户1289394
  • CMU 深度学习导论更新 | 第五讲:神经网络的收敛性

    AI 研习社获得官方授权,汉化翻译CMU 2018 秋季《深度学习导论》课程,9月27日正式上线中文字幕版。

    AI科技评论
  • MQL5从入门到精通【第二章】变量与数据类型(三)

    枚举是特殊的整数类型,定义了一列常量,用于指代整数值。枚举类型,只有定义了才能使用,没定义了,你找不到它的值,报错!

    程序员小助手
  • Facebook FAIR实验室田渊栋等人最新论文:别担心深度网络中的虚假局部极小值

    【导读】近日,Facebook FAIR实验室、南加州大学与卡耐基梅隆大学提出《Gradient Descent Learns One-hidden-layer...

    WZEARW
  • 想熟悉PostgreSQL?这篇就够了

    PostgreSQL是自由的对象-关系型数据库服务器,在灵活的BSD风格许可证下发行。它在其他开放源代码数据库系统和专有系统之外,为用户又提供了一种选择。 我们...

    angel_郁
  • 持续集成对IT团队和企业分别有哪些好处?

    对于各行各业的公司而言,软件是关键的竞争优势。公司越快地将新的增强功能和特性推向市场,所获得的竞争优势就越大。为了获得这种领先优势,企业开发团队需要优化其工作流...

    陈琦聊测试
  • 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇《基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)》主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的...

    HT for Web

扫码关注云+社区

领取腾讯云代金券