2

我通常采用Are booleans as method arguments unacceptable中建议的枚举参数?并使用策略模式实现它。

但是,我现在有一个复杂的逻辑,我无法进入枚举,因为没有非静态枚举以及需要将大量变量复制到枚举中的方法中和从中复制出来。如果我在代码中使用 switch 而不是策略模式,我似乎失去了除了简单清晰之外的所有好处。

对于这种特定方法,只能有两种可能性,那么布尔参数会更容易接受吗?(如果使用枚举,我们的编码标准要求我处理在这种情况下似乎不必要的任何未知枚举。)也许我可以将布尔值放入常量并使用常量调用方法?

编辑:

复杂的逻辑是专有代码,但它类似于

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
}
4

1 回答 1

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
}
于 2013-07-03T11:32:42.187 回答