状態モデリングとステートチャート図のわな(前編)UML BASIC LECTURE(3/4 ページ)

» 2004年10月08日 12時00分 公開
[羽生田栄一(取締役会長), 岡村敦彦,豆蔵]

 クラス図は、考え得る動的な振る舞いを包括した構造をダイヤグラムとして表現しますが、それがいかなるケースで何が有効なのか、といった事柄に関しては説明しません。そこで、動的な振る舞いを表現するダイヤグラムとしてステートチャート図を導入する必要があります。前編ではクラス図のあいまいさを明らかにしましたが、後編ではいよいよステートチャート図の詳細について解説していきます。(アットマーク・アイティ編集局)

ステートチャート図

 先ほどの例にもあるように、クラスはその実体であるオブジェクトとしてのライフサイクルを管理するために状態を持つことができます。そうした状態を持つクラスを表現するのがステートチャート図です。オブジェクト指向開発ではいろいろなオブジェクトがほかのオブジェクトと協調しながらある仕事を実現するので、通常はそうしたオブジェクト間の静的構造の関係や動的なコラボレーションを表現するためにUMLが使われるのですが、ステートチャート図の場合はちょっと視点が変わります。ほかのオブジェクトやクラスとの関係というよりは、1つのオブジェクトに注目して図を描くことになります。

ステートチャート図の落とし穴

 ステートチャート図を描く主な目的は、以下のようなことを表現したい場合です。

あるべき状態

オブジェクトとして、どんな状態を取り得るのか。それらの状態によりオブジェクトの振る舞いは変化するか

状態間の遷移

それらの状態はどこからどこへ遷移するのか。そのときのきっかけや制約は何か

遷移に伴うアクション

状態遷移に伴ってどのようなアクション(操作)を実行するのか

ステートチャート図の始めと終わり

 今回は遷移に関する落とし穴を考えてみます。下の図を見てください。これは、役者というオブジェクトのライフサイクルを状態マシンとして記述しているUML図、つまりステートチャート図です。黒丸で始まり、目玉マークで終わっていますね。これらはともに、ニセモノの状態いわゆる疑似状態(pseudo state)です。黒丸が開始疑似状態、目玉が終了疑似状態を表しますが、実際に状態マシンは,開始疑似状態からの遷移中に生成され、終了疑似状態への遷移中に消滅します。

 ですから、開始疑似状態も終了疑似状態もこのオブジェクトが決して取ることのできない永遠にたどり着けない「状態」つまり疑似状態なのです。状態遷移をトリガするイベントは必ず「状態マシン」としてのオブジェクトが発行するわけですから、まだ状態マシンの存在していないはずの開始疑似状態からの遷移にはイベントは定義できません(ただし、その遷移が状態にたどり着くまでには状態マシンは生成済みなので、遷移に対応するアクションは定義できます)。逆に、最終疑似状態へ至る遷移にはそれをトリガするイベントが定義されている必要があります。

ALT 図4 ステートチャート図

自己遷移と内部遷移(Self Transition and Internal transition)

 この図では、公演中の役者が、休演日のときは体を休める、ということを「休演日」というイベントによる「体を休める」というアクションで表現しようとしています。一見したところ特に問題はなさそうです。ただしここでちょっと考えてみましょう。状態には入状時のアクションと退状時のアクション、つまりその状態に入るときに必ず行われる振る舞いとその状態から出るときに必ず行われる振る舞いを記述することができることを思い出してください。公演中になるときと公演中ではなくなるときに必要な振る舞いを考えてみます。

entry / 舞台の仕込み

exit / 舞台の取り壊し

 稽古(けいこ)中から公演を開始するためには、舞台の道具やセットのための仕込みが必要で、公演が終了したときには、その舞台を取り壊す必要があります。

 これを公演中の状態にある役者のアクションとして考えた場合、先ほどのモデルでは何が起こるのでしょうか。まず休演日イベントにより遷移が発生しますが、自己遷移なので遷移先は同じ状態、つまり公演中になります。ここで重要なのは、遷移は公演中の状態をいったん出て、再度公演中の状態に入るということです。何をいっているのかといえば、その都度 entry アクションと exit アクションが起動されることを意味します。つまりこのモデルでは、休演日になって休息を取るたびに舞台の仕込みと舞台の取り壊しをしなければならない、ということになってしまいます。これではいくらなんでも面倒ですよね。

 このように、状態が変わらないときにも発生する何らかのイベントによるアクションをモデル化したいときに、ついこうした自己遷移を使ってしまうことがあります。その場合には状態からの入退状によるアクションが発生することに気を付けなければなりません。そうしたアクションが不要な場合には、内部遷移コンパートメントにイベントを記述します。

ALT 図5 内部遷移コンパートメントにイベントを記述する

 こう記述しておけば、状態から出る必要はありませんし、イベントに対するアクションも表現できます。

 今回のモデルにおいて自己遷移が適用できるケースは、例えば公演中に劇場が変わるような全国公演の場合などが相当するでしょう。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ