变量初始化原则
- 在声明变量的时候初始化
- 在靠近变量第一次使用的位置初始化
- 在可能的情况下使用final或者const,final和const关键字在定义类常量、初始化值后将不会再改变了
- 注意计数器和累加器中的i、j、k等经常作为计数器变量,记得在下一次使用之前重置其值。
- 在类的构造函数里初始化该类的数据成员,正如子程序的变量应该在每一个子程序内部初始化一样,类的数据也应该在其构造函数中初始化。
- 检查是否需要重新初始化
不合理的初始化变量所导致的一系列问题都源于变量的默认初始值与你的预期不同。以下行为都会产生此类问题
- 从未对变量赋值。它的值只是程序启动时变量所处内存区域的值(教训:前几天写一个计算变量,以为是系统默认赋值为0,就没有对数值初始化,然后获取的数据序列都是零散的,后面跟踪代码才发现,那个变量的初始值系统给的是一个极其大的值)
- 变量值已经过期。变量在某个地方曾经被赋值,但该值已经不再有效。
- 变量的一部分被赋值,而另一部分没有。
作用域
把变量的引用点(就是使用变量的位置)集中起来,其主要好处就是提高程序的可读性,可以避免阅读代码的时候在程序中跳来跳去。
尽可能缩短变量的“存活”时间
“存活时间(live time)”,即一个变量存在期间所跨越的语句总数。变量的存活时间开始于引用它的第一条语句,结束于引用它的最后一条语句。
“长存活时间”意味着一个变量经历了许多语句,而“短存活时间”意味着它只经历很少的语句。
短存活时间的好处
- 减小攻击窗口(那些介于同一个变量多个引用点之间的代码可称为“攻击窗口”),变量被错误或无意修改的可能性降低。
- 代码更集中,让阅读者对代码有更准确的认识,使代码更具有可读性。
- 减少了初始化错误的可能。
- 方便以后的代码片段拆分重构。
减少作用域的一般原则
- 在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序开始处初始化这些变量。这在你需要修改循环时,更容易记起要对循环的初始化代码做相应的修改。
- 直到变量即将被使用时再为其赋值
- 把相关语句放到一起,以便更容易找到它们。
- 把相关语句组提取成单独的子程序。在其他条件相同的情况下,一个更短的子程序中的变量通常比更长的子程序中的变量有更小的跨度和存活时间。
- 开始时采用最严格的可见性,然后根据需要扩展变量的作用域。就是尽量是变量局部化。