临时变量,在我们写一个函数时或多或少都会要用到;相信大家也有遇到过,就因为要用到一个临时变量,而要写很长很长的一段逻辑处理才能取得,导致我们写的函数过长。不知道大家会不会有这样的感觉,看到一段这么长的一个函数就感到心烦,我就有这样的感觉;只要看到一大段代码在一个函数里面就想找出写这个函数的人打一吨(吐吐嘈就好了可别付出行动哦,毕竟我们是个有素质的人),更别说去改里面的bug了。单单去理解代码都是一件痛苦的事了,别说要了解里面的逻辑,里面的业务了。哪么我们换位思考下,自己是不是应该避免写出这样的代码呢。我们该怎么做呢?重构之以查询取代临时变量(Replace Temp with Query),就能帮助到我们。以查询取代临时变量(Replace Temp with Query)
1、临时变量只被赋值一次;
2、确保提练出来的函数无任何副作用;
我们先来看一段代码
[C#] 纯文本查看 复制代码 public double getPrice()
{
double basePrice = _quantity * _itemPrice;
double discountFactor;
if (basePrice > 1000)
{
discountFactor = 0.95;
}
else
{
discountFactor = 0.98;
}
return basePrice * discountFactor;
}
代码中basePrice 就只做了一次赋值,后面就再也没有对这个basePrice 进行赋值操作了;所以我们可以把basePrice 这个临时变量提取出来当做一个函数。然后我们再看看提取出来对原函数有没有造成影响。从代码上可看出,只要我们的提取出来的函数返回一个double值,然后对basePrice 进行赋值,对原函数将没有任何的影响,因为原函数只关心是不是有basePrice这个变量,basePrice 变量是不是有值。所以代码可以变成下面这样
(注:这个重构有个小小的技巧,就是可以在临时变量前面加上const(常量)来初步判断他是否只做了一次赋值)
[AppleScript] 纯文本查看 复制代码
public double getPrice()
{
double discountFactor;
if (basePrice() > 1000)
{
discountFactor = 0.95;
}
else
{
discountFactor = 0.98;
}
return basePrice() * discountFactor;
}
private int basePrice()
{
return _quantity * _itemPrice;
}
我们在来看看重构过一次的代码,从代码里面我们到还有discountFactor这个临时变量;我们是否能对他进行一次上面说的重构方法呢?我们来分析一下,代码里有两次对discountFactor进行了赋值,所以在临时变量前面加上const(常量)这一方法是不可行的。哪么就不能进行重构了吗?并不然细心的我们应该发现两次赋值是带有if(条件判断表达式)的,所以在条件判断表达式里面进行赋值其实就等于只做了一次赋值(相信这里聪明的你们都懂吧!不等的话去看看什么是条件判断表达式)。即然第一个条满足了,我们在来看看第二个条件:是否对原函数有影响;同样的原函数也只管discountFactor变量是否有值。所以我们可以重构成下面这样
[AppleScript] 纯文本查看 复制代码
public double getPrice()
{
return basePrice() * discountFactor();
}
private int basePrice()
{
return _quantity * _itemPrice;
}
private double discountFactor()
{
if (basePrice() > 1000)
{
return 0.95;
}
else
{
return 0.98;
}
}
好了,进行了两次的重构后getPrice函数代码就只有一行了;getPrice函数一目了然,提练出来的代码同样的相当简单;相对于没进行重构的getPrice函数更容易分析逻辑、了解业务,又不会被别人吐嘈何乐而不为呢!!!!
参考文献
重构——改善既有代码的设计 【美】Martin Fowler 著
熊节 译
|