绝对不要使用的变量名模式
我曾对出版的《代码大全(Code Complete)(第二版)》做了校对,他的作者是Steve McConnell。书里面用了一整章来写如何给变量命名。但也只是蜻蜓点水并没有深入,在这个问题上我想探讨一下自己的意见。比较烂的变量名处处可见,人人都想把变量名写的很短,不过他的生存空间又很大,大家可能会知道,在TRS-80BASIC语言里,变量名前两位字符是有意义的,所以很多人会在程序里使用$n这样的变量,使我们编程的时候还要把手抄本的变量名表常常拿来参考。
我曾对出版的《代码大全(Code Complete)(第二版)》做了校对,他的作者是Steve McConnell。书里面用了一整章来写如何给变量命名。但也只是蜻蜓点水并没有深入,在这个问题上我想探讨一下自己的意见。
比较烂的变量名处处可见,人人都想把变量名写的很短,不过他的生存空间又很大,大家可能会知道,在TRS-80BASIC语言里,变量名前两位字符是有意义的,所以很多人会在程序里使用$n这样的变量,使我们编程的时候还要把手抄本的变量名表常常拿来参考。
很多时候大家总想把变量简化,比如把$cust的变量名变成$cstmr。人们能否分清这个变量是代表 customers ,还是表示 costumers!
有些很怪的变量名看起来只是有趣但没什么用。我见过有人在循环语句里被命名为 $crap(屎) 的变量。也有把一个函数命名为 THE_LONE_RANGER_RIDES_AGAIN()
(“徘徊者”号航天器又能起飞了)。不过这些看起来都不是最糟糕的变量名。见过最糟糕的变量名 是:
$data
这个变量名看起来的确是个数据,就像你用一个箱子打包你暂时不用的东西一样,装好后你会在外面写上物品。
如果说这个变量是个函数指针,那么它里面的数据也是告诉程序何处去运行这个函数。 即使这个变量是 undef 或 NULL, 包含这种值的变量本身就具有特殊意义。
变量名里装载了什么数据。只有自己知道是什么,。曾看到有人用 $data 表示从数据表里读取的一条记录。写法就像这样:
$data = read_record(); print "ID = ", $data["CUSTOMER_ID"];
如果自己清楚是什么数据,将来思路也会更清晰些。 命名成 $record 就好多了。 $customer_record 那就更好了。
如果我说出另一个比较糟糕的变量名应该不会有人反对吧 :
$data2
如果任何一个变量依赖于序列号来区别跟它相似的数据时,你需要立即重新考虑这个变量命名。 你经常会看到像这样的代码:
$total = $price * $qty; $total2 = $total - $discount; $total2 += $total * $taxrate; $total3 = $purchase_order_value + $available_credit; if ( $total2 < $total3 ) { print "You can't afford this order."; }
如果这段代码只是指明了订单的总额, $total。那么没有其它的,这个 $total 定义的无可挑剔。可有人在此之后加了一段代码,用来处理折扣和税率,将它们存到 $total2里。 最后,有人又加了一段,用来检查用户支付的总值,并把变量命名为 $total3。
这段代码里最关键的能反映问题的一句是:
if ( $total2 < $total3 )
如果你愿意花上一点时间把他们做到最简单,成本最低最安全,特别是变量在一个封闭的子程序里时,更需要这样。
让我们对上面这段糟糕的代码做一个简单的查找替换过程:
$order_total = $price * $qty; $payable_total = $order_total - $discount; $payable_total += $payable_total * $taxrate; $available_funds = $purchase_order_value + $availble_credit; if ( $payable_total < $available_funds ) { print "You can't afford this order."; }
这段代码看见来就很容易理解了。 现在所有的 _total 变量都不存在歧义了。
[credit type=’翻译’ url=’http://archive.oreilly.com/pub/post/the_worlds_two_worst_variable.html’]
发表回复