LoginSignup
4
3

More than 5 years have passed since last update.

[状態マシン図] 内部遷移 (internal transition)

Posted at

イベントが発生したときに遷移をともなわないアクションを実行させたいときは、内部遷移を設定する。

ガードはあってもなくてもOKだが、アクションがなければ内部遷移を設定する意味がないので、内部遷移にアクションは必ず設定されなければならない。

internal_transition0.png

内部遷移は、astah*,Rhapsodyともにサポートされており、1つの状態に0個以上の内部遷移を設定できる。

internal_transition02.png

内部遷移が複数設定された場合、どれから先に評価されるかはUMLでは決められていない。

内部遷移は自己遷移と異なり、状態を退場入場はしないので、内部遷移がおきても、退場時アクションと入場時アクションは呼び出されない。

内部遷移を使うとLatch Stateパターンが実現できる。まず、Latch Stateパターンを使った例

internal_transition6_orthogonal.png

写真プリンタでは、印刷中に電源オフ要求があっても、インクや紙を無駄にしないよう、すぐには電源オフ処理をしないで、いま印刷している写真を印刷終わってから電源オフ処理を始めたい、という要求がある。

これを内部遷移を使って描きなおすと、

internal_transition5.png

印刷中に電源オフ要求があれば、内部遷移でインスタンス変数byeをtrueにする。印刷が終わったところで、byeがtrueならば電源オフ処理を始める。

このように、内部遷移を使うと、フラグを増やすことになり、わかりにくいモデルになる可能性がある。

フラグが増えると非常にわかりにくいソフトウェアになってしまうことはみなさんご存知のとおりである。内部遷移を使わずに、Latch Stateパターンで実装するのをおすすめする。


参考記事

  1. [状態マシン図] Latch State パターン
    http://qiita.com/saltheads/items/abd039ec2df18bdd7995
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3