04

14

[状態マシン図] 直交状態

2014.04.14(23:49)

状態は内部に領域を0個以上持つことができる。以下の図で、状態2は領域を1つ持っていて、その領域には開始疑似状態があり、状態3から始まる。状態2にいるときは、状態3か状態4のどちらかの状態を取る。そのことを状態3 or 状態4という。状態3と状態4はどちらか一方しか取ることができないという意味で、このことを OR状態という。状態2にいるときは、状態3 or 状態4である。

orth341.png

次の図では、状態2には2つの領域があり、状態2に遷移すると、2つの領域が同時並行して動作するようになる。直交合成状態と言い、2つの領域が直交している、という。

状態1からイベント2で状態2に遷移したときは、
上側の領域は、状態3から始まり、
下側の領域は、状態5から始まる。
その状態を、状態3 and 状態5の状態という。つまり、状態3かつ状態5の状態であり、このことをAND状態という。
orth342.png

上の図と同じことを、直交状態を使わずに表現したのが次の図である。
状態2は、状態3and5の状態から始まる。そこからイベント4が起きると、状態4and5の状態に遷移する。
上の図は、状態2の内部に、領域が2つあって、上の領域は2つ、下の領域は3つの状態を持っている。
下の図は、状態2の内部に、領域が2つあって、状態が2x3=6つの状態がある。
このように、直交状態の複数の領域を1つの領域になおすと、それぞれの領域が持つ状態のかけ算だけ、状態があることがわかる。

またこういうことも言える。上の図の状態マシンをテストする場合は、下の図のすべてを遷移するテストを書く必要がある、ということである。直交する領域が増えれば増えるほど、描くのは 簡単だが、テストがたいへんになる、ともいえる。

orth343.png

状態の外から、状態の中の領域の中の状態に直接遷移することもできる。
下の図で、状態1にいるときに、イベント4がおきると、状態4に遷移する。
そのときは、下の領域は、開始疑似状態から始まって、状態5になる。
つまり、イベント4が起きると、状態2の、状態4and5から始まる。

入ることができれば、出ることもできる。
下の図で、状態7にいるときに、イベント1が起きると、状態1に遷移する。
そのとき上の領域は、状態3にいても、状態4にいても、状態2を退場して、状態1に遷移する。

orth344.png

このことを、直交状態を使わない図で描くと以下のようになる。
合っているかどうか確かめてほしい。

orth345.png

さらに特殊な例として、直交する領域を横断するような遷移を描くこともできる。下の図で、状態4にいるときに、イベント9が起きたら、状態6に遷移する。

orth346.png

直交する領域をまたがる遷移が発火するときは、その領域を含む状態を退場して、再度、入場すると解釈すると決められている。つまり、上の図は、下の図と解釈される。

orth347.png

状態6に入るのだから、上側の領域は開始疑似状態から始まり、状態3に遷移する。このことを、直交状態を使わない図で描くと以下のようになる。状態5でも、状態6でも、状態7でも、状態4であるときにイベント9が起きると、状態3and6に遷移する。これも合っているかどうか確かめてほしい。

orth348.png

説明用に、直交状態を使わない例をあげたが、状態の数が増え、同じイベントがたくさんの箇所にあらわれ、非常に読みにくく間違えやすいモデルになるので、理屈がわかったら、素直に直交状態を使って設計してほしい。

参考文献
  1. UML2.0仕様書
    http://www.amazon.co.jp/dp/4274066630/
    p.723 遷移実行系列 「直交する状態の領域を横断する遷移は、全直交状態からの退場と、すべての領域への再入場を強制する」
プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示