如果你看到了类似像$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语句中的两个比较变量的位置写反了。有效的命名方法让我们能够更快地发现错误。
通常,我们都认为用数字作为变量的结尾是不好的命名方法,但是有一个例外。如果变量描述的实体本身就是以数字结尾的,那变量名最好也是以数字结尾。比如,如果我们要定义一个SHA-1哈希实体,那干脆就把它命名为$sha1,这样就很好,你完全没有必要把它搞成$sha_one,然后来避免在变量名中使用数字。
在我完成了对本文的第一版后,我创立了自己的命名规则,并使用Perl::Critic包来检测上述提到的两种命名问题。我制作的插件 Perl::Critic::Bangs 可以检测出这两种问题:ProhibitVagueNames 和 ProhibitNumberNames.
还有哪些其他的糟糕的命名方法逼得你发疯?你自己有去做些什么纠正这些错误么?