A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

2 个回复

倒序浏览
有任何问题欢迎在评论区留言
回复 使用道具 举报
或者添加学姐微信
DKA-2018
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马