2019-04-18 · Refactoring

Extract Method-提炼函数

你有一段代码可以被组织在一起并独立出来。将这段代码放进一个独立函数中,并让函数名称解释该函数的用途
《重构-改善既有代码的设计》第110页。

动机

做法

IntelliJ IDEA 编辑器有很好的支持函数提起,快捷键(CTRL+ALT+M

栗子

无局部变量

无局部变量是最简单的情况,直接选择需要被提取的代码段,使用上面的快捷键就行了,这里不做演示了。

有局部变量

被提取的代码段只是读取这些变量的值,并不修改它们

这种情况下可以简单地将它们当作参数传给目标函数。

被提取的代码段对局部变量赋值

如果是对源函数的参数进行赋值,这种情况比较复杂,应该马上使用 Remove Assignments to Parameters(131) 。这里主要讨论零时变量的问题:

被提炼前的代码

void printOwing(double previousAmount) {
    Enumeration e = _orders.elements();
    double outstanding = previousAmount * 1.2;
    
    printBanner();
    
    // calculate outstanding
    
    while(e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        outstanding += each.getAmount();
    }
    
    printDetails(outstanding);
}

被提炼后的代码:

void printOwint(double previousAmount) {
    printBanner();
    double outstanding = getOutstanding(previousAmount * 1.2);
    printDetails(outstanding);
}

double getOutstanding(double initialValue) {
    double result = initialValue;
    Enumeration e = _orders.elements();
    while(e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        result +=  each.getAmount();
    }
    return result;
}