我通常采用Are booleans as method arguments unacceptable?中建议的Enum参数,并使用策略模式实现它。
然而,我现在有一个复杂的逻辑,我不能进入Enum,因为没有非静态枚举和一些荒谬的变量需要复制到Enum中的方法中。如果我在代码中使用开关而不是策略模式,除了简单的清晰度之外,我似乎失去了所有的好处。
对于这种特殊的方法,只能有两种可能性,那么布尔参数是否更可接受? (如果使用了枚举,我的编码标准要求我处理在这种情况下似乎不必要的任何未知枚举。)也许我可以将布尔值放入常量并使用常量调用方法?
编辑:
复杂的逻辑是专有代码,但它类似于
public void method(A a, B b, boolean replaceMe) {
// Create and prepare local variables c, d, e, f, g;
if (replaceMe) {
// doSomethingWith a, b, c, d, e and return e, f, g
} else {
// doSomethingElseWith a, b, c, d, e and return e, f, g
}
// Process e, f, g further
}
答案 0 :(得分:2)
您可以再次使用策略模式
public interface DoSomethingWithA2GStrategy { // horrible name I know ;)
void doSomething(A2GParameterContainer params);
}
并为容器创建如下内容:
public class A2GParameterContainer {
TypeOfA a;
// ...
TypeOfG g;
//getters and setters
}
然后稍微修改你的方法并传递具体的策略
public void method(A a, B b, DoSomethingWithA2GStrategy strategy) {
// Create and prepare local variables c, d, e, f, g;
A2GParameterContainer params = new A2GParameterContainer();
params.setA(a);
// ...
params.setG(g);
strategy.doSomething(params);
// take e, f, g from the container
// Process e, f, g further
}