黒丸が開始疑似状態、黒二重丸が終了状態である。
これはプリンタの状態マシン図である。この図から以下のことが読み取れる
- 状態マシンがスタートすると、電源ON状態になり、電源LED点灯したあと、待機中になる。
- 待機中のときに、印刷要求が起きると、印刷中になる。
- 印刷中になると、「印刷する」を開始し、それが終了すると、自動的に待機中に戻る。
- 電源ON状態ではいつでも、電源OFF要求が起きると、電源LED消灯したあと、終了状態に遷移する。
- 電源OFF要求が起きると、待機中であれば、直ちに、終了状態に遷移する。
- 電源OFF要求が起きると、印刷中であれば、「印刷する」を直ちに中断して、終了状態に遷移する。印刷の終了を待つことはない。
UMLでは、終了状態は以下の特徴を持つと決められている。
- 終了状態を起点とする遷移は設定することができない。
- 入場時アクション、退場時アクション、doアクティビティを設定することができない。
- 内部遷移を設定することができない。
次に、上の状態マシンを拡張して、印刷中状態に、サブ状態を設定し、その領域に3つの状態を追加してみよう。
印刷中のサブ状態には、領域が1つあって、その領域には終了状態がある。領域に終了状態があるときは、そこからどこにも遷移しない、という意味ではなく、 その領域が終了した、という意味に変わる。印刷中状態には領域が1つしかないので、その領域が終了したら、印刷中状態が終了したことを意味する。そうする と、ヌル遷移をたどって、待機中に遷移する。
一方、電源ON状態であれば、いつでも、電源OFF要求が有効であり、最上位の終了状態に遷移する。そこに遷移すると、そこからはもう、どこへも遷移できない。
整理すると、
- 最上位で、終了状態に遷移すると、もうどこにも遷移できない。
- 状態がサブ状態を持ち、そのサブ状態が領域を持っていて、そこに終了状態がある場合は、その終了状態に遷移すると、その領域が終了したことを意味する。
- 状態のもつすべての領域が終了したら、その状態が終了したことになり、その状態を起点とするヌル遷移が発火して、その状態を抜けてくる。
印刷中状態を起点とするヌル遷移があるが、これは、印刷中に入場したら、ただちに退場してくる、という意味ではなく、印刷中の終了状態に遷移するまで、ヌル遷移が発火しないことを意味する。
つまり、終了状態が、最上位にあるのか、領域にあるのかで、振る舞いが変わる。
次に、UMLの定義を確認しよう。UML2.0 State Machine (状態機械) モデルでは、節点には疑似状態と状態があり、最終状態(終了状態)は状態である。最終状態(終了状態)は疑似状態ではない。
まとめると、終了状態は、以下のような状態である。
- 終了状態を起点とする遷移は設定することはできない。
- 終了状態を含む領域を含む状態には、その状態を起点とする遷移を設定することができ、その遷移にはイベントを設定できる。ヌル遷移に設定することもできる。
- 2のような終了状態には、他の状態と同様、とどまることができ、イベントを待ち受けることができる。
関連記事
- [状態マシン図] 終了同期を取る
http://qiita.com/saltheads/items/f49e7418bb3034949bad