イベントが発生したときに遷移をともなわないアクションを実行させたいときは、内部遷移を設定する。
ガードはあってもなくてもOKだが、アクションがなければ内部遷移を設定する意味がないので、内部遷移にアクションは必ず設定されなければならない。
内部遷移は、astah*,Rhapsodyともにサポートされており、1つの状態に0個以上の内部遷移を設定できる。
内部遷移が複数設定された場合、どれから先に評価されるかはUMLでは決められていない。
内部遷移は自己遷移と異なり、状態を退場入場はしないので、内部遷移がおきても、退場時アクションと入場時アクションは呼び出されない。
内部遷移を使うとLatch Stateパターンが実現できる。まず、Latch Stateパターンを使った例
写真プリンタでは、印刷中に電源オフ要求があっても、インクや紙を無駄にしないよう、すぐには電源オフ処理をしないで、いま印刷している写真を印刷終わってから電源オフ処理を始めたい、という要求がある。
これを内部遷移を使って描きなおすと、
印刷中に電源オフ要求があれば、内部遷移でインスタンス変数byeをtrueにする。印刷が終わったところで、byeがtrueならば電源オフ処理を始める。
このように、内部遷移を使うと、フラグを増やすことになり、わかりにくいモデルになる可能性がある。
フラグが増えると非常にわかりにくいソフトウェアになってしまうことはみなさんご存知のとおりである。内部遷移を使わずに、Latch Stateパターンで実装するのをおすすめする。
参考記事
- [状態マシン図] Latch State パターン
http://qiita.com/saltheads/items/abd039ec2df18bdd7995