天哪,它没有看起来那么复杂。状态机代码非常简单和简短。
将状态存储在一个变量中,让我们说myState。
你的状态机将是一个switch语句,分支myState变量的值来为每个状态执行代码。
的代码将出现类似这样的行:
myState = newState;
要强制状态转变的要求,你需要添加一个名为而不是小的方法,这样
void DoSafeStateTransition(int newState)
{
// check myState -. newState is not forbidden
// lots of ways to do this
// perhaps nested switch statement
switch(myState) {
…
case X: switch(newState)
case A: case B: case Z: HorribleError(newState);
break;
...
}
// check that newState is not undetermined
switch(newState) {
// all the determined states
case A: case B: case C … case Z: myState = newState; break;
default: HorribleError(newState);
}
}
void HorribleError(int newState)
{ printf("Attempt to go from %d to %d - disallowed\n",
myState, newState);
exit(1);
}
我认为,这简单而短小的检查将比单元测试做得更好 - 它肯定会更快!
单元测试的重点在于测试代码比测试代码更简单,因此可以更容易地检查测试代码的正确性,然后用于测试复杂的代码。检查状态机代码通常比状态机测试代码更容易。报告100%单元测试通过没有太多意义,当你不知道单元测试是否正确时。
换句话说:编码状态机很简单,设计正确的状态机很困难。单元测试只会告诉你,如果你正确地编码设计,而不是如果设计是正确的。
搜索“国家正规机验证” – bobah 2013-11-28 20:39:15