Summary: 若干函數作了相似的工做,但在函數本體中卻包含了不一樣的值。創建單一函數,以參數表達那些不一樣的值。java
動機:函數
你可能會發現這樣兩個函數:它們作着相似的工做,但因少數幾個值導致行爲略有不一樣。這種狀況下,你能夠將這些各自分離的函數統一塊兒來,並經過參數來處理那些變化狀況,用以簡化問題。這樣的修改能夠去除重複代碼,並提升靈活性,由於你能夠用這個參數處理更多的變化狀況。測試
作法:spa
1.新建一個帶有參數的函數,使它能夠替換先前全部的重複性函數。code
2.編譯。編譯
3.將調用舊函數的代碼改成調用新函數。ast
4.編譯,測試。class
5.對全部舊函數重複上述步驟,每次替換後,修改並測試時。重構
也許你會發現,你沒法用這種辦法處理整個函數,但能夠處理函數中的一部分代碼。這種狀況下,你應該首先將這部分代碼提煉到一個獨立函數中,而後再對那個提煉所得的函數使用Parameterize Method。im
範例:
protected Dollars baseCharge(){ double result = Math.min(lastUsage(), 100) * 0.03; if(lastUsage() > 100){ result += (Math.min(lastUsage(), 200) - 100) * 0.05; } if(lastUsage() > 200){ result += (lastUsage() -200) * 0.07; } return new Dollars(result); }
上述代碼能夠替換以下:
protected Dollars baseCharge(){ double result = usageInRange(0, 100) * 0.03; result += usageInRange(100, 200) * 0.05; result += usageInRange(200, Integer.MAX_VALUE) * 0.07; return new Dollars(result); } protected int usageInRange(int start, int end){ if(lastUsage() > start){ return Math.min(lastUsage(), end) - start; }else{ return 0; } }
本項重構的要點在於:以「可將少許數值視爲參數」爲依據,找出帶有重複性的代碼。