web-dev-qa-db-ja.com

状態機械で状態を繰り返す

必要なときに何かをrestartする必要がある(ハードウェアを再起動するなど)必要がある状態マシンがあります。しかし、再起動後、Thingでいくつかのテストを実行する必要があります。テストが失敗した場合、物事を停止し、失敗ステータスで状態マシンを終了する必要があります。

失敗した場合、2回目の停止をどのように処理すればよいですか?ステートマシン図は、次のようにすると読みにくくなります。そして、以前の状態に基づいてStop thing状態の出力を決定する必要があるため、実装は醜くなります(最初にSUCCESS、テストに失敗して状態に達した場合はERROR)。

Option1

私の他のオプションは、次のようにStop thing状態の2番目のインスタンスを作成することです。しかし、それは状態マシンをより大きくします

Option2

これらのうちどれが正しいアプローチですか?または、これらの種類の問題に取り組む別の方法はありますか?

ここで重要な場合は、ステートマシンの実装にROSsmachを使用しています

4

最初のステートマシンは、記述した望ましい動作を正確に反映していません。最初のステートマシンでは、テストが成功するか停止に失敗するまで、「もの」を再起動するために再試行を続けます。

2番目のステートマシンdoesは、「もの」を1回再起動して、テストが失敗したときに再び停止するという望ましい動作を示します。

状態は、その状態で実行されるアクションによって定義されるのではなく、状態から出る遷移によって定義されることに注意してください。これは、状態がどのように到達したかを知る必要がないことも意味します。状態に至るまでのパスが、その状態がイベントにどのように反応するかに関連している場合、それは実際には複数の状態です。 Stop thing 1Stop thing 2の遷移は完全に異なるため、同じアクションを実行し、同じイベントに(異なる方法で)応答する場合でも、2つの異なる状態としてモデル化することは完全に正しいことです。