假设我们有一个与几个不同的其他对象接口的复杂类,这些交互取决于彼此的状态。
我会立即尝试使用几个状态布尔值来尝试跟踪这些状态,但这通常会导致代码填满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;
...
}
很容易看出这样的事情会很快失控
答案 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);
}
}