状態マシン図を勉強している中級者以上向けに、細かな注意点をいくつか説明しておこう。
(1) 領域は名前空間を継承している。
直交状態で、互いに直交している領域に、同じ名前の状態があっても良いことになっている。それは領域に名前をつけて区別できるからである。
上位状態の名前:領域の名前:領域内の下位状態の名前、というふうに名前空間がつくので、「領域内の下位状態の名前」が互いに同じでも良い。
領域に名前をつける工夫をすることで、凝集度が高いモデルが作れる可能性がある。astah*は、領域に名前が付けられなくて、ちょっと残念。
フルパスの名前空間は読むと長いので、レビューしやくするためには、
やはり、上位下位を含めすべての状態に別の名前をつけるのがおススメ。
(2) 内部遷移は、状態が保有するのではなく、領域が保有する。astah*では、内部遷移は、状態が保有している。UML2.0仕様では、状態が保有する遷移は存在せず、領域が保有する遷移しか存在しない。
つまり、内部遷移は、状態が保有する領域が遷移を保有するしかない。
このように決まってはいるが、実用上は、状態が保有していれば十分なので、この点は、ツールの実装仕様で良い。
内部遷移は遷移の仲間ではあるが、sourceやtargetとする節点はどこかなど、気にしてはいけない。領域は節点ではない。
また、状態が保有する遅延トリガは、ツールでサポートされておらず、扱いが難しいので、遅延トリガは使わずに分析、設計する。
(3) 遷移1本に、トリガは複数設定できる。
astah*では、遷移1本にトリガは0個か1個であって、2個以上は設定できないことになっている。これはこのほうがシンプルで統一的でわかりやすい。この点も、ツールの実装仕様で良い。
たとえ、UMLでできるからと言って、1本の遷移に2つ以上のトリガを設定しないこと。
(4) 最終状態は、疑似状態の仲間ではなく、状態を継承している。
図を描画しているときは、疑似状態か状態かあまり意識しないが、実際の動きとしては、最終状態は状態の仲間であり、
・最終状態を起点とする遷移を持てない。
・入場時アクションなどを持てない。
など多くの制約付きの状態であるが、状態のサブ状態にある最終状態であれば、イベントを受け取れるし、タイムアウトもできることを知っておく。
(5) 遷移は名前空間を継承している。
コード生成するときは、もちろん遷移1本ずつ違う名前が必要。
これは分析モデル作成時には不要なので気にしないで良い。
(6) ジャンクション疑似状態も、選択疑似状態も、
2つ以上の入力、2つ以上の出力を同時に持てる
UML仕様上は、ジャンクション疑似状態、選択疑似状態ともに、複数入力、複数出力できるので、以下のような状態マシン図も描ける。しかしこれはとてもわかりにくいので避ける。
たとえUMLでできるからといってやらないこと。状態マシン図はフローチャートではない。
ジャンクション疑似状態は、1出力のみ、
選択疑似状態は、1入力、2出力のみ。2出力の片方は必ず[else]、という規約をチームで決めておこう。
上のジャンクション疑似状態は、以下のモデルと同等の振る舞いをする。
上の選択疑似状態は、以下のモデルと同等の振る舞いをする。状態を起点とする完了遷移(明示的なイベントが設定されていない遷移)はただちに発火する。
モデルはわかりやすく描こう。
参考リンク
- UML2.4.1仕様
http://www.omg.org/spec/UML/2.4.1/ - [状態マシン図] UML2.0 状態機械 モデル
http://saltheads.blog134.fc2.com/blog-entry-138.html