如何避免在Java中使用方法选择器参数(标志/布尔参数)

时间:2014-06-02 14:46:31

标签: java if-statement methods arguments

我刚刚完成Clean Code,其中一条规则是避免将布尔参数作为功能选择器传递,例如,

而不是:

public double calculateWeeklyPay(boolean overtime) {
    double pay = calculatePay();
    if (overtime) {
         return pay *= 1.5;
    }
    return pay;
}

我们应该这样做,让消费者调用适当的方法:

public double calculateWeeklyPay() {
    return calculatePay();
}

public double calculateWeeklyPayWithOvertime() {
    double pay = calculateWeeklyPay();
    return pay *= 1.5;
}

但是我应该在更复杂的方法中做什么,分割方法意味着会有很多重复的代码呢?

这里应该做些什么:

public double calculateWeeklyPay(boolean overtime) {

    double pay = calculatePay();
    pay = modifyPay1(pay);
    pay = modifyPay2(pay)
    pay = modifyPay3(pay)
    if (overtime) {
        pay = pay *= 1.5;
    }
    pay = modifyPay4(pay);
    pay = modifyPay5(pay);
    pay = modifyPay6(pay);

}

3 个答案:

答案 0 :(得分:5)

您必须区分公共API 内部API

对于公共API,你真的应该避免使用这样的选择器参数。但对于内部API(私有方法),它是一种适当的实现机制。所以就这样:

public double calculateWeeklyPayWithOvertime() {
    return calculateWeeklyPay(true);
}

public double calculateWeeklyPayWithoutOvertime() {
    return calculateWeeklyPay(false);
}

private double calculateWeeklyPay(boolean overtime) {
    double pay = calculatePay();
    if (overtime) {
         pay *= 1.5;
    }
    return pay;
}

答案 1 :(得分:0)

你能不能在第二个例子中做同样的事情?

public double calculateWeeklyPay() {

double pay = calculatePay();
anotherMethod1(pay);
anotherMethod2(pay)
anotherMethod3(pay)

anotherMethod4(pay);
anotherMethod5(pay);
anotherMethod6(pay);
}

public double calculateWeeklyPayWithOvertime() {
double pay = calculatePay();
anotherMethod1(pay);
anotherMethod2(pay)
anotherMethod3(pay)

    pay = pay *= 1.5;

anotherMethod4(pay);
anotherMethod5(pay);
anotherMethod6(pay);
}

答案 2 :(得分:0)

如果在将方法拆分为两个之后存在任何重复代码块,那么最佳做法是将重复的代码移除到私有方法并调用此私有方法代替重复的代码

e.g。而不是

public void trueMethod() {
     //do a few lines 
     // of general stuff

     println("Did the true method");
}

public void falseMethod() {
     //do a few lines 
     // of general stuff

     println("Did the false method");
}

最好这样做:

private void generalMethod() {
     //do a few lines 
     // of general stuff
}


public void trueMethod() {
     generalMethod();

     println("Did the true method");
}

public void falseMethod() {
     generalMethod();

     println("Did the false method");
}