保持几个布尔值作为状态变量是一个糟糕的编程习惯吗?

时间:2014-11-15 07:58:48

标签: design-patterns boolean state

假设我们有一个与几个不同的其他对象接口的复杂类,这些交互取决于彼此的状态。

我会立即尝试使用几个状态布尔值来尝试跟踪这些状态,但这通常会导致代码填满IF语句的混乱代码。

是否有解决方案或设计模式来处理这个问题,同时尽量减少混乱?

举个例子,考虑这样的事情:

int Foo(int A, int B, inc C)
{
    if(_state1 && !_state2)
        return A+B;

    else if(_state1 && _state2 && _state3)
        return A+C;

    else if(!_state1 && (_state4 || _state5)
        return C;    
    ...
}    

很容易看出这样的事情会很快失控

1 个答案:

答案 0 :(得分:1)

可能,实现此目的的更好方法之一是使用状态机,具体取决于未提供的详细信息。 (我将在Java中给出我的示例,因为这是我熟悉的并且您没有指定;但是,它应该适用于大多数OO语言。)

您需要枚举,状态变量,并使用switch语句进行选择。

所以,你想要一个枚举:

public static enum ExampleState {
    // You would want explanatory names in a real program.
    INITIAL_STATE, SOME_STATE, OTHER_STATE
}

然后,在你复杂的课上:

private ExampleState state = ExampleState.INITIAL_STATE;

public int foo(int a, int b, int c) {
    switch (state) {
    case INITIAL_STATE: return a + b;
    case SOME_STATE: return a + c;
    case OTHER_STATE: return c;
    default: throw new IllegalStateException("Unexpected state " + state);
    }
}

对于普通状态机,您还需要像

这样的方法
public void changeStateInSomeSpecificWay() {
    switch (state) {
    case INITIAL_STATE:
        someAction();
        state = SOME_STATE;
        break;
    case SOME_STATE:
        someOtherAction();
        state = INITIAL_STATE;
        break;
    case OTHER_STATE:
        someThirdAction();
        state = INITIAL_STATE;
        break;
    default:
        throw new IllegalStateException("Unexpected state " + state);
    }
}