我有两种方法可以实现一种计算方法,我想知道什么是更好的方法。
该方法需要一些int和double参数,并且(在某些情况下)需要一个特殊标志来进行一些不同的计算。
在第一个例子中,我可以使用'calculateFoo(1,2.0d)'调用方法,使布尔标志== FALSE。
在第二个例子中,我总是要设置布尔标志(即使我不需要它)
方法1 :(这里我使用'...'作为'方法重载'参数)
public SomeObject calculateFoo(int pIntValue, double pDoubleValue, boolean... pDoSpecialStuff) {
if (pDoSpecialStuff.length == 0 || pDoSpecialStuff[0] == false) {
// method was called without boolean flag or boolean flag was set to FALSE
// do some calculation stuff
// ...
} else {
// method was called with boolean flag == TRUE
// do some other calculation stuff
// ...
}
return SomeObject;
}
方法2 :(这是'常见'方法)
public SomeObject calculateFoo(int pIntValue, double pDoubleValue, boolean pDoSpecialStuff) {
if (pDoSpecialStuff == false) {
// method was called with boolean flag == FALSE
// do some calculation stuff
// ...
} else {
// method was called with boolean flag == TRUE
// do some other calculation stuff
// ...
}
return SomeObject;
}
答案 0 :(得分:2)
你的方法都有代码味道,布尔标志很糟糕
这是我的建议
public SomeObject calculateFoo(int pIntValue, double pDoubleValue) {
// normal calculation here
}
public SomeObject calculateFooSpecial(int pIntValue, double pDoubleValue) {
// special calculation here
}
答案 1 :(得分:1)
做第二个变体,因为它更明确。 Varargs允许您传递多个布尔值,然后不使用它们。最好使用单个布尔值显式定义接口。
如果您想要布尔标志的默认值,请使用另一个重载:
public SomeObject calculateFoo(int pIntValue, double pDoubleValue) {
return calculateFoo(pIntValue, pDoubleValue, false);
}
答案 2 :(得分:1)
考虑以下模式:
public ResultType calcFoo( int i, double d ) {
return calc( i, d, false );
}
public ResultType calcFoo( int i, double d, boolean flag ) {
if( flag ) {
...
return result;
}
else {
...
return result;
}
}
通常最好使用枚举而不是布尔标志。它使您的代码更具可读性,同样快。
我注意到你考虑使用varargs。如果要使用更多标志,请考虑使用EnumSet将一组标志传递给方法。如果你想传递0或1个标志,varargs甚至更像是反模式。
答案 3 :(得分:0)
我将使用两个参数定义另一个方法来执行默认计算。
public SomeObject calcFoo(int, double) {
....
}
public SomeObject calcFoo(int i, double d, boolean b) {
if(b) {
....
} else {
return calcFoo(i, d);
}
}