04
14
[状態マシン図] 直交状態
2014.04.14(23:49)
状態は内部に領域を0個以上持つことができる。以下の図で、状態2は領域を1つ持っていて、その領域には開始疑似状態があり、状態3から始まる。状態2にいるときは、状態3か状態4のどちらかの状態を取る。そのことを状態3 or 状態4という。状態3と状態4はどちらか一方しか取ることができないという意味で、このことを OR状態という。状態2にいるときは、状態3 or 状態4である。

次の図では、状態2には2つの領域があり、状態2に遷移すると、2つの領域が同時並行して動作するようになる。直交合成状態と言い、2つの領域が直交している、という。
状態1からイベント2で状態2に遷移したときは、
上側の領域は、状態3から始まり、
下側の領域は、状態5から始まる。
その状態を、状態3 and 状態5の状態という。つまり、状態3かつ状態5の状態であり、このことをAND状態という。

上の図と同じことを、直交状態を使わずに表現したのが次の図である。
状態2は、状態3and5の状態から始まる。そこからイベント4が起きると、状態4and5の状態に遷移する。
上の図は、状態2の内部に、領域が2つあって、上の領域は2つ、下の領域は3つの状態を持っている。
下の図は、状態2の内部に、領域が2つあって、状態が2x3=6つの状態がある。
このように、直交状態の複数の領域を1つの領域になおすと、それぞれの領域が持つ状態のかけ算だけ、状態があることがわかる。
またこういうことも言える。上の図の状態マシンをテストする場合は、下の図のすべてを遷移するテストを書く必要がある、ということである。直交する領域が増えれば増えるほど、描くのは 簡単だが、テストがたいへんになる、ともいえる。

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

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

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

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

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

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

次の図では、状態2には2つの領域があり、状態2に遷移すると、2つの領域が同時並行して動作するようになる。直交合成状態と言い、2つの領域が直交している、という。
状態1からイベント2で状態2に遷移したときは、
上側の領域は、状態3から始まり、
下側の領域は、状態5から始まる。
その状態を、状態3 and 状態5の状態という。つまり、状態3かつ状態5の状態であり、このことをAND状態という。

上の図と同じことを、直交状態を使わずに表現したのが次の図である。
状態2は、状態3and5の状態から始まる。そこからイベント4が起きると、状態4and5の状態に遷移する。
上の図は、状態2の内部に、領域が2つあって、上の領域は2つ、下の領域は3つの状態を持っている。
下の図は、状態2の内部に、領域が2つあって、状態が2x3=6つの状態がある。
このように、直交状態の複数の領域を1つの領域になおすと、それぞれの領域が持つ状態のかけ算だけ、状態があることがわかる。
またこういうことも言える。上の図の状態マシンをテストする場合は、下の図のすべてを遷移するテストを書く必要がある、ということである。直交する領域が増えれば増えるほど、描くのは 簡単だが、テストがたいへんになる、ともいえる。

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

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

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

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

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

説明用に、直交状態を使わない例をあげたが、状態の数が増え、同じイベントがたくさんの箇所にあらわれ、非常に読みにくく間違えやすいモデルになるので、理屈がわかったら、素直に直交状態を使って設計してほしい。
参考文献
- UML2.0仕様書
http://www.amazon.co.jp/dp/4274066630/
p.723 遷移実行系列 「直交する状態の領域を横断する遷移は、全直交状態からの退場と、すべての領域への再入場を強制する」