03

04

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

2014.03.04(00:11)

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

UML状態機械は、その仕様がクラス図を使って定義されています。
uml241_state_machine_class2.png
この図を読んでみましょう。
読む前に、クラス図での多重度のおさらい。

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

上のクラス図から抜粋した図です。2通りのComposite Patternが見つけられます。

まず1つめ。
uml20_state_machine_composite1.png
  1. 状態は領域を0個以上持ち、
  2. 領域は節点を0個以上持ち、
  3. 節点の仲間に状態がある。
領域が0個
10_simple_state.png
領域が1個
20_composite_state.png
領域が2個
30_orthogonal_state.png

2つめ

uml20_state_machine_composite2.png
  1. 状態は0個か1個の状態機械を持ち、その名前はサブマシン
  2. 状態機械は1個以上の領域を持ち、
  3. 領域は0個以上の節点を持ち、
  4. 節点の仲間に状態がある。
サブマシンを持つ状態
40_submachine_state.png

最終状態にも注目。

uml20_state_machine_final.png
クラス図を読むと最終状態は、状態であって、疑似状態ではないことがわかります。UML仕様を見るとこうなっています。最終状態には以下のような制約があります。
  1. 最終状態を起点とする遷移は持てない。
  2. 入場時アクション、退場時アクション、doアクティビティを持てない。
  3. 領域は持てない。サブマシンも持てない。
最終状態に入った時、含まれる領域が完了します。
uml20_final.png
  1. 状態2でトリガー4がおきると最終状態に遷移し、状態1の内部にある領域は完了する。
  2. でも、その上位はまだ完了しておらず、
  3. そのあと、トリガー5がおきると状態3に遷移する。
  4. そのあと、トリガー6がおきるとすべての領域が完了して
  5. 状態機械全体が終了する。
ということは、こんなふうに考えればよいということになります。
最終状態にいて、トリガー5を待っている状態になる。
このように、領域の中の最終状態では、
領域を含む上位の状態で発火するトリガーを待っていることがわかります。
状態の下位にある最終状態はシステムの終わりではありません

参考文献
  1. [書籍] UML2.0仕様書 状態機械
  2. OMG UML specification
    http://www.omg.org/spec/UML/
プロフィール

島敏博

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リンクの表示