首页 > 代码库 > 软件架构————如何写好变量(1)
软件架构————如何写好变量(1)
变量初始化原则:
不合理初始化数据是产生编程错误的常见根源之一。
避免初始化出错的建议:
1.在声明变量的时候初始化。
2.在靠近变量第一次使用的位置初始化(一些语言不支持声明同时进行初始化)。
3.理想情况下,在靠近第一次使用变量的位置声明和定义变量。
4.在可能的情况下使用final或const,可以防止变量在初始化后再被赋值。
5.特别注意累加器和计数器,在下一次使用这些变量之前忘记重置其值也是一种常见错误。
6.在类的构造函数里初始化该类的数据成员
7.检查是否需要重新初始化
8.一次性初始化具名常量,可执行代码来初始化变量。
9.使用编译器来设置自动初始化所有变量
10.利用编译器的警告信息。
11.检查输入参数的合法性。
12.使用内存访问检查工具来检查错误的指针。
13.在程序开始时初始化工作内存。把工作内存初始化为一个已知数值将会有助于发现初始化错误:可以在程序运行前,将内存添上一个特定的数,如0,x86系统中可以填0xcc(中断机器码)或0xDEADBEEF这一常量来填充。
作用域
作用域或者可见性指的是变量在程序内的可见和可饮用的范围。
使变量引用局部化:
一般而言,把对一个变量的引用局部化,即把引用点尽可能集中在一起。衡量一个变量的不同引用点的靠近程度的一种方法是计算该变量的“跨度”。即从变量声明初始化之后,到再次饮用该变量时中间执行程序的条数。
平均跨度可以通过对各个跨度计算平均值而获得。当把变量的引用点靠近在一起的时候,也就使得代码的阅读者每次只能关注于一部分代码。而如果这些引用点之间的距离非常远,那你就要迫使读者的目光在程序里跳来跳去。因此,吧变量的引用点集中起来的主要好处是提高程序的可读性。
尽可能缩短变量的"存活"时间
“存活时间”,即一个变量存在期间所跨越的语句总数。变量的存活时间开始于引用它的第一条语句,结束语应用它的最后一条语句。
保持短的存活时间的主要好处也是减少攻击窗口。这样,在你真正想要修改一个变量的哪些位置之间的区域,该变量被错误或无意修改的可能性就降低了。
缩短变量的存活时间的另一个好处是使你能对自己的代码有更准确的认识。
短的变量存活时间同样减少了初始化错误的可能。
变量存活时间端还会使代码更具可读性。
最后,当需要把一个大的子程序拆分成多个小的子程序时,短的变量存活时间也很有价值。
减小作用域的一般原则
1.在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量。这样做,当需要修改循环的时候,会更容易记起要对循环的初始化代码做相应的修改。
2.直到变量即将被使用时再为其赋值,让变量的赋值位置越明显越好。
3.把相关语句放到一起,把变量引用集中起来,以便能更容易找到他们。
4.把相关语句组提取成单独的子程序。
5.开始时采用最严格的可见性,然后根据需要扩展变量的作用域。当决定该采用何种作用域的时候,首先考虑将变量局部化,或局限在某个循环,或某个子程序,其次成为private变量,protected变量,再次对包可见,最后在不得已的情况下变为全局变量。
持续性
“持续性”是对一项数据的生命期的另一种描述。建议:
1.在程序中加入调试代码或者断言来检查哪些关键变量的合理取值。
2.对于准备抛弃的变量,变量值给他赋上一个不合理的数值。如指针附上null
3.养成在使用所有数据之前声明和初始化的习惯。如果发现某项数据的使用位置与初始化位置相去甚远,那么就小心了。
绑定时间
1.在编码时(使用神秘数值)
2.编译时(使用具名常量)
3.加载时
4.对象实例化时
5.即时
一般来讲,绑定时间越早灵活性就越差,但复杂度也会降低。
为变量指定单一用途
1. 每个变量只用于单一用途:常见的情况就是这个变量的命名对于其中某项用途来说不适当,或者在两个场合使用同一个“临时”变量“,但是带来的问题是不同变量引用这个临时变量之间有什么关系么?即这个临时变量使得没有关系之间的东西变得貌似有联系,因此应该避免这种写法,最好用良好的命名来区分各个临时变量的用途。
2.避免让代码具有隐含含义:把同一变量用于多个用途的另外一种方式是当变量代表不同事物时让其具有不同的取值集合。
3.确保使用了所有已声明的变量:与同一变量多种用途相反的是声明了变量却不使用,减少未使用的变量值对程序错误率的影响。
软件架构————如何写好变量(1)