含义
将一段代码组织在一起并放进一个独立函数,并让函数名称解释该函数的用途
简单例子
public class ExtractMethod {
private String name;
private void printOwing(double amount) {
printBanner();
/*System.out.println("name:" + name);
System.out.println("amount:" + amount);*/
printDetails(amount);
}
private void printBanner() {
System.out.println("banner");
}
private void printDetails(double amount) {
System.out.println("name:" + name);
System.out.println("amount:" + amount);
}
}
上面例子中将两句打印信息的代码提取到printDetails方法中
优点
- 函数粒度小,容易被复用且覆写容易
- 函数名称很好解释函数用途,高层函数读起来就像一系列注释
准则
只要新函数的名称能够以更好的方式昭示代码意图,就应该提炼,如果想不出一个更有意义的名称就不动
进阶
-
无局部变量
无局部变量直接提取出来方法就好了 -
有局部变量
1.提炼代码段只读取不修改这些变量
上面案例就是一个简单的例子,将amount当做传参就好了- 提炼代码段对变量再赋值
可以通过提炼函数增加返回值来返回变量最终值
- 提炼代码段对变量再赋值
public class ExtractMethod {
private String name;
private void printOwing(double amount) {
printBanner();
/*while (amount < 10) {
amount += Math.random();
}*/
amount = calculateAmount(amount);
printDetails(amount);
}
private void printBanner() {
System.out.println("banner");
}
private double calculateAmount(double amount) {
while (amount < 10) {
amount += Math.random();
}
return amount;
}
private void printDetails(double amount) {
System.out.println("name:" + name);
System.out.println("amount:" + amount);
}
}
总结
提炼方法感觉是最简单重构手法之一了,在实际使用中通过提炼函数一是可以将特别大的函数拆分成小的函数便于理解,二是小的函数也更加方便于复用,但是也不是无脑进行提炼,需要掌握好度,这个度正好可以借鉴上面的准则
网友评论