最近我对Steve McConnell的著作Code Complete
(第二版)做了技术校对,这本书将在六月份出版。
他真是用心良苦,竟然用掉了整整一章的篇幅来讨论如何给变量命名。
但有个问题,他只是点到为止,并没有深入的探讨,这个问题就是:有两个世上最糟糕的变量名称。 请允许我就此问题发表拙见。
糟糕的变量名几乎到处都是。 常见的一种情况是人们喜欢把变量名的到很短、但变量的生存范围又太大,比如,有人会在整个程序里使用像 $n
这样的变量。 有些程序员可能会知道,在 TRS-80 BASIC
语
言里, 只是变量名的前两位字符是有意义的,以至于我们编程是必须把一个手抄本的变量名表格放在键盘旁边参考。
有些时候你会发现某些人命名变量的简化策略是把单词中的元音去掉,用此来替换简单的截取的方式,于是本来是 $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 )
如果你不回头看看这两个total都是存的什么,你不可能知道这句是在计算什么。
如果你正在面临着要给某变量命名成 $total2
的问题, 请先把已有的变量名变的更有意义。
花上几分钟的时间,给这些变量合适的名称。这个层面上的代码反省是你能做到的最简单的,成本最低的,形式最安全的反省,
特别是当这个变量在一个封闭的子程序里时,更需要这样。
让我们对上面这段糟糕的代码做一个简单的查找替换过程:
$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
变量都不存在歧义了。
而且,你会发现: if
比较语句写颠倒了。 有效的命名让这种错误极易发现。
这种以数字结尾的变量并不是都不好,有个例外。如果这个实体本身就是以数字结尾的,变量也应该留下这个数字。对于跨省的国道的变量命 名就应该像 $route31
。
如果你把它改成 $route_thirty_one
那就有点傻了。
最后,记着这些命名习惯对于定义程序变量和定义文件名同样适用。 我通常也不愿意花太多的时间去考虑文件的命名,当然这是另外一个话题了。
还有什么其他的让你抓狂的命名现象?
来自 外刊IT评论
:)
分享到:
相关推荐
Oracle数据库是世界上最广泛使用的数据库系统之一,其强大的功能和灵活性吸引了众多企业和开发人员。在Oracle中,PL/SQL(Procedural Language/Structured Query Language)是一种面向对象的编程语言,用于扩展SQL的...
在Java编程语言的世界里,"java 入门程序两个数求和"是一个经典的起点,它涵盖了编程基础、界面设计和函数应用等核心概念。对于初学者来说,理解这些知识点是至关重要的,因为它们构成了所有复杂程序的基础。在这个...
在这个特定的例子中,我们有一个名为`Rectangle`的类,它具有两个基本属性:宽度(width)和高度(height),以及两个方法:计算面积的`area()`和计算周长的`perimeter()`。 1. **类定义**: 类`Rectangle`是面向...
例如,如果有两个变量`var1 = 2048` 和 `var2 = 2048`,它们实际上是指向内存中同一个位置的值。这可以通过内置函数`id()`来验证,相同的值会有相同的内存地址。 6. **检查变量类型**:使用内置函数`type()`可以...
每个变量都需要在使用之前进行定义,声明其数据类型,比如int a;声明了一个整型变量a。变量的使用通常包括定义、赋初值和修改值三个步骤。正确的使用变量需要遵循"先定义,后使用"的规则,以确保变量名的正确性,...
Python是世界上最受欢迎的编程语言之一,特别是在自动化测试领域。它以其简洁、易读的语法和丰富的库支持赢得了广泛的赞誉。本压缩包包含了Python的两个重要版本:2.7.4和3.7,这两个版本在功能和兼容性上有所不同。...
在本节课程“第一节课-变量的定义和数据类型上”中,我们将深入探讨这两个核心概念。 首先,变量是程序中用于保存信息的占位符。它有一个名称(也称为标识符),并且可以用来存储各种各样的值。在不同的编程语言中...
2-16 已知x、y两个变量,写一条简单的if语句,把较小的的值赋给原本值较大的变量。 解: if (x > y) x = y; else // y > x || y == x y = x; 2-17 修改下面这个程序中的错误,改正后它的运行结果是什么? #include ...
此外,Python区分大小写,所以`myVariable`和`myvariable`是两个完全不同的变量名。遵循这些规则,我们就能在Python的海洋中自由航行,而不会触礁。 变量赋值是编程中最为基础且常见的操作之一。在Python中,赋值...
1. SPSS 概述:SPSS 是世界著名的统计软件之一,应用遍布于通信、医疗、银行、证券、保险、制造、商业、市场研究、科学教育等领域,是世界上应用最广泛的专业统计软件。 2. SPSS 主界面:SPSS 主界面有两个,一个是...
它诞生于20世纪50年代,是世界上第一种商用的高级编程语言。随着时间的发展,Fortran经历了多个版本的更新,包括Fortran 90/95/2003/2008/2018等,这些版本引入了许多现代编程特性,使得Fortran更加易用且功能强大。...
1. **Rosenbrock函数**:这是一个两变量的函数,形如\( f(x, y) = (a - x)^2 + b(y - x^2)^2 \),它有一个长长的山谷和一个全局最小值在(1,1)处。它被广泛用于检验优化算法能否跳出窄谷。 2. **Beale函数**:\( f(x...
在C++中,布尔类型`bool`是一个非常特殊的类型,它只包含两个值:`true`和`false`。虽然它通常用于逻辑判断,但本质上被认为是整数类型。浮点类型用于存储带有小数点或指数的数值,如`float`和`double`。`double`...
接着,我们看到`zhanghu`类有两个构造方法。一个无参数的构造方法`zhanghu()`,它没有进行任何初始化操作。另一个带参数的构造方法`zhanghu(String zhanghao, float yue)`,用于在创建对象时设置账号和初始余额。`...
例如,在牛刀小试3中,如果直接相加两个通过`input()`获取的数值,由于它们是字符串,所以会进行字符连接而非数学运算。要进行数学运算,我们需要将这些字符串先转换为整数或浮点数,可以使用`int()`或`float()`函数...
2. **配置JAVA_HOME**:在系统变量中新建一个名为`JAVA_HOME`的变量,将其值设置为JDK的安装目录。 3. **配置CLASSPATH**:编辑或新建`CLASSPATH`变量,将其值设置为`.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\...
本篇将深入探讨Docker网络的基础,特别是如何配置两个网络命名空间进行通信的过程。通过理解Docker的网络模型,我们可以更好地管理和优化我们的容器化应用程序。 首先,Docker有两种主要的网络模式:桥接网络...
第三步,需要检查“系统变量”中是否已经存在ORACLE_HOME和ORACLE_SID这两个变量。如果不存在,需要点击“新建”按钮,分别新建这两个变量,并且输入相应的值。ORACLE_HOME的值设置为Oracle软件的安装路径,如“C:\...
变量名和变量值是两个独立的概念,变量名实际上是内存中的一个地址。此外,还提到了常变量(const关键字),它们的值在声明时就被固定下来。 C语言中的数据类型是编程中至关重要的元素,它决定了数据如何在内存中...