重构手法(一)之重新组织函数

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(amount);
}

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 something
}

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(以函数对象取代函数)

9、Substitute Algorithm(替换算法)

重构前:

String foundPerson(String[] people){
    for(int i = 0; i < people.length; i++){
        if(people[i].equals("Don")){
            return "Don";
        }      
        if(people[i].equals("John")){
            return "John";
        }  
        if(people[i].equals("Kent")){
            return "Kent";
        } 
    }
    return "";
}

重构后:

String foundPerson(String[] people){
    List candidates = Arrays.asList(new String[] {"Don", "John", "Kent"});
    for(int i = 0; i < people.length; i++){
        if(candidates.contains(people[i]))
            return people[i];
    }  
    return "";
}
原文地址:https://www.cnblogs.com/dongerlei/p/5162929.html