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

转载 2013年12月02日 18:10:18

本文作者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

相关文章推荐

动态语言 & ios程序 - lua基础

经常有看到一些游戏可以不通过appstore而修改一些东西,比如增加功能。 这个其实就是通过下载脚本来实现的。常见的脚本就是js和lua吧。 个人对lua比较熟悉。 lua这货还是挺牛的,解释器非常小...
  • zj510
  • zj510
  • 2015年03月04日 14:32
  • 914

程序语言动态语言与静态语言区别

动态语言Dynamically Typed Language 例如:ECMAScript(JavaScript)、Ruby、Python、VBScript、php 也叫动态类型定义语言 与静态类...

如何更有效的编写程序

1. 首先要很清楚的分析问题       2. 再三考虑如何解决这个问题       3. 获得完整的需求            花点时间把产品最终期望达到的目标写出来,确定你的用户群体,这一...

用Java语言编写程序最容易犯的21种错误

[导读]    1.Duplicated Code   代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应O...

C语言-将1到9这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的1/2,是第三个3位数的1/3。问应当怎样分,编写程序实现。

#include #include #include int IsTheOne(int,int,int); int cmp(const void *a,const void *b); int main...

C语言编写程序的优点和缺点以及与C++的区别

C语言编写程序的优点有哪些? 问题阐述 C语言能够存在并发展至今,其生命力之强可见一斑。这其中一定是有着某些不可替代的优点,那么C语言编写程序的优点都有哪些呢? 专家解答 为了方便读者理解,下...

用C语言编写程序:求两数的最大公约数。

此程序用了3个方法(相减法、穷举法、辗转相除法)来求两数的最大公约数,用户可自己选择用哪种算法。 #include #include int select=1;//select 为是否退出系统的标记 ...

编写程序求n!--C语言中数组的使用

注:部分内容摘自《数据结构》,黄国瑜,叶乃菁编著,清华大学出版社。 需求:编写程序求n!。 分析:数字相乘可以分解为各个阶位相乘,比如百位数A*B可分解为A100*B+A10*B+A1*B,然后从...

c语言编写程序

  • 2013年03月27日 17:16
  • 175B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用动态语言编写程序,命名更重要
举报原因:
原因补充:

(最多只允许输入30个字)