FSM(EDIT:Finite State Machine)状態をどのように実装しますか?私は通常、FSMを一連の関数、ディスパッチャー、スレッドのように、現在の実行状態を示すものと考えています。つまり、状態を表す関数/ファンクターへの呼び出しをブロックします。
ちょうど今、私は別のスタイルで1つを実装しました。ここでは、関数(オブジェクト)で状態を表しますが、スレッドは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の状態をどのように実装しますか?