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);}
