Split Temporary Variable(分解临时变量)

  1. double temp = 2 * (_height + _width);
  2. System.out.println(temp);
  3. temp = _height * _width;
  4. System.out.println(temp);

修改后:

  1. final double temp = 2 * (_height + _width);
  2. System.out.println(temp);
  3. final double = _height * _width;
  4. System.out.println(temp);

做法

  • 在待分解临时变量的声明及其第一次被赋值处,修改其名称。

    如果稍后之赋值语句是[i=i+某表达式]形式,就意味这是个结果收集变量,那么就不要分解它。结果收集变量的作用通常是累加、字符串接合、写入流或者向集合添加元素。

  • 将新的临时变量声明为final

  • 以该临时变量的第二次赋值动作为界,修改此前对该临时变量的所有引用点,让它们引用新的临时变量

  • 在第二次赋值处,重新声明原先那个临时变量

  • 编译,测试

  • 逐次重复上述过程。每次都在声明处对临时变量改名,并修改下次赋值之前的引用点

范例

  1. double getDistanceTravelled(int time){
  2. double result;
  3. double acc = _primaryForce / _mass;
  4. int primaryTime = Math.min(time, _delay);
  5. result = 0.5 * acc * primaryTime * primaryTime;
  6. int secondaryTime = time - _delay;
  7. if(secondaryTime > 0){
  8. double primaryVel = acc * _delay;
  9. acc = (_primaryForce + _secondaryForce) / _mass;
  10. result += primaryVel * secondaryTime + 0.5 * acc * secondaryTime * secondaryTime;
  11. }
  12. return result;
  13. }

修改后:

  1. double getDistanceTravelled(int time){
  2. double result;
  3. final double primaryAcc = _primaryForce / _mass;
  4. int primaryTime = Math.min(time, _delay);
  5. result = 0.5 * primaryAcc * primaryTime * primaryTime;
  6. int secondaryTime = time - _delay;
  7. if(secondaryTime > 0){
  8. double primaryVel = primaryAcc * _delay;
  9. final double secondaryAcc = (_primaryForce + _secondaryForce) / _mass;
  10. result += primaryVel * secondaryTime + 0.5 * secondaryAcc * secondaryTime * secondaryTime;
  11. }
  12. return result;
  13. }

上述函数分解

  1. double getDistanceTravelled(int time){
  2. return (time - _delay) > 0 ?
  3. primaryDistanceTravelled(time) + secondaryDistanceTravelled(time) :
  4. primaryDistanceTravelled(time);
  5. }
  6. double primaryDistanceTravelled(int time){
  7. return 0.5 *
  8. (_primaryForce / _mass) *
  9. Math.pow(Math.min(time, _delay),2);
  10. }
  11. double secondaryDistanceTravelled(int time){
  12. return ((_primaryForce / _mass) * _delay) *
  13. (time - _delay) + 0.5 *
  14. ((_primaryForce + _secondaryForce) / _mass) *
  15. Math.pow((time - _delay),2);
  16. }