您如何实现 FSM(编辑:有限状态机)状态?我通常认为 FSM 像一组函数、一个调度程序和一个线程来指示当前的运行状态。意思是,我确实阻止了对代表状态的函数/函子的调用。
刚才我以不同的风格实现了一个,我仍然用函数(对象)表示状态,但是线程只是调用一个state->step()
方法,它试图尽快返回。如果状态已经完成并且应该发生转换,它会相应地指示。我将其称为“轮询”样式,因为这些函数大多看起来像:
void step()
{
if(!HaveReachedGoal)
{
doWhateverNecessary();
return; // get out as fast as possible
}
// ... test perhaps some more subgoals
indicateTransition();
}
我知道它是 FSM 中的 FSM。
感觉比较简单,但是有一定的优势。虽然线程被阻塞或处于某种
while (!CanGoForward)checkGoForward();
循环中可能很麻烦且笨拙,但轮询感觉更容易调试。那是因为FSM
对象在每一步之后都会重新获得控制权,并且发布一些调试信息是轻而易举的事。
好吧,我偏离了我的问题:你如何实现FSM 的状态?