目录
前言
我在本章中用“变量”一词同时指代对象和内置数据类型 (built-in data type),如整数和数组等。
- “数据类型”一词通常是指内置数据类型;
- 而“数据”一词则可能代表对象,也可能代表内置数据类型。
10.1 数据认知
略
10.2 轻松掌握变量定义
本节将会向你讲述如何加快变量定义的工作。创建变量的确占去了你很多时间,因此养成一个良好的习惯会为你在整个项目周期内省去很多时间和麻烦。
10.2.1 隐式声明
有些语言支持隐式变量声明。例如,当你在 Microsoft Visual Basic中使用一未声明变量的时候,编译器会自动为你声明该变量(取决于你的编译器设置)。隐式变量声明对于任何一种语言来说都是最具危险性的特性之一,因为编译器自动声明变量经常会让程序员赋值出现错误。
那么,如果你使用的编程语言支持隐式声明该怎么办呢?下面给出一些建议。
关闭隐式声名。有些编译器允许你把隐式声明功能关闭。比如你在 VisualBasic 里可以用 option Explicit 语句来强迫程序员在使用变量之前先做出声明。
声明全部的变量。 在你引入一个新变量的时候对它做出声明,哪怕编译器不要求你一定要这样做。这样做虽然不会捕提所有的错误,但至少能发现其中的一部分。
遵循某种命名规则。 对像 Num 和 No 这样的常见变量名后缀建立一套命名规则,从而确保在需要一个变量时不会写成两个。
检查变量名。 使用编译器或第三方工具生成的交叉引用列表 (cross-reference,list)。很多编译器会把一个子程序内的全部变量都列:力你发现acct Num 和 acctNo。它们同时还会列出那些声明了但是还没有使用的变量。
10.3 变量初始化原则
下面给出一些避免产生初始化错误的建议:
1、在声明变量的时候初始化。
2、在靠近变量第一次使用的位置初始化它。 包括 Visual Basic 在内的一些语言不支持在声明变量的同时进行初始化。这就会导致出现下面这种编码风格,即多个变量的声明语句集中放在一个地方,它们的初始化语句集中放在另一个地方——这些语句离真正使用变量的语句都还很远。
更好的做法是在尽可能靠近第一次使用变量的位置初始化该变量:
第二个示例在多个方面优于第一个。
- 在第一个示例中,当使用 done 变量的代码开始执行的时候,done 很可能已经被修改了。即便你在第一次写这个程序的时候不会这样,后续的修改也可能会导致出现这样的错误。
- 这种方法的另一个问题是,一旦把所有的初始化代码都放在一起,也可能会让人产生误解,认为所有这些变量都会在子程序中一直使用——而事实上 done 只是在后面才被用到。最后,随着对程序的不断修改(可能会这样,即使只是为了调试),一些循环可能会包含使用了 done 的代码,因此 done 就需要重新初始化。对于这种情况,第二个示例需要做的改动就会少很多。第一个示例中的代码更容易产生恼人的初始化错误。
这是就近原则(Principle of Proximity) 的一个例子,即把相关的操作放在一起。这一原则也适用于让注释靠近它所描述的代码,让控制循环的代码靠近循环本身,以及把语句写成直线的代码等各个领域。
3、理想情况下,在靠近第一次使用变量的位置声明和定义该变量。 声明指定了变量的类型,定义为变量指定特定的取值。在允许这样做的语言,如 C++和 Java中,变量应该在靠近第一次使用的位置进行声明和定义。在理想情况下,每个变量都应该在声明的同时被定义,如下所示:
10.4 作用域
略。
10.5 持续性
略。
10.6 绑定时间
略。
10.7 数据类型和控制结构之间的关系
略。
10.8 为变量指定单一用途
略。
核对表:使用数据的一般事项
初始化变量
- 每一个子程序都检查其输入参数的正确性吗?
- 变量声明位置靠近变量第一次使用的位置吗?
- 尽可能地在声明变量的同时初始化变量吗?
- 如果无法同时声明和初始化变量,有没有在靠近第一次使用变量的位置声明变量?
- 计数器和累加器经过了适当的初始化吗?如果需要再一次使用,之前重新初始化了吗?
- 适当地重新初始化“需要重复执行的代码里的变量”了吗?
- 代码在通过编译器编译的时候是不是没有警告信息?(你启用了所有可用的警告选项了吗?)
- 如果你用的语言允许隐式声明,你为由此可能引发的问题做好补偿措施了吗?
使用数据的其他事项
- 如果可能,所有变量都被定义为具有最小的作用域吗?
- 各变量的引用点都尽可能集中在一起吗?对同一变量的两次相邻引用,或者变量的整个生命期都这样做了吗?
- 控制结构符合数据类型吗?
- 所有声明的变量都用到了吗?
- 变量都在合适的时间绑定了吗?——也就是说,你有意识地在晚期绑定所带来的灵活性和增加的复杂度之间做出平衡了吗?
- 每个变量都有且仅有一项用途吗?
- 每个变量的含义都很明确且没有隐含含义吗?