重新组织函数--以查询取代临时变量(Replace Temp with Query)

你的程序以一个临时变量保存某一表达式的运算结果


将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可以被其他函数使用。

double basePrice=_quantity*_itemPrice;

if(basePrice>1000){

return basePrice*0.95;

else 

return basePrice*0.98;

}

.......................

重构后:

if(basePrice()>1000){

return basePrice()*0.95;

else 

return basePrice()*0.98;

}

double basePrice(){

double basePrice=_quantity*_itemPrice;

}

动机

临时变量的问题在于:它们是暂时的,而且只能在所属函数内使用。由于临时变量只在所属函数内可见,所以它们会驱使你写出更长的函数,因为只有这样你才能访问到你需要的临时变量。如果把临时变量替换为一个查询,那么同一个类中的所有函数都将获得这份信息。这将带给你极大帮助近,使你能够为这个类编写更清晰的代码。

Replace Temp with Query(120)往往是你用Extra Method必不可少的一个步骤。局部变量会使代码难以被提炼,所以你应该尽可能把它们替换为查询式。

这个重构手法较为简单的情况是:临时变量只被赋值一次,或者赋值给临时变量的表达式不受其他条件的影响。其他情况比较棘手,但也有可能发生。你可能需要先运用

split Temporary Variable(128)或者Separate Query From Modifier(279)使情况变得简单一些,然后再替换临时变量。如果你想替换的临时变量是用来收集结果的(例如循环中的累加值),就需要将某些逻辑(例如循环)复制到查询中去。


我们常常使用临时变量保存循环中的累加信息。在这种情况下,整个循环都可以被提炼为一个独立函数,这也可以使原本的函数可以少掉几行扰人的循环逻辑。有时候,你可能会在一个循环中累加好几个值,这种情况下,你应该针对每一个累加值重复一遍循环,这样就可以将所有临时变量都替换为查询。当然,循环应该更简单,复制这些代码时才不会带来危险。

运用此手法,你可能会担心性能问题。和其他性能问题一样,我们现在不管它,因为它十有八九不会造成影响。如是性能真的出了问题,你可以在优化时期解决它。代码组织良好,你往往能够发现更有效的解决方案:如果没有进行重构,好的优化方案就可能失之交臂。如果性能实在太糟糕,要把临时变量放回去也是很容易的。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值