含義
將一段代碼組織在一起并放進(jìn)一個獨(dú)立函數(shù)呕寝,并讓函數(shù)名稱解釋該函數(shù)的用途
簡單例子
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方法中
優(yōu)點(diǎn)
- 函數(shù)粒度小,容易被復(fù)用且覆寫容易
- 函數(shù)名稱很好解釋函數(shù)用途衷旅,高層函數(shù)讀起來就像一系列注釋
準(zhǔn)則
只要新函數(shù)的名稱能夠以更好的方式昭示代碼意圖澜驮,就應(yīng)該提煉漱逸,如果想不出一個更有意義的名稱就不動
進(jìn)階
無局部變量
無局部變量直接提取出來方法就好了-
有局部變量
1.提煉代碼段只讀取不修改這些變量
上面案例就是一個簡單的例子纳决,將amount當(dāng)做傳參就好了- 提煉代碼段對變量再賦值
可以通過提煉函數(shù)增加返回值來返回變量最終值
- 提煉代碼段對變量再賦值
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);
}
}
總結(jié)
提煉方法感覺是最簡單重構(gòu)手法之一了,在實際使用中通過提煉函數(shù)一是可以將特別大的函數(shù)拆分成小的函數(shù)便于理解肠槽,二是小的函數(shù)也更加方便于復(fù)用擎淤,但是也不是無腦進(jìn)行提煉奢啥,需要掌握好度,這個度正好可以借鑒上面的準(zhǔn)則