6.1 Extract Method(提炼函数)
概括
有一段代码可以被组织在一起并独立出来。
将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。
例子
void printOwing(double amount){
printBanner();
//print details
System.out.println("name:" + _name);
System.out.println("amount:" + amount);
}
重构之后
void printOwing(double amount){
printBanner();
printdetails(amount);
}
void printdetails(double amount){
System.out.println("name:" + _name);
System.out.println("amount:" + amount);
}
函数过长或注释很长的代码。
简短命名良好的函数:
- 函数的粒度很小时,函数被复用的机会就更大
- 会使高层函数读起来就像一系列注释
- 函数都是细粒度的,函数的覆盖也更容易些
一个函数多长才算合适:长度不是问题,关键在于函数名称和函数本体之间的语义距离。
做法
。。。
实践
这个重构的难点在于局部变量,包括传进源函数的参数和源函数的参数和源函数所声明的临时变量。
有局部变量
1 局部变量值不变被提炼代码段只是读取这些变量的值,并不修改他们。2 局部变量再赋值
此时,只需简单的将它们当做参数传给目标函数。
只讨论临时变量(1)变量只在被提炼代码段中使用
只需直接在目标函数中修改它就可以了。
(2)被提炼代码段之后的代码也使用了此变量
让目标函数返回该变量改变后的值
如果需要返回的变量不止一个,该怎么做?
最好的选择通常是:挑选另一块代码来提炼
最好的选择通常是:挑选另一块代码来提炼
临时变量往往为数众多,甚至会使提炼工作举步维艰。这种情况下,先运用Replace Temp with Query来减少临时变量。如果这么做了提炼依旧困难重重,我就会用Replace Method with Method Object,这个重构手法不在乎代码中有多少临时变量,也不在乎你如何使用它们。
只需直接在目标函数中修改它就可以了。
(2)被提炼代码段之后的代码也使用了此变量
让目标函数返回该变量改变后的值
如果需要返回的变量不止一个,该怎么做?
最好的选择通常是:挑选另一块代码来提炼
最好的选择通常是:挑选另一块代码来提炼
临时变量往往为数众多,甚至会使提炼工作举步维艰。这种情况下,先运用Replace Temp with Query来减少临时变量。如果这么做了提炼依旧困难重重,我就会用Replace Method with Method Object,这个重构手法不在乎代码中有多少临时变量,也不在乎你如何使用它们。