状態マシンを設計していて、何か2つのことを同時並行しておこない、両方が終了したら、次の状態に遷移したい、というモデルを作りたいことがある。
そのときに、直交状態+終了状態+完了遷移を組み合わせるとうまく実現できる。
状態21と状態22が直交していて、両方が終了状態まで到達したときに、状態9に遷移する。
このように、内部に直交する領域が複数ある場合は、すべての領域が終了状態になったときに、その状態が終了状態となると決められている。
その領域が終了状態なったかどうかは、以下のアルゴリズムで判断する。
- その状態が単純状態であった場合は、入場時アクションを実行終わったところで、終了状態に到達している。
- その状態が複合状態(コンポジット状態)であった場合は、
1つまたは複数ある領域(==状態)のすべてが終了状態に到達しているときに、終了状態となる。 - その領域に終了状態が1つ以上ある場合は、いずれかの終了状態に到達しているならば、終了状態である。
- その領域に終了状態が1つもない場合は、1と同じ。
このため、以下の場合は、
この場合は、領域23は状態10と状態11のどちらにいても終了状態であると判断され、状態2にいればIS_IN(状態23が終了状態)は常にTRUEとなり、流れは上のモデルと同じく、状態21と状態22がともに終了状態に到達したときに、状態9に遷移する。
直交合成状態で説明したが、サブマシンを持つ場合でも同様である。
参考文献
- UML2.0 仕様書
http://www.amazon.co.jp/dp/4274066630/
p.723 完了遷移と完了イベント