04

01

[状態マシン図] UML2.0 仕様の細かな注意点

2014.04.01(07:27)

状態マシン図を勉強している中級者以上向けに、細かな注意点をいくつか説明しておこう。

(1) 領域は名前空間を継承している。
直交状態で、互いに直交している領域に、同じ名前の状態があっても良いことになっている。
それは領域に名前をつけて区別できるからである。

上位状態の名前:領域の名前:領域内の下位状態の名前、
というふうに名前空間がつくので、「領域内の下位状態の名前」が互いに同じでも良い。
領域に名前をつける工夫をすることで、凝集度が高いモデルが作れる可能性がある。
astah*は、領域に名前が付けられなくて、ちょっと残念。

フルパスの名前空間は読むと長いので、レビューしやくするためには、
やはり、上位下位を含めすべての状態に別の名前をつけるのがおススメ。


01_region_inherites_namespace.png


(2) 内部遷移は、状態が保有するのではなく、領域が保有する。
astah*では、内部遷移は、状態が保有している。
UML2.0仕様では、状態が保有する遷移は存在せず、領域が保有する遷移しか存在しない。
つまり、内部遷移は、状態が保有する領域が遷移を保有するしかない。
このように決まってはいるが、実用上は、状態が保有していれば十分なので、
この点は、ツールの実装仕様で良い。

02_internal_transition.png

内部遷移は遷移の仲間ではあるが、sourceやtargetとする節点はどこかなど、
気にしてはいけない。領域は節点ではない。

また、状態が保有する遅延トリガは、ツールでサポートされておらず、扱いが難しいので、
遅延トリガは使わずに分析、設計する。

(3) 遷移1本に、トリガは複数設定できる。
astah*では、遷移1本にトリガは0個か1個であって、2個以上は設定できないことに
なっている。これはこのほうがシンプルで統一的でわかりやすい。
この点も、ツールの実装仕様で良い。
たとえ、UMLでできるからと言って、1本の遷移に2つ以上のトリガを設定しないこと。

03_transition_has_many_triggers.png

(4) 最終状態は、疑似状態の仲間ではなく、状態を継承している。
図を描画しているときは、疑似状態か状態かあまり意識しないが、
実際の動きとしては、最終状態は状態の仲間であり、
・最終状態を起点とする遷移を持てない。
・入場時アクションなどを持てない。
など多くの制約付きの状態であるが、状態のサブ状態にある最終状態であれば、
イベントを受け取れるし、タイムアウトもできることを知っておく。

04_final_state.png

(5) 遷移は名前空間を継承している。
コード生成するときは、もちろん遷移1本ずつ違う名前が必要。
これは分析モデル作成時には不要なので気にしないで良い。

05_transition_inherits_namespace.png

(6) ジャンクション疑似状態も、選択疑似状態も、
2つ以上の入力、2つ以上の出力を同時に持てる

06_junction_choice.png

UML仕様上は、ジャンクション疑似状態、選択疑似状態ともに、複数入力、複数出力できるので、
以下のような状態マシン図も描ける。しかしこれはとてもわかりにくいので避ける。
たとえUMLでできるからといってやらないこと。状態マシン図はフローチャートではない。

ジャンクション疑似状態は、1出力のみ、
選択疑似状態は、1入力、2出力のみ。2出力の片方は必ず[else]、という規約をチームで決めておこう。

071_junction_choice.png

上のジャンクション疑似状態は、以下のモデルと同等の振る舞いをする。

072_junction_choice.png

上の選択疑似状態は、以下のモデルと同等の振る舞いをする。
状態を起点とする完了遷移(明示的なイベントが設定されていない遷移)はただちに発火する。

073_junction_choice.png
モデルはわかりやすく描こう。


参考リンク
  1. UML2.4.1仕様
    http://www.omg.org/spec/UML/2.4.1/
  2. [状態マシン図] UML2.0 状態機械 モデル
    http://saltheads.blog134.fc2.com/blog-entry-138.html
プロフィール

島敏博

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