第十章--使用变量的一般事项
10.2--轻松掌握变量定义
1. 隐式声明:对于任何一种语言来说,隐式声明都是最具危险性的特性之一。对于支持隐式声明的几条处理建议:
(1)关掉编译器的隐式声明。
(2)声明全部的变量。
(3)遵循某种命名规则。
(4)检查变量名。使用编译器或者第三方工具生成的交叉引用列表。
10.3--变量初始化原则
1. 不恰当的变量初始化所导致的一系列问题都源于变量的默认初始值与你的预期不同。一下行为都会产生此类问题。
(1)从未对变量赋值。它的值只是程序启东时所处内存区域的值。
(2)变量值已经过期。变量在某个地方曾经被赋值,但该值已经不再有效。
(3)变量的一部分被复制,而另一部分则没有。如一个类的一部分被赋值,而另一部分则没有。
2.下面给出一些避免产生初始化错误的建议。
(1)在声明变量的时候初始化。
(2)在靠近变量第一次使用的位置初始化它。(就近原则)
(3)理想情况下,在靠近第一次使用变量的位置声明和定义该变量。
(4)在可能的情况下使用final或者const。如输入参数
(5)特别注意计数器和累加器。在下次再使用前要记得重置。
(6)在类的构造函数里初始化该类的数据成员。
(7)检查是否需要重新初始化。
(8)一次性初始化具名常量;用可执行代码来初始化变量(用变量模拟具名常量)。
(9)利用编译器的警告信息。
(10)检查输入参数的合法性。
(11)使用内存访问工具检查错误的指针。(因为有的操作系统不会检查是否存在非法的内存引用)。
(12)在程序开始时初始化工作内存。把工作内存初始化为一个已知数值会有助于发现初始化错误。
10.4--作用域
下面是一些使用作用于的规则。
1.使变量引用局部化
那些介于同一变量多个引用点之间的代码可称为“攻击窗口”,肯呢过有新的代码加入到这个窗口中,不当地改变了这个变量。因此把引用点尽可能集中在一起是一种很好的做法。
因此,要尽可能减小变量的跨度和存活时间。
变量跨度:对某个变量的第一次引用和下一次引用之间存在的代码行数。
变量存活时间:即一个变量存在期间锁跨越的语句总数,开始于引用它的第一条语句,结束于引用它的最后一条语句。
缩短变量存活期的好处:
(1)减小攻击窗口。
(2)使嘚对自己的代码有更准确的认识。易于将代码块重构为子程序。
(3)减少了初始化错误的可能。
(4)是代码更具有可读性。
(5)当需要把大的子程序拆分为多个小得子程序变得更加容易。
全局变量的跨度和存活时间都很长,这也是避免使用全局变量的理由之一。
2. 减小作用域的一般原则
(1)在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所述的子程序的开始处初始化这些变量。
(2)指导变量即将被使用时在为其赋值。
(3)把相关语句放在一起。
(4)把相关语句组提取成单独的子程序
(5)开始时采用最严格的可见性,然后根据需要扩展变量的作用域。
3.有关缩小变量作用域的说明
有的程序员喜欢使用全局的变量,那样方便写程序--“方便性”;
有的则更愿意尽可能地使用变量局部化--“智力可管理性”;
总的来说,应该把每个变量定义成只对需要看到他的、最小范围的代码段可见。
10.5--持续性
持续性的多种形态:
(1)特定代码段或子程序的生命期。如for循环中得变量。
(2)只要你允许,就会一直持续下去。如new出来的变量。
(3)程序的声明期。如static全局变量。
(4)永远持续。如数据库中的数据。
为避免变量“变酸”(超过其生命期),可使用下面的建议:
(1)在程序中加入调试代码或者断言来检查那些关键变量的合理取值。
(2)准备抛弃变量时给它们赋上“不合理的数值”。如删除一个指针后将其赋值为null。
(3)编写代码时要假设数据没有持续性。注意C++和Java中得static除外。
(4)养成在使用所有数据之前声明和初始化的习惯。
10.6--绑定时间
下面是变量与数值绑定时间的总结:
(1)编码时(使用神秘数据)。
(2)编译时(使用具名常量)。
(3)加载时(从注册表、文件等外部数据源中读取数据)。
(4)对象实例化时(如在每次窗体创建的时候读取数据)。
(5)即时(如每次窗体重绘时)。
一般而言,绑定时间越早,灵活性越差。
10.7--数据类型和控制结构之间的关系
(1)序列性数据翻译为程序中的顺序语句。
(2)选择型数据翻译为程序中if和case语句。
(3)迭代性数据范围成程序中for,repeat,while等循环结构。
10.8--为变量指定单一用途
(1)每个变量只用于单一用途。
(2)避免让代码具有隐含含义。如pageCount在正常情况下表示纸张数目,为整数。然而当它为-1的时候,表明错误发生了,者是客串了布尔类型。因此最好用两个变量来保存这两种信息。
(3)确保使用了所有已声明的变量。