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; } ...
|