[状態マシン図] UML2.0 状態機械 モデル 

UML2.0 (UML2.4.1) State Machine (状態機械) モデル

UML状態機械は、その仕様がクラス図を使って定義されている。

![uml241_state_machine_class2.png](https://qiita-image-store.s3.amazonaws.com/0/11188/7ebb964f-620c-738a-93af-8a61841d16a8.png)


この図を読んでみよう。
読む前に、クラス図での多重度のおさらい。

| 多重度 | 意味 |
|:----------:|:-----------:|
| 1 | 1個のみ |
| * | 0個以上 |
| 0..* | 0個以上 |
| 0..1 | 0個か1個 |
| 1..* | 1個以上 |

＊が0個以上と読めればとりあえずOK。

1. まず、図の上側中央、状態機械から領域に延びる関連を見る。（以下同様にクラスをたどる）
1. 状態機械は領域を１つ以上もっている。
1. 領域は、０個以上の節点と、０個以上の遷移をもっている。
1. 節点のなかまには、疑似状態と状態がある。（2.と合わせて、領域には０個以上の状態がある）
1. 節点には、入ってくる遷移が複数と、出てゆく遷移が複数ある。１つの遷移にはソース（遷移元）の接点と、ターゲット（遷移先）の接点がある。
1. 入ってくる遷移も出てゆく遷移もないような節点はありえないが、クラス図の多重度表現では複数の多重度にまたがる制約は表現できない。
1. 遷移には、ガードが０個か１個ある。
1. つぎに状態を見る。
1. 状態は、内部にインスタンス変数があり、合成状態かどうか、合成直交状態かどうか、単純状態かどうか、サブマシン状態かどうか、それぞれ真偽値をとる。クラス図には表現できないが、全部の場合があるわけではなく、たとえば、単純状態と合成状態とサブマシン状態は排他的である。合成状態は、合成直交状態でない場合（領域が１個だけ）と合成直交状態（領域が複数）である場合とある。
1. 状態には領域が０個以上ある。
1. 状態には、入場振る舞いが０個か１個ある。退場振る舞いとdoアクティビティも同様。
1. 最終状態は、状態のなかまである。
1. 状態は、たくさんの疑似状態を含んでいる。開始疑似状態など。
1. 状態がサブマシン状態を含む場合（親の場合）と、サブマシン状態であった場合（子の場合）を見る。
1. 状態から左下に出て左端を上昇し状態機械へ入っている関連を見る。
1. 状態は０個か１個の状態機械を持つ。
1. 状態機械を持っているとき、その役割名は、サブマシンである。
1. サブマシンである、状態機械には、１つ以上の領域がある。(領域は2.へ）
1. 状態は、connectionPoint 接続点を０個以上持てる。接続点は疑似状態であって、入場点や退場点などである。
1. 状態機械も、connectionPoint 接続点を０個以上持てる。接続点は疑似状態であって、入場点や退場点などである。
1. 状態は connection 接続点参照を複数もつことがある。
1. 「接続点参照は、下位機械の状態から参照される状態機械内で定義される入場／退場点の使用を表す」ものである親子間のリンクである。親と子の間で互いに参照できる関係がある、という意味であろう。
1. １つの接続点参照は、０個以上複数の入場点と、０個以上複数の退場点を持てる。

読めたであろうか。

次に、以下は上のクラス図から抜粋した図である。２通りのComposite Patternが見つけられる。

まず１つめ。

![uml20_state_machine_composite1.png](https://qiita-image-store.s3.amazonaws.com/0/11188/107781bf-5304-addd-29ef-bf0bc15af6ad.png)

状態は領域を０個以上持ち、
領域は節点を０個以上持ち、
節点の仲間に状態がある。

領域が０個

![10_simple_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/6c918e63-ef08-e9d2-1a90-3b6c98af5f1e.png)

領域が１個

![20_composite_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/0081d612-1aa4-c235-4938-c6935dadcfb0.png)

領域が２個

![30_orthogonal_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/8640bff4-b549-cc90-7ce9-84926ba9ccc4.png)

２つめ

![uml20_state_machine_composite2.png](https://qiita-image-store.s3.amazonaws.com/0/11188/1995e913-bee9-bbf7-c82e-c6c320096fb6.png)

状態は０個か１個の状態機械を持ち、その名前はサブマシン
状態機械は１個以上の領域を持ち、領域は０個以上の節点を持ち、節点の仲間に状態がある。

サブマシンを持つ状態

![40_submachine_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/7b8bd5a8-66cc-be42-a9f1-ef8da21dc3d4.png)

最終状態にも注目

![uml20_final.png](https://qiita-image-store.s3.amazonaws.com/0/11188/1ed40fc1-e116-0fba-2fb0-c7f9a3cfa8cf.png)

クラス図を読むと、最終状態は状態であって、疑似状態ではないことがわかる。最終状態には以下のような制約がある。

+ 最終状態を起点とする遷移は持てない。
+ 入場時アクション、退場時アクション、doアクティビティを持てない。
+ 領域は持てない。サブマシンも持てない。

最終状態に入った時、含まれる領域が完了する。

![uml20_final.png](https://qiita-image-store.s3.amazonaws.com/0/11188/dda5066e-e3b2-4b83-2f9f-39afb7d2041f.png)

状態２でトリガー４がおきると最終状態に遷移し、状態１の内部にある領域は完了する。でも、その上位はまだ完了しておらず、そのあと、トリガー５がおきると状態３に遷移する。そのあと、トリガー６がおきるとすべての領域が完了して状態機械全体が終了する。

ということは、こんなふうに考えればよいということになる。最終状態にいて、トリガー５を待っている状態になる。このように、領域の中の最終状態では、領域を含む上位の状態で発火するトリガーを待っていることがわかる。状態の下位にある最終状態はシステムの終わりではない。

---

参考文献

1. [書籍] UML2.0仕様書 状態機械<br>http://bit.ly/1hMuEEt
1. OMG UML specification<br>http://www.omg.org/spec/UML/