一, 使用变量的一般事项
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) 加载时, 从外部数据源读取数据, 推荐这种方式
来源: https://www.cnblogs.com/zzliu/p/11963528.html