`
找不着北
  • 浏览: 313553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

世上最糟糕的两个变量名

阅读更多

最近我对Steve McConnell的著作Code Complete (第二版)做了技术校对,这本书将在六月份出版。 他真是用心良苦,竟然用掉了整整一章的篇幅来讨论如何给变量命名。 但有个问题,他只是点到为止,并没有深入的探讨,这个问题就是:有两个世上最糟糕的变量名称。 请允许我就此问题发表拙见。

糟糕的变量名几乎到处都是。 常见的一种情况是人们喜欢把变量名的到很短、但变量的生存范围又太大,比如,有人会在整个程序里使用像 $n 这样的变量。 有些程序员可能会知道,在 TRS-80 BASIC 语 言里, 只是变量名的前两位字符是有意义的,以至于我们编程是必须把一个手抄本的变量名表格放在键盘旁边参考。

有些时候你会发现某些人命名变量的简化策略是把单词中的元音去掉,用此来替换简单的截取的方式,于是本来是 $cust 的变量名变成了 $cstmr 。我很怀疑人们能否分清这个变量是代表 customers 呢,还是表示 costumers!

有时候你会发现有些变量名是故意起的很怪,作者觉得这样做非常有趣,而不是非常有用。我曾经看到一个循环语句里被命名为 $crap(屎) 的变量。我的一位同事在维护旧代码时,把一个函数命名为 THE_LONE_RANGER_RIDES_AGAIN() (“徘徊者”号航天器又能起飞了) 。 这类变量名都不是我在这里要说的糟糕的变量名。

关于变量命名规范之争通常会演化为一场关于宗教信仰的战争,但是,我确有十足的信心来宣布这 世上最糟糕的变量名 是:

$data

当然,它确实表明这是个数据!它表明变量里能放什么东西!它表明变量里什么都能放!就像是你收拾打包你的物品,把它们移到一个新房子里,你在包箱外 面写着,用很粗的黑字写着:“东西”。

即使这个变量是个函数指针,它里面的数据也是告诉程序何处去运行这个函数。 即使这个变量是 undefNULL , 包含这种值的变量本身就具有特殊意义。

变量名应该表明变量里装载了什么数据。 问问自己“是什么数据”,这是优化你的变量命名最简单的方法。我曾经看到有人用 $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评论

 

:)

3
8
分享到:
评论
9 楼 piao_bo_yi 2010-08-18  
这句话最经典:问问自己”是什么数据“将会立即给你一个好的命名思路。
以前不了解cstmr是怎么来的,今天才知道,原来是省掉了元音字母...
8 楼 weiqiang.yang 2010-06-11  
所以说,第三烂的变量名是。。。。。$data3
7 楼 找不着北 2010-05-08  
zhengyutong 写道
temp
temp2
temp3...

这里也需要测试吗????
6 楼 找不着北 2010-05-07  
opensdp 写道
很有意思,这篇文章,果然是两个最糟糕的

我也觉得很有意思,所以贴出来
5 楼 找不着北 2010-05-07  
puhua 写道
变量名这个东西,不能要求的太规范,各公司都有自己的规则,各人也有自己喜好


要规范不要自由
4 楼 puhua 2010-05-07  
变量名这个东西,不能要求的太规范,各公司都有自己的规则,各人也有自己喜好
3 楼 zhengyutong 2010-05-07  
temp
temp2
temp3...
2 楼 kimmking 2010-05-07  
tmp temp
i ii iii
1 楼 opensdp 2010-05-07  
很有意思,这篇文章,果然是两个最糟糕的

相关推荐

    Oracle定义PLSQL变量学习

    Oracle数据库是世界上最广泛使用的数据库系统之一,其强大的功能和灵活性吸引了众多企业和开发人员。在Oracle中,PL/SQL(Procedural Language/Structured Query Language)是一种面向对象的编程语言,用于扩展SQL的...

    java 入门程序两个数求和

    在Java编程语言的世界里,"java 入门程序两个数求和"是一个经典的起点,它涵盖了编程基础、界面设计和函数应用等核心概念。对于初学者来说,理解这些知识点是至关重要的,因为它们构成了所有复杂程序的基础。在这个...

    java代码-类名为Rectangle(矩形),它有两个整型的变量width(宽)和height(高);有一个方法area(),没有参数,返回类型为double,功能是求矩形的面积;还有另一个方法为perimeter()没有参数,返回类型为double,功能是求矩形的周长

    在这个特定的例子中,我们有一个名为`Rectangle`的类,它具有两个基本属性:宽度(width)和高度(height),以及两个方法:计算面积的`area()`和计算周长的`perimeter()`。 1. **类定义**: 类`Rectangle`是面向...

    Python程序设计基础语法-变量.pptx

    例如,如果有两个变量`var1 = 2048` 和 `var2 = 2048`,它们实际上是指向内存中同一个位置的值。这可以通过内置函数`id()`来验证,相同的值会有相同的内存地址。 6. **检查变量类型**:使用内置函数`type()`可以...

    语言程序设计课后习题答案

    2-16 已知x、y两个变量,写一条简单的if语句,把较小的的值赋给原本值较大的变量。 解: if (x &gt; y) x = y; else // y &gt; x || y == x y = x; 2-17 修改下面这个程序中的错误,改正后它的运行结果是什么? #include ...

    python2.7和3.7两个版本

    Python是世界上最受欢迎的编程语言之一,特别是在自动化测试领域。它以其简洁、易读的语法和丰富的库支持赢得了广泛的赞誉。本压缩包包含了Python的两个重要版本:2.7.4和3.7,这两个版本在功能和兼容性上有所不同。...

    第一节课-变量的定义和数据类型上.rar

    在本节课程“第一节课-变量的定义和数据类型上”中,我们将深入探讨这两个核心概念。 首先,变量是程序中用于保存信息的占位符。它有一个名称(也称为标识符),并且可以用来存储各种各样的值。在不同的编程语言中...

    (完整word版)统计软件SPSS教案(全).doc

    1. SPSS 概述:SPSS 是世界著名的统计软件之一,应用遍布于通信、医疗、银行、证券、保险、制造、商业、市场研究、科学教育等领域,是世界上应用最广泛的专业统计软件。 2. SPSS 主界面:SPSS 主界面有两个,一个是...

    一个简单的Fortran脚本示例,它会读取用户输入的两个整数,然后计算它们的和与乘积,最后将结果输出到屏幕上

    它诞生于20世纪50年代,是世界上第一种商用的高级编程语言。随着时间的发展,Fortran经历了多个版本的更新,包括Fortran 90/95/2003/2008/2018等,这些版本引入了许多现代编程特性,使得Fortran更加易用且功能强大。...

    matlab开发-全局优化算法的测试函数

    1. **Rosenbrock函数**:这是一个两变量的函数,形如\( f(x, y) = (a - x)^2 + b(y - x^2)^2 \),它有一个长长的山谷和一个全局最小值在(1,1)处。它被广泛用于检验优化算法能否跳出窄谷。 2. **Beale函数**:\( f(x...

    C++笔记:第二章 数据变量和计算

    在C++中,布尔类型`bool`是一个非常特殊的类型,它只包含两个值:`true`和`false`。虽然它通常用于逻辑判断,但本质上被认为是整数类型。浮点类型用于存储带有小数点或指数的数值,如`float`和`double`。`double`...

    呼叫“土豆”,我是“地瓜”:变量.pptx

    此外,Python的关键字(如`for`、`if`等)不能用作变量名,因为它们有特殊的含义。Python是大小写敏感的,所以`myVariable`和`myvariable`是两个不同的标识符。 【变量赋值】是编程中最常见的操作。在Python中,...

    初中信息技术川教七年级上册第三单元-走进Python的世界-PythonPPT.pptx

    例如,在牛刀小试3中,如果直接相加两个通过`input()`获取的数值,由于它们是字符串,所以会进行字符连接而非数学运算。要进行数学运算,我们需要将这些字符串先转换为整数或浮点数,可以使用`int()`或`float()`函数...

    jdk环境变量配置

    2. **配置JAVA_HOME**:在系统变量中新建一个名为`JAVA_HOME`的变量,将其值设置为JDK的安装目录。 3. **配置CLASSPATH**:编辑或新建`CLASSPATH`变量,将其值设置为`.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\...

    多变量时间序列异常样本的识别

    为了验证所提出方法的有效性,文章在两个真实世界的数据集上进行了实验:股市数据集和脑机接口(Brain Computer Interface, BCI)数据集。实验结果显示,该方法能够有效地识别出异常样本,证明了其实用性和有效性。 ...

    Docker基础-18-网络-两个网络命名空间网络通信配置过程.rar

    本篇将深入探讨Docker网络的基础,特别是如何配置两个网络命名空间进行通信的过程。通过理解Docker的网络模型,我们可以更好地管理和优化我们的容器化应用程序。 首先,Docker有两种主要的网络模式:桥接网络...

    window中oracle环境变量设置方法分享

    第三步,需要检查“系统变量”中是否已经存在ORACLE_HOME和ORACLE_SID这两个变量。如果不存在,需要点击“新建”按钮,分别新建这两个变量,并且输入相应的值。ORACLE_HOME的值设置为Oracle软件的安装路径,如“C:\...

    最简单的程序设计(共93张PPT).pptx

    变量名和变量值是两个独立的概念,变量名实际上是内存中的一个地址。此外,还提到了常变量(const关键字),它们的值在声明时就被固定下来。 C语言中的数据类型是编程中至关重要的元素,它决定了数据如何在内存中...

    01、Java编程基础知识入门:变量与数据类型

    在Java中,变量是存储数据的容器,它有一个特定的名称(称为变量名)和一个值。变量的值可以在程序运行过程中改变,因此得名“变量”。声明变量时,我们需要指定它的数据类型,这是Java与其他一些动态类型语言如...

    win10 java(jdk安装)环境变量配置和相关问题

    首先,需要配置JAVA_HOME变量,变量名为JAVA_HOME,变量值为电脑上JDK安装的绝对路径。然后,需要添加CLASSPATH变量,变量名为CLASSPATH,变量值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;。最后,需要...

Global site tag (gtag.js) - Google Analytics