Split Temporary Variable(分解临时变量)
double temp = 2 * (_height + _width);
System.out.println(temp);
temp = _height * _width;
System.out.println(temp);
修改后:
final double temp = 2 * (_height + _width);
System.out.println(temp);
final double = _height * _width;
System.out.println(temp);
做法
- 在待分解临时变量的声明及其第一次被赋值处,修改其名称。
如果稍后之赋值语句是[i=i+某表达式]形式,就意味这是个结果收集变量,那么就不要分解它。结果收集变量的作用通常是累加、字符串接合、写入流或者向集合添加元素。
将新的临时变量声明为final
以该临时变量的第二次赋值动作为界,修改此前对该临时变量的所有引用点,让它们引用新的临时变量
在第二次赋值处,重新声明原先那个临时变量
编译,测试
逐次重复上述过程。每次都在声明处对临时变量改名,并修改下次赋值之前的引用点
范例
double getDistanceTravelled(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;
}
修改后:
double getDistanceTravelled(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 getDistanceTravelled(int time){
return (time - _delay) > 0 ?
primaryDistanceTravelled(time) + secondaryDistanceTravelled(time) :
primaryDistanceTravelled(time);
}
double primaryDistanceTravelled(int time){
return 0.5 *
(_primaryForce / _mass) *
Math.pow(Math.min(time, _delay),2);
}
double secondaryDistanceTravelled(int time){
return ((_primaryForce / _mass) * _delay) *
(time - _delay) + 0.5 *
((_primaryForce + _secondaryForce) / _mass) *
Math.pow((time - _delay),2);
}