一、使用变量的一般事项

1.把变量引用局部化

变量应用局部化就是把变量的引用点尽可能集中在一起,这样做的目的是增加代码的可读性

衡量不同引用点靠近程度的一种方法是计算该变量的跨度(span)


示例

a = 0
b = 0
c = 0
a = b + c



a的第一次引用和第二次引用之间存在两行代码,因此变量的跨度是2,b的第一次引用和第二次引用之间存在一行代码,因此跨度是1。

平均跨度可以通过计算各个跨度的平均值得到。来看一个示例

a = 0
b = 0
c = 0
b = a + 1
b = b / c



b的第一次引用和第二次引用的跨度为1,第二次引用和第三次引用的跨度为0,因此平均跨度为(1 + 0) / 2 = 0.5。当把变量的引用点集中在一起的时候,阅读者能每次只关注一部分代码,如果这些引用点之间的距离非常远,那里就要迫使阅读者的目光在程序里跳来跳去


2.尽可能缩短变量的存活时间

存活时间是指一个变量存在期间所跨越的语句总数。变量的存活时间开始于引用它的第一条语句,结束于引用它的最后一条语句。

注意:存活时间只关注第一次引用和最后一次引用,而不关注中间有多少次引用。长存活时间意味着一个变量历经了许多条语句,而短存活时间意味着它只历经很少的语句,跨度表明对一个变量引用的集中程度

保持较低的存活时间的好处在于能够减小攻击窗口,因为存活时间短,该变量被错误或无意修改的可能性就变小了

小结

跨度:变量两次引用之间相隔的代码行数

减小跨度的好处:增强代码的可读性

存活时间:变量第一次引用和最后一次引用之间的代码行数

减小存活时间的好处:减小攻击窗口、增强可读性、方便重构


3.减小作用域的一般原则

1)在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量

2)直到变量即将被使用时再为其赋值,让变量的赋值位置越明显越好

3)拆分,把使用了类似的变量的语句放在一起

4)开始时使作用域尽可能小,之后有需要时再扩充


4.绑定时间

变量和它的值绑定在一起的时间称为绑定时间。这一绑定是在编写代码的时候还是编译程序的时候,是在程序加载的时候还是运行的时候?

采用越晚的绑定时间越有利,绑定时间定义的越晚,代码就包含越多的灵活性。下面来看几个例子



1)在编写代码的时候绑定值

java示例

titleBar.color = 0xFF;  //0xFF is hex value of color blue

这是典型的硬编码,这种硬编码技术通常是很糟糕的,因为一旦要修改这个值,那么这个新值就无法同代码中其他引用的地方保持一致了。要杜绝这种使用方式。



2)在编译时绑定值

java示例

private static final int COLOR_BLUE = 0xFF;
private static final int TITLE_BAR_COLOR = CLOR_BLUE;
...
titleBar.color = TITLE_BAR_COLOR

TITLE_BAR_COLOR是一个具名常量,编译器会在编译的时候把它替换为一个数值,这种方式有两个好处:

a. 易于修改,一处修改就能对所有位置生效

b. 可读性更强

补充:

private是java的关键字,可以用来修饰成员变量和成员方法,被其修饰的成员只能在本类中访问

static也是关键字,用static声明的成员变量为静态成员变量,也称为类变量,类变量的生命周期和类相同,在整个应用程序执行期间都有效。

final也是关键字,可以用来修饰引用、方法和类。如果引用为基本数据类型,则该引用为常量,该值无法修改;如果引用为引用数据类型,如对象、数组,则该对象数组本身可以修改,但指向该对象或数组的地址的引用不能修改

final修饰方法时,被修饰的方法将称为最终方法,无法被子类重写,但是,该方法仍然可以被继承

final修饰类时,该类成为最终类,无法被继承,简称为断子绝孙类。


对于Python这类解释型语言,可以这样绑定

COLOR_BLUE = 0xFF   # 这里可以直接写在代码里或者写在配置文件里
titleBar.color = TITLE_BAR_COLOR



3)在运行时绑定值

java示例

titleBar.color = ReadTitleBarColor();

使用一个子程序在程序运行期间读入数值的子程序,数值来源可能注册表或者配置文件


小结

绑定时间的有以下几种

1)编码时,也就是硬编码,应杜绝这种情况

2)编译时,使用具名常量,推荐这种方式

3)加载时,从外部数据源读取数据,推荐这种方式

12-01 10:00