2

C# GUI アプリケーションにステート マシンを使用しています。これで、いくつかの状態と、ErrorHappened という 1 つの状態ができました。ステート マシンは、すべての状態からこれらのエラー状態に移行できます。しかし、このアーキテクチャを使用すると、ステート マシンが ErrorHappened 状態になったときにエラーが発生したことがわかります。

しかし、ある状態 A から状態 B への遷移中にエラーが発生した場合、どうすればよいでしょうか? 問題は、ステート マシンがステート A からステート B に移行し、ステート ErrorHappened になることです。通常、状態 B への遷移が完了したときにアクションを実行します。移行中にエラーが発生した場合、このアクションは実行しません。もちろん、m_ErrorHappened のような bool 変数を導入することもできますが、私の意見では、ステート マシンがあるため、ステート変数を使用する必要はありません。

説明が明確であり、助けになることを願っています。

サンプルコード:

StateMachine sm; // initial state is state A

void AtoB() // executed during transition from A to B
{
  if(DoSomething())
  {
    print("Error");
    // Event ErrorHappened, state machine goes into state Error
    sm.GotoState(ErrorHappened); 
  }
}

void TransitionEnd(State NewState)
{
    if(NewState==B)
    {
        GreenLight();
    }

    if(NewState==Error)
    {
        RedLight();
    }
}

main()
{
    sm.GotoState(B);
}

エラーが発生すると、緑色のライトが点灯し、次に赤色のライトが点灯します。ステート マシンが状態 A から状態 B、エラー状態に移行するためです。エラーが検出され、赤いライトだけが点灯する方法はありますか?

4

1 に答える 1

2

ステート マシンの設計を変更して、遷移でエラーが発生しないようにすることもできます。つまり、遷移でエラーが発生しないように設計されていることが保証されます。

遷移中にエラーを許容するモデルと比較して、より多くの状態と遷移を追加する必要がありますが、エラー検出とエラー処理はそこから行われます。

このような設計では、一般的な遷移メカニズムを使用し、任意のカスタム ハンドラーが状態に関連付けられますが、おそらく、表示されているのは遷移に関連付けられたカスタム ハンドラーです (状態の汎用ハンドラーかもしれません。提供されたコード)。

たとえば、A から B への遷移に加えて、A からエラー状態への遷移を追加する必要がある場合があります。その選択は、A のカスタム ハンドラに依存します。または、A と B の間に状態を導入して決定することもできます。エラーがあればBへ、そうでなければエラー状態へ。

于 2015-06-11T20:09:16.223 に答える