6.4 Replace Temp with Query(以查询取代临时变量)

概括
以一个临时变量保存某一个表达式的运算结果。
将这个表达式提炼到一个独立函数汇总。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其它函数使用。
      例子
double basePrice  = _quantity  * _itemPrice;
if(basePrice  >  1000)
      return basePrice * 0. 95;
else
     return basePrice * 0. 5;

重构后
if(basePrice()  >  1000)
      return basePrice() * 0. 95;
else
     return basePrice() * 0. 5;
...
double basePrice(){
     return  _quantity  * _itemPrice;
}

动机
         临时变量的问题:临时变量只能在所属函数内使用,驱使你写出更长的函数来访问到需要的临时变量。
         如果把临时变量替换为一个查询函数,那么同一个类中的所有函数都可以获得这份信息。这会使你能够问这个类编写更为清晰地代码。
         Replace Temp with Query往往是你运用Extract Method之前必不可少的一个步骤。局部变量会使得代码难以被提炼,所以你应该尽可能把它们替换为查询式。
         简单情况:临时变量只被赋值一次,或者赋值给临时变量的表达式不受其他条件影响。
         复杂情况:可能需要先运用Split Temporary Variable或Seperate Query from Modifier使情况变得简单一些。
          如果你想替换的临时变量是用来收集结果的(例如循环中的累加值),就需要将某些程序逻辑(如循环)复制到查询函数中。
做法
.
实践
        我们常常使用临时变量保存循环中的累加信息。此时,真个循环都可以被提炼为i一个独立函数。
         运用此手法,可能会带来性能问题。和其他性能问题一样,我们现在不管它,因为它十有八九不会造成任何影响。若性能真出了问题,你也可以在优化时期解决它。
         组织良好的代码往往能发现更有效的优化方案。
         如果性能是在太糟糕,要把临时变量放回去也很容易。

你可能感兴趣的:(重构)