关闭

用动态语言编写程序,命名更重要

396人阅读 评论(0) 收藏 举报

本文作者Cory House是一名软件开发者,独立顾问,热衷于清洁代码、务实开发和响应式本土UI的设计。在文章里,他列举了以JavaScript和C#为例,来说明编程里命名的重要性以及必要性。

大家都知道,良好的变量名和优秀的功能在所有的编程语言里都是及其重要的,那么什么样的命名足够好、能足够体现出重要性呢?有一位评论者觉得“Get”是一个很好的方式名称,并以person.Get(personId)为例来说明他的观点。虽说这个例子相当明了,但是这里仍有三点原因需要考证这么一个短小的功能名称,尤其是在使用动态编程语言编写的程序里,这样的命名是否真的站得住脚呢?

1. 强类型编程语言有助于传达意图

首先,方法名在动态编程语言的作用比在类型语言里的作用要大。为什么,在强类型编程语言里,参数类型有助于传达意图。下面就引用JavaScript和C#为例:

JavaScript:

C#:     

需要注意的是,在用C#语言的时候可能会涉及到的关于保真度的两点额外事项:

  1. 参数类型——在这里你能看到一个类型的PersonId,int就是那个论点。
  2. 返回类型——很显然该方法可以返回一个Person,而且用C#语言的时候没必要通过阅读方法体来知道这一点。

这两点信息有助于更清晰化软件功能的意图。因此,在强类型语言里,完全可以使用更简洁的方法名。

2. 使用情况

对于像“Get”这样的简短方法名还会遇到第二个问题。当通过相同的数据类型有更多的方法可以获得Person的话,那又会出现什么样的情况呢?可以想象一下,如果我们创建一个新的功能之后就能通过用户的电话号码或社会保险号码来获得一个用户。不过,在这方面方法名“Get”可能在业务上存有高风险。

人们可能只是传递了一个手机号码,但是没有意识到这也有可能会透露出个人的PersonID。所以,你最好是将“Get”重命名为“GetByPersonId”,及时解决因简短函数命名而引起的模棱两可。这还没有结束,因为这会导致下面的第三个问题。

3. 重命名带来的风险

有的人可能会认为“GetByPersonId”应该在第一步就使用,而不是到了后面发现了问题才更改,尤其是在使用动态编程语言的情况下。于是,用动态编程语言编写程序就能找到最终问题点:当你决定重新命名变量和函数后,强类别语言为了安全起见允许你“依靠编译器”。这一术语来自于Michael Feathers的书本《Working Effectively with Legacy Code

依靠编译器可能会涉及以下两个步骤:
  • 改变一个声明来引起编译错误。
  • 导航到这些错误并做出一点改变。
你可以依靠这个编译器在你的程序里做一些结构上的改变。——Michael Feathers

如果你使用的动态语言里缺乏支持性能的话,这无疑会增加重命名带来的风险。这也就是为什么一个强有力的测试套件在动态语言里尤为重要的原因——它可以帮助临时替代简单的、不好的参照问题,主要是由于编译器在强类型语言里根本抓不到这些参照问题。

综上所述,要想实现并不是很难,底线是我们生活在一个智能感知、高分辨率、便宜的存储的世界。所以一旦到了必须选择什么样命名的时候,清洁代码程序员应该大胆直面程序的清洁度而不仅仅是追求代码的简短性。特别是在动态编程语言里,这个原则尤其重要。          (编译/薛梁  责编/张红月)

原文:BitNative

15
0

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1373176次
    • 积分:19860
    • 等级:
    • 排名:第411名
    • 原创:448篇
    • 转载:1067篇
    • 译文:4篇
    • 评论:143条
    文章存档
    最新评论