1、创造一个新函数,根据这个函数的意图对它命名,以做什么来命名,而不是以怎样做命名
2、将提炼出的代码从源函数复制到新建的目标函数中
3、仔细检查提炼出的代码,看看其中是否引用例如“作用于限于源函数”的变量,包括局部变量和源函数参数
4、检查是否有仅用于被提炼代码段的临时变量,如果有,在目标函数中将它们声明为临时变量
5、检查被提炼的代码段,看看是否有任何局部变量的值被它改变,如果一个临时变量的值被修改了,看看是否可以将被提炼的代码段处理为一个查询,并将结果赋值给相关变量,如果很难这样做,或如果被修改的变量不止一个,就不能仅仅将这段代码原封不动地提取出来,可能需要先使用Split Temporary Variable,然后再尝试提炼,也可以使用Replace Temp wih Query将临时变量消灭掉
6、将被提炼代码段中需要读取的局部变量,当作参数传给目标函数
7、处理完所有局部变量之后,进行编译
8、在源函数中,将被提炼的代码替换为对目标函数的调用
9、如果将任何临时变量移到目标函数中,请检查它们原本的声明式是否在被提炼代码段的外围,如果是,现在可以删除这些声明式了
10、编译、测试
关于局部变量的处理
1、如果被提炼代码段只是读取这些变量的值,并不修改它们,这样情况下可以简单地将它们作为从参数传递给目标函数
2、如果局部变量是个对象,而被提炼的代码调用了会对该对象造成修改的函数,也可以将这个对象作为参数传递给目标函数即可
3、如果被提炼的代码段对局部变量赋值,但是这个变量只在被提炼代码段中使用,可以将这个临时变量的生命移到被提炼代码段中,然后一起提炼出去。
4、如果被提炼的代码段之外的代码也使用了这个变量,就需要让目标函数返回该变量改变之后的值
5、如需要被返回的变量不止一个,最好的选择是挑选另外一块代码来提炼,最好让每个函数只返回一个值,所以安排多个函数,返回多个值。
一个例子
void print() {
Enumeration e = _orders.elemtents();
double outstanding = 0.0;
// print baner
System.out.println("***********************************");
System.out.println("********** Customer Oews **********");
System.out.println("***********************************");
// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += e.getAmount();
}
// print details
System.out.println("name: " + _name);
System.out.println("amount: " + outstanding);
}
首先提炼出 print baner部分代码
void print() {
Enumeration e = _orders.elemtents();
double outstanding = 0.0;
// print baner
printBaner();
// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += e.getAmount();
}
// print details
System.out.println("name: " + _name);
System.out.println("amount: " + outstanding);
}
private void printBaner() {
System.out.println("***********************************");
System.out.println("********** Customer Oews **********");
System.out.println("***********************************");
}
然后提炼出 print detail这部分代码
void print() {
Enumeration e = _orders.elemtents();
double outstanding = 0.0;
// print baner
printBaner();
// calculate outstanding
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
outstanding += e.getAmount();
}
// print details
printDetail(outstanding);
}
private void printDetail(double outstanding) {
System.out.println("name: " + _name);
System.out.println("amount: " + outstanding);
}
private void printBaner() {
System.out.println("***********************************");
System.out.println("********** Customer Oews **********");
System.out.println("***********************************");
}
最后提炼出 calculate outstanding这部分代码
void printOwing() {
// print baner
printBaner();
// calculate outstanding
double outstanding = getOutstanding(e, outstanding);
// print details
printDetail(outstanding);
}
private double getOutstanding() {
Enumeration e = _orders.elemtents();
double result = 0.0;
while (e.hasMoreElements()) {
Order each = (Order) e.nextElement();
result += e.getAmount();
}
return result;
}
private void printDetail(double outstanding) {
System.out.println("name: " + _name);
System.out.println("amount: " + outstanding);
}
private void printBaner() {
System.out.println("***********************************");
System.out.println("********** Customer Oews **********");
System.out.println("***********************************");
}