假如现在有这样一段代码:
double temp = 2 * (height + weight);
System.out.println("周长是" + temp);
temp = height * weight;
System.out.println("面积是" + temp);
看到这段代码,如果不是看汉字注释,是不是很不容易想起来每个公式干嘛的。我们现在就产生想要重构的冲动。
将每个变量都声明为“见名知其意”的临时变量,修改后的代码如下:
double circumference = 2 * (height + weight);
System.out.println("周长是" + circumference);
double area = height * weight;
System.out.println("面积是" + area);
一、变量
临时变量有那么几种用途:
- 循环变量,比如for(int i = 0; i < 100; i++) 中的i就属于循环变量。i++也属于结果收集变量。
- 结果收集变量,对某个结果进行多次累计收集。
- 临时存储某个值,比如某个变量用于存储某个计算过程得到的结果,供未来的使用。
分解临时变量的原则是:
- 在待分解的临时变量声明处,修改其名字,并用final进行修饰。
- 已该临时变量所在的饿第二次赋值为修改点,修改之前对该临时变量的引用,指向新的名称。
- 在第二个声明处,重新声明该变量,并将引用该变量的饿地方修改为新声明的变量。
- 循环1、2、3直到所有的变量分解完成。
下面是个例子代码,我们一步步修改:
double getCalculateResult(int times) {
int initialValue = 100;
double average = initialValue / time;
double result = 0.0;
if (time > 0) {
double redouble = average * i;
average = (redouble + i * i)/i;
result += average * (i-1);
}
return result;
}
第一步:现在average变量被重复使用了,我们将average重新定义为:primaryAverage.修改后的代码如下:
double getCalculateResult(int times) {
int initialValue = 100;
final double primaryAverage = initialValue / time;
double result = 0.0;
if (time > 0) {
double redouble = primaryAverage * i;
double average = (redouble + i * i)/i;
result += average * (i-1);
}
return result;
}
继续把第二个变量也重新定义下:
double getCalculateResult(int times) {
int initialValue = 100;
final double primaryAverage = initialValue / time;
double result = 0.0;
if (time > 0) {
double redouble = primaryAverage * i;
final double secondAverage = (redouble + i * i)/i;
result += secondAverage * (i-1);
}
return result;
}
这样看起来是不是很好了。