当前位置: 首页 > 科技观察

史上最烂的两个变量名

时间:2023-03-14 12:07:30 科技观察

作为程序员,“命名”是他们工作中非常重要的一环。PhilKarlton曾说过:“在计算机科学领域,有两个主要问题,如何验证缓存和如何命名各种事物。”虽然很难,但是每次写代码,给东西起名字都是免不了的工作。不管是程序变量名还是数据库表名或者表中的列名,甚至是文件系统中的文件名,还有你的项目名、产品名,要给这些东西起名字可不是一件容易的事.糟糕的命名无处不在。您会发现有些变量名太短,根本无法提供足够的描述信息。也许遇到这个问题的人都是TRS-80BASIC程序员。在这种BASIC语言中,无论变量名多长,只有名字的前两个字母是有效的。在附近放一个笔记本,这样您就可以记下简短的变量名称及其对应的含义,以免混淆。有时,你会发现这样一种命名方法:直接省略变量名中的原始字母以缩短变量的长度。此方法用作常用“截断法”的替代方法,“截断法”只是截断字母以缩短其长度。例如,您可以使用$cstmr(原始声音省略)而不是$cust(直接截断)。但是对于customers(顾客)和costumers(服装提供者)这两个词,原音省略会造成混淆(customers和Costumers采用原音省略法,结果都是cstmr)。雪上加霜的是,$cstmr缺少了原来的拼音字母,打起来比较别扭,从读音上看也很难发音。还有一种特殊的人为命名方法。有时程序的作者只是为了一点沉默,所以他给了一些有趣的名字。我看到有人把循环变量命名为$crap(crap在英文中是一种轻微的诅咒,类似于damm、shit——译者注),我的一位同事告诉我,他正在给一段话,当我在整理代码,我看到一个名为:THE_LONE_RANGER_RIDES_AGAIN()的函数。这样的命名方式虽然很特殊,但是不属于我说的“坏”命名的范畴。虽然我很清楚每个人都对命名约定是正确的,但我仍然自信地宣布,在我看来,历史上最糟糕的命名是:$data!是的!一定是$data!这种命名完全是循环定义,其实是无稽之谈。就好像你把家里所有的东西都扔进了一个手提箱,然后在手提箱上放了一张纸条,上面写着:“东西”正确的变量命名应该把变量的数据类型写清楚。因此,在命名时考虑数据类型是提高命名质量的好方法。在看一段读取数据库表记录的代码时,看到了$data这个名字,大概是这样的:$data=read_record();打印"ID=",$data["CUSTOMER_ID"];模糊的命名非常糟糕,其次是几乎相同的、难以区分的变量名。因此,有史以来第二差的变量名是:$data2。如果这时候你问:“$data是什么数据类型?”,那么你就会想改变它的名字。将名称更改为$record是一个好的开始。进一步改成$customer_record就更好了。一般来说,任何仅依靠数字名称来区分它们的变量名称都应该重构。马上给你举个例子,你就明白了:$total=$price*$qty;$total2=$total-$discount;$total2+=$total2*$taxrate;$total3=$purchase_order_value+$available_credit;if($total2<$total3){print"Youcan'taffordthisorder.";}你会发现阅读这段代码就像阅读Oracle一样痛苦。显然,这个程序的目的是计算订单的总成本$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"Youcan'taffordthisorder.";}修改后,唯一改变的是变量名,代码变得更容易理解理解。现在对于每个_total,不存在歧义问题。看看我们发现了什么:原来的if语句中两个比较变量的位置颠倒了。有效的命名方法可以让我们更快地发现错误。一般来说,我们都同意以数字结尾的变量是错误的命名,但有一个例外。如果变量描述的实体本身以数字结尾,那么变量名***也以数字结尾。比如我们要定义一个SHA-1的hash实体,那么直接命名为$sha1就可以了,根本不需要做成$sha_one,然后避免在变量名中使用数字。在完成本文的第一个版本后,我创建了自己的命名约定并使用Perl::Critic包来检测上述两个命名问题。我制作的插件Perl::Critic::Bangs检测到:ProhibitVagueNames和ProhibitNumberNames。还有哪些糟糕的命名约定让您抓狂?你自己做了什么来纠正这些错误吗?原文:http://petdance.com/2012/04/the-worlds-two-worst-variable-names/翻译:http://blog.jobbole.com/18304/