动机
临时变量的问题在于:它们是暂时的,而且只能在所属函数内使用。由于临时变量只在所属函数内可见,所以它们会驱使你写出更长的函数,因为只有这样你才能访问到需要的临时变量。如果把临时变量替换为一个查询,那么同一个类中的所有函数都将可以获得这份信息。这将带给你极大帮助,使你能够为这个类编写更清晰的代码。
做法
- 找出只被赋值一次的临时变量(如果某个临时变量被赋值超过一次,考虑使用Split Temporary Variable,将它分割成多个变量)。
- 将该临时变量声明为final。
- 编译(这可确保该临时变量的确只被赋值一次)。
- 将“对该临时变量赋值”之语句的等号右侧部分提炼到一个独立函数中。
4.1 首先将函数声明为private。日后你可能会发现有更多类需要使用它,那时放松对它的保护也很容易。
4.2 确保提炼出来的函数无副作用,也就是说该函数并不修改任何对象内容。如果它有副作用,就对它进行Separate Query from Modifyer。 - 编译,测试。
- 在该临时变量身上实施Inline Temp。
范例
double getPrice() {
int basePrice = _quantity * _itemPrice;
double discountFactor;
if (basePrice > 1000) discountFactory = 0.95;
else discountFactor = 0.98;
return basePrice * discountFactor;
}
先将临时变量声明为final,检查它们是否的确只被赋值一次。
double getPrice() {
final int basePrice = _quantity * _itemPrice;
final double discountFactor;<