本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42463871
在上一篇文章中介绍了“重构笔记——引入解释性变量“。本文将介绍“分解临时变量”这种重构手法。
下面让我们来学习这种重构手法吧。
发现:你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果。
解决:针对每次赋值,创造一个独立、对应的临时变量。
//重构前 double temp = 2 * (_height + _width); System.out.println(temp); temp = _height + _width; System.out.println(temp);
//重构后 final double perimeter = 2 * (_height + _width); System.out.println(perimeter); final double area = _height + _width; System.out.println(area);
在某些情况下,临时变量用于保存一段冗长代码的运算结果,以便稍后使用。这种临时变量应该只被赋值一次。如果它被赋值超过一次,就意味着它们在函数中承担了一个以上的责任。如果临时变量承担多个责任,它就应该被替换(分解)为多个临时变量,使得每一个变量只承担一个责任。同一个临时变量承担两件不同的事情,会让代码阅读者糊涂。
double getDistance(int time){
double result;
double acc = _primaryForce / _mass;
int primaryTime = Math.min(time, _delay);
result= 0.5 * acc * primaryTime * primaryTime;
int secondaryTime = time - _delay;
if(secondaryTime > 0){
double primaryVel = acc *_delay;
acc = (_primaryForce + _secondaryForce) / _mass;
result += primaryVel * secondaryTime + 0.5 * acc * secondaryTime * secondaryTime;
}
return result;
} 代码看起来好像有点丑陋。观察例子中的acc变量是如何被赋值两次。double getDistance(int time){
double result;
final double primaryAcc = _primaryForce / _mass;
int primaryTime = Math.min(time, _delay);
result= 0.5 * primaryAcc * primaryTime * primaryTime;
int secondaryTime = time - _delay;
if(secondaryTime > 0){
double primaryVel = primaryAcc *_delay;
double acc = (_primaryForce + _secondaryForce) / _mass;
result += primaryVel * secondaryTime + 0.5 * acc * secondaryTime * secondaryTime;
}
return result;
} 新的临时变量指出,它只承担原先acc变量的第一个责任。将它声明为final,确保它只被赋值一次。然后,在原先acc变量第二次被赋值处重新声明acc。现在,重新编译并测试,一切都没有问题。double getDistance(int time){
double result;
final double primaryAcc = _primaryForce / _mass;
int primaryTime = Math.min(time, _delay);
result= 0.5 * primaryAcc * primaryTime * primaryTime;
int secondaryTime = time - _delay;
if(secondaryTime > 0){
double primaryVel = primaryAcc *_delay;
final double secondaryAcc = (_primaryForce + _secondaryForce) / _mass;
result += primaryVel * secondaryTime + 0.5 * secondaryAcc * secondaryTime * secondaryTime;
}
return result;
} 现在,我想你一定会想到前几篇文章中的一些重构手法,那就尽情使用吧。//“以查询取代临时变量”手法进行重构
double getDistance(int time){
double result= 0.5 * getPrimaryAcc() * getPrimaryTime(time) * getPrimaryTime(time);
if(getSecondaryTime(time) > 0){
result += getSeconddistance();
}
return result;
}
private double getPrimaryAcc(){
return _primaryForce / _mass;
}
private double getSecondaryAcc(){
return (_primaryForce + _secondaryForce) / _mass;
}
private int getPrimaryTime(int time){
return Math.min(time, _delay);
}
private int getSecondaryTime(int time){
return time - _delay;
}
private double getSeconddistance(){
return getPrimaryAcc() *_delay * getSecondaryTime(time)
+ 0.5 * getSecondaryAcc() * getSecondaryTime(time) * getSecondaryTime(time);
}原文:http://blog.csdn.net/pistolove/article/details/42463871