史上最糟糕的两个变量名(转)

 英文原文:The world’s two worst variable names

  作为一个程序员,“起名字”是他们工作中非常重要的一部分。Phil Karlton就说过:“在计算机科学领域,有两大难题,如何让缓存失效(cache invalidation)和如何给各种东西命名。”虽然很难,但是每次在写代码的时候,命名又是不可回避的工作。无论是程序变量名还是数据库表名或者是表里的列名,甚至是文件系统中的文件名,以及你的项目名称、产品名称,给这些东西起名字可不是个轻松活儿。

  糟糕的命名方式随处可见。你会发现,有的变量名字起得太短,根本没法提供足够的描述信息。或许有这个问题的人都做过TRS-80 BASIC程序员,在这种BASIC语言里,无论你起多长的变量名,只有名字的头两个字母有效,所以那个时候的程序员不得不在键盘边儿上放个笔记本,以便将很短的变量名称和他们的对应含义记录下来,这样才能不搞混淆。

  有的时候,你会发现这样的命名方法:直接将变量名称中的原音字母省略,以此来缩短变量的长度。这种方法被用来替代常用的“截断法”,也就是简单地把字母截断来缩短长度。比如你可以用$cstmr(原音省略)来代替$cust(直接截断). 但是,对于customers(顾客)和costumers(服装提供商)这两个单词来说,原音省略法就会造成混淆(customers和costumers采用原音省略法,其结果都是cstmr)。更糟糕的是,$cstmr缺乏原音字母,打字的时候会更加别扭,而且从读音的角度来说,也很难对其进行发音。

TSR80计算机,只支持4位的变量名

  还有一种人为的特殊命名方式,有的时候程序的作者只是为了小幽一默,所以起了些有趣的名字。我就曾经见到过有人把循环变量命名为$crap (crap在英语里是轻微的咒骂,跟damm, shit这种词语差不多——译者注),我的一个同事告诉我,他在给一段代码做整理的时候,看到过有个函数被命名为: THE_LONE_RANGER_RIDES_AGAIN() 。虽然这样的命名方式非常特殊,但是他们并不属于我说的“糟糕”的命名的范畴。

  虽然我很清楚,对于命名规范这种事情,大家是公说公有理,婆说婆有理,但是,我还是非常自信地宣布,我认为,史上最糟糕的命名是:$data!

  是的!必须是$data! 这个命名完全是循环定义,实际上就是一句废话。就仿佛你把你们家所有的东西都扔到一个行李箱里,然后在行李箱上面贴个条,赫然写着:“东西”。

  正确变量命名应该写清楚变量的数据类型。因此在命名时考虑数据类型是一个很好的提升命名质量的办法。我有一次在看一段读数据库表记录的代码时,看到了$data这个名字,大概像下面这样:

$data = read_record();
print "ID = ", $data["CUSTOMER_ID"];

  如果这时候问问:“$data是什么数据类型呢?”,然后你就很想给它换个名字了。把名字改成$record是一个好的开始。进一步改成$custormer_record,就更好一些了。

  模糊的命名相当糟糕,糟糕程度紧随其后的就是,长得几乎一样,无法分辨的变量名。因此,有史以来第二糟糕的变量名就是: $data2.

  总的来说,任何仅仅依靠数字编号来区分的变量名都应该被重构。马上举个例子给你看,你就明白了:

$total = $price * $qty;
$total2 = $total - $discount;
$total2 += $total2 * $taxrate;
$total3 = $purchase_order_value + $available_credit;
if ( $total2 < $total3 ) {
    print "You can‘t afford this order.";
}

  你可以发现,要读懂这个代码就跟读甲骨文一样痛苦。很明显,这个程序的目的就是要计算订单的总花费 — $total. 如果程序的逻辑没有问题,那么$total这个变量名也算是恰如其分。但是,偏偏有人修改了这个程序,给添加了计算折扣和税率的功能,然后他还在变量命名上偷懒,直接起了个$total2, 更可恨的是,还有其他人在这个程序里计算了用户的可用账户金额,然后直接起名叫 $total3 !

  真正倒霉催的是下面这行代码:

if ( $total2 < $total3 )

  如果你不回头看之前的代码,要想知道这句代码的意义是完全不可能的。所以你必须往回阅读,看看那个变量究竟是什么意思。

  如果你看到了类似像$total2这样的变量,那就应该把这个名字改得更加具体一些。花5分钟的时间让这些变量名称变得更加合理。这个层面上的软件重构是最简单,代价最小,也是最安全的,尤其是在你要修改的变量是个局部变量的时候。

  让我们用最简单的“搜索-替换”功能来解决我们之前发现的问题

$order_total = $price * $qty;
$payable_total = $order_total - $discount;
$payable_total += $payable_total * $taxrate;
$available_funds = $purchase_order_value + $available_credit;
if ( $payable_total < $available_funds ) {
    print "You can‘t afford this order.";
}

  经过修改后,唯一变化的就是变量名,而且代码变得简单易懂了。现在对于每个_total,就不存在二义性的问题了。看看我们发现了什么:原先if语句中的两个比较变量的位置写反了。有效的命名方法让我们能够更快地发现错误。

  通常,我们都认为用数字作为变量的结尾是不好的命名方法,但是有一个例外。如果变量描述的实体本身就是以数字结尾的,那变量名最好也是以数字结尾。比如,如果我们要定义一个HA-1哈希实体,那干脆就把它命名为$sha1, 这样就很好,你完全没有必要把它搞成sha_one,然后来避免在变量名中使用数字。

  在我完成了对本文的第一版后,我创立了自己的命名规则,并使用Perl::Critic包来检测上述提到的两种命名问题。我制作的插件Perl::Critic::Bangs可以检测出这两种问题:ProhibitVagueNames和ProhibitNumberNames.

  还有哪些其他的糟糕的命名方法逼得你发疯?你自己有去做些什么纠正这些错误么?

http://kb.cnblogs.com/page/153129/

时间: 2024-08-05 07:09:20

史上最糟糕的两个变量名(转)的相关文章

史上最糟糕的十五款科技产品【转】

在IT行业的发展历史上,曾出现过改变世界的产品,如iPhone智能手机.第一代英特尔迅驰笔记本. Bose出品的去噪耳机.同样的,在此期间也曾出现过一些非常糟糕的产品,并且失败得一塌涂地. 不过,从某种意义上说,它们也在历史上留下了自己的痕迹. 比如说诺基亚的游戏手机,试图与任天堂和索尼在游戏领域开展竞争,最终导致了自己的失败.这些产品的教训告诉我们,光有好的概念,但不能真正解决用户的问题.满足用户的需求,是极为容易遭遇惨败的.下文是ZDNET评选出的史上十五大最糟糕的产品. 史上最糟糕的十五款

activiti获取流程图中的所有信息包括变量名

今天在看activiti的变量的时候,都是由用户来设置变量,我们在后台写代码通过变量设置或取一些参数的时候,非常的不方便. 比如:设置变量的时候通过页面设置 设置之后,我们如何动态的给这个变量设置参数,我参考了好多资料,大部分都是直接进行的设置,比如: Map<String, Object> variables = new HashMap<String, Object>(); variables.put("userIDs", "大大,中中,小小&quo

两因素重复测量方差分析,史上最详细SPSS教程!

原文地址 http://www.sohu.com/a/202657022_489312 2017-11-06 18:34 一.问题与数据 研究者想知道短期(2周)高强度锻炼是否会减少C反应蛋白(C-Reactive Protein, CRP)的浓度. 研究者招募了12名研究对象,并让研究对象参与两组试验:对照试验和干预试验.在对照试验中,研究对象照常进行日常活动:在干预试验中,研究对象每天进行45分钟的高强度锻炼,每组试验持续2周,两组试验中间间隔足够的时间. CRP的浓度在每组试验中共测量了3

史上最全的变量、作用域和内存问题

(一)JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Boolean.Number和 String.基本类型值和引用类型值具有以下特点: 1.基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中: 2.从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本: 3.引用类型的值是对象,保存在堆内存中: 4.包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针: 5.从一个

史上最详细的Android Studio系列教程一--下载和安装

链接地址:http://segmentfault.com/a/1190000002401964#articleHeader4 原文链接:http://stormzhang.com/devtools/2014/11/25/android-studio-tutorial1/ 背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源项目都已经在采用,Google的更新速度也很快,明显

史上最全最常用的正则表达式-(基本够用值得收藏)

一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 8 正数.负数.和小数:^(\-|\+)?\d+(\.\d+)?$ 9 有两位小数的正实数:^[0-9]

史上最难PHPer笔试题,40分就能月薪过万!附答案

请批判性的学习,欢迎大牛指正错误 1.有关PHP字符串的说法,不对的是:A.如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1.B.PHP的字符串在内部是字节组成的数组,用花括号访问或修改字符串对多字节字符集很不安全.C.substr().strpos().strlen().htmlentities() 处理字符串时依据的编码方式是相同的.D.一个布尔值 Boolean 的 true 被转换成 string 的 " 1 ",false 被转换成

史上最强算法论战:请不要嘻哈,这是哈希[下]

史上最强算法论战:请不要嘻哈,这是哈希[下] 欢迎个人转发朋友圈,机构及媒体转载需在开篇声明,转自微信公号“知象科技” 论战主角之一龙博:知象科技CEO,欲了解龙博及知象科技,请点击文末“阅读原文”. 这是“美丽互联”微信群里的一次算法论战,感谢书记员硅谷寒(梁寒)精彩的说书般的整理. 书接上文 一夜过去了…孤独虎精神抖擞的回来了! [书记员注:上集说到独孤虎被龙博两次判零分,已经到了精神分裂的边缘.于是他决定回家休养生息,以图再战.果不其然,第二天,独孤虎首先跳出来,带来了他的第四种方案.我们

强烈推荐:Android史上最强大的自定义任务软件Tasker

强烈推荐:Android史上最强大的自定义任务软件Taskerhttp://bbs.mumayi.com/thread-28387-1-1.html(出处: 木蚂蚁手机乐园) Android上的Tasker绝对称得上是Android系统的神器之一,与Auto Memory Manager不同,Tasker不是加速型的软件,而是系统增强型的软件,由于有众多系统状态可控制,故使得Tasker一跃成为Android系统中最闪亮的明星.但Tasker也无疑是最难使用的软件,由于可以控制的地方太多,反而让