1. Extract Method(提煉函數) 將代碼段放進一個獨立函數中,並讓函數名稱解釋該函數的用途。 示例: void printOwing(double amount) { printBanner(); //print details System.out.println("name: " ...
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();
}
void printDetails(double amount) {
System.out.println("name: " + _name);
System.out.println("amount: " + amount);
}
2. Inline Method(內聯函數)
在函數調用點插入函數本體,然後移除該函數。
示例:
int getRating() {
return moreThanFiveLateDeliveries() ? 2 : 1;
}
boolean moreThanFiveLateDeliveries() {
return _numberOfLateDeliveries > 5;
}
重構為:
int getRating() {
return (_numberOfLateDeliveries > 5) ? 2 : 1;
}
3. Inline Temp(內聯臨時變數)
將所有對該變數的引用動作,替換為對它複製的那個表達式本身。
示例:
double basePrice = anOrder.BasePrice();
return (basePrice > 1000);
重構為:
return (anOrder.BasePrice() > 1000);
4. Replace Temp with Query(以查詢取代臨時變數)
將表達式提煉到一個獨立函數中,將這個臨時變數的所有引用點替換為對新函數的調用。此後,新函數就可被其他函數使用。
示例:
double basePrice = _quantity * _itemPrice;
if (basePrice > 1000) {
return basePrice * 0.95;
} else {
return basePrice * 0.98;
}
重構為:
if (basePrice() > 1000) {
return basePrice() * 0.95;
} else {
return basePrice() * 0.98;
}
...
double basePrice() {
return _quantity * _itemPrice;
}
5. Introduce Explaining Variable(引入解釋性變數)
將該複雜表達式(或其中一部分)的結果放進一個臨時變數,一次變數名稱來解釋表達式用途。
示例:
if ((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0) {
//do something
}
重構為:
final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;
if (isMacOs && isIEBrowser && wasInitialized() && wasResized) {
//do someting
}
6. Split Temporary Variable(分解臨時變數)
針對每次賦值,創造一個獨立,對應的臨時變數
示例:
double temp = 2 * (_height + _width);
System.out.println(temp);
temp = _height * _width;
System.out.println(temp);
重構為:
final double perimeter = 2 * (_height + _width);
System.out.println(perimeter);
final double area = _height * _width;
System.out.println(area);
7. Remove Assignments to Parameters(移除對參數的賦值)
以一個臨時變數取代該參數的位置
示例:
int discount (int inputVal, int quantity, int yearToDate) {
if (inputVal > 50) {
inputVal -= 2;
}
...
重構為:
int discount (int inputVal, int quantity, int yearToDate) {
int result = inputVal
if (inputVal > 50) {
result -= 2;
}
8. Replace Method with Method Object(以函數對象取代函數)
將這個函數放進一個單獨對象中,如此以來局部變數就成了對對象內的欄位。然後你可以在同一個對象中將這個大型函數分解為多個小型函數。
示例:
class Order...
double price() {
double primaryBasePrice;
double secondaryBasePrice;
double tertiaryBasePrice;
//long computation;
...
}
重構為:
class PriceCalculator {
private double primaryBasePrice;
private double secondaryBasePrice;
private double tertiaryBasePrice;
void compute() {
//long computation
}
}
class Order...
private PriceCalculator _priceCalculator = new PriceCalculator();
double price() {
return new PriceCalculator().compute();
...
9. Substitute Algorithm(替換演算法)
將函數邏輯本體替換為另一個簡潔清晰的演算法
示例:
String findPerson(String[] people) {
for (String person:people) {
if(person.equals("Don") || person.equals("John") || person.equals("Kent")) {
return person;
}
...
重構為:
String findPerson(String[] people) {
List candidates = Arrays.asList(new String[] {"Don", "John", "Kent"});
for(String person:people) {
if(candidates.contains(person)) {
return person;
}
...