04

12

[状態マシン図] 終了同期を取る

2014.04.12(23:08)

状態マシンを設計していて、何か2つのことを同時並行しておこない、
両方が終了したら、次の状態に遷移したい、というモデルを作りたいことがある。

そのときに、直交状態+終了状態+完了遷移を組み合わせるとうまく実現できる。

36_state.png

状態21と状態22が直交していて、両方が終了状態まで到達したときに、状態9に遷移する。

このように、内部に直交する領域が複数ある場合は、すべての領域が終了状態になったときに、
その状態が終了状態となると決められている。

その領域が終了状態なったかどうかは、以下のアルゴリズムで判断する。
  1. その状態が単純状態であった場合は、入場時アクションを実行終わったところで、終了状態に到達している。
  2. その状態が複合状態(コンポジット状態)であった場合は、
    1つまたは複数ある領域(==状態)のすべてが終了状態に到達しているときに、終了状態となる。
  3. その領域に終了状態が1つ以上ある場合は、いずれかの終了状態に到達しているならば、終了状態である。
  4. その領域に終了状態が1つもない場合は、1と同じ。

このため、以下の場合は、

37_state.png
この場合は、領域23は状態10と状態11のどちらにいても終了状態であると判断され、
状態2にいればIS_IN(状態23が終了状態)は常にTRUEとなり、流れは上のモデルと同く、
状態21と状態22がともに終了状態に到達したときに、状態9に遷移する。

直交合成状態で説明したが、サブマシンを持つ場合でも同様である。

参考文献
  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リンクの表示