連載第8-1回
UMLの基礎と応用
(株)NTTデータ 技術開発本部 副本部長
山本修一郎
状態図は、システムの動的な構造を表すために記述する振舞い図の一つである。UMLの状態図はハレルが複雑な実時間システムを形式的に記述するために1987年に提案した状態図(Statechart)の記法に基づ状態遷移図に対する状態図の主な拡張点は、複数の状態からなる複合状態を導入することにより、状態を階層化できること、並行性を表現できることである。とくにイベントに対して応答するような複雑な実時間システムの仕様を階層的な状態図を用いて視覚的に記述することができる。
以下では、まず状態図の位置付けや構成要素について説明する。次いでROSEを用いて状態図を作成してみよう。また状態図を作成する上での課題などについて考えてみる。
■状態図の例
前回紹介した酒類販売に関する、在庫管理システムの出庫指示クラスに対する状態図の例を図1に示そう。
図1 出庫指示クラスに対する状態図の例
この図から分かるように、状態図の基本的な構成要素には、状態、状態遷移、イベント、アクションがある。状態の特別な場合として、開始状態と終了状態がある。以下では、状態図の構成要素について説明する。
■状態図の構成要素[3] [4] [5]
(1)状態
状態は活動中のオブジェクトの状況を表している。たとえば、オブジェクトがある条件を満足している状態、ある動作を実行している状態、あるイベントを待っている状態などがある。複数の状態をひとつの複合状態にまとめることができる。状態図で詳細化されている状態が複合状態である。UML1.2までは詳細な状態図を持つことから、複合状態はスーパー状態と呼ばれていた。
状態には名前区画と内部遷移区画がある。名前区画に名前のない状態は匿名状態である。匿名状態もすべて異なる独立の状態であることに注意する。
ところでUMLガイドブック[6]は1997年に出た本なので、UML1.0ベースで記述されており、状態には名前区画、状態変数区画とアクティビティ区画があるとしている。UML1.3に基づくUMLユーザーガイドでは状態変数の区画については削除されている。UML1.4でも、状態変数の区画が削除されているので注意しておく。
内部遷移区画にはアクションを次の構文で記述する。
[構文] アクションラベル/アクション
UMLで予約されているアクションラベルには、entry、exit、do、includeがある。
entry:状態の入口で実行されるアクションを示す
exit:状態の出口で実行されるアクションを示す
do:状態で実行されるアクションを示す
include:状態を詳細化している状態機械を呼び出すことを示す
アクションラベルは、/の右に記述されたアクションを起動するイベントを示している。これらのイベントは状態内部での遷移になるので、状態の出入りをのぞけば意味的には自分自身の状態への遷移と同じである。
[構文] イベント
イベント名(引数並び)[ガード式]/アクション式
ここで、引数並びとガード式は省略しても良い。ガード式はイベントが発生されたときに1度だけ評価される。ガード式の値は真か偽のいずれかである。アクション式は、状態遷移が発生したときに実行される操作のリストである。アクション式の区切り記号はカンマである。
(2)複合状態(Composite State)
複数の並行状態あるいは相互に排他的な複数の状態のいずれかに分解される状態を複合状態という。UMLでは点線で複合状態の領域を分割することにより並行状態にある部分状態を表す。それぞれの部分状態にはさらに複数の状態が含まれていても良い。
(3)イベント(Event)
イベントにより状態遷移が実行される契機を定義する。イベントの発生契機には次のような種類がある。
・条件式が真となる
・指定されたシグナルを受信する
・オブジェクトの操作が呼び出される
・指定された時間が経過する
例:after(10 seconds)
・指定された時間に到達する
例:when(date=Mar.4,2002)
イベントの一種にシグナル(signal)がある。あるオブジェクトから非同期に送信された後で、他のオブジェクトによって受信される名前を持つオブジェクトがシグナルである。シグナルには引数を持たせることもできる。
(4)状態遷移(Tran sition)
状態遷移は、2つの状態間の関係である。現在の状態で、ある条件に基づくイベントが発生すると、次の状態に遷移し、指定されたアクションを実行する。このとき、状態遷移が発火するという。
(5)並行遷移(Concurrent Transition)
並行遷移では複数の現在状態から、複数の次状態へ遷移することができる。並行遷移により同期や並行スレッドへの分岐を記述できる。並行遷移ではすべての並行遷移元の状態が現在状態になった時点で、すべての遷移先の状態が次の現在状態になる。
(6)複合状態に関する状態遷移
複合状態の境界への遷移は、複合状態の内部の初期状態への遷移とみなされる。もし並行状態なら、並行領域のすべての初期状態への遷移になる。複合状態からの遷移は状態領
域の内部からの遷移になる。状態遷移を任意の深さにある状態に対して記述できる。
(7)履歴標識(History indicator)
状態領域には、Hを円で囲んだ履歴標識を配置できる。履歴標識は外部からの入力遷移を何個でも持つことができる。また履歴標識は高々1個の出力遷移を持つ。これは省略時の直前の状態を表す。履歴標識への遷移が発生すると、複合状態で最後に持っていた状態に戻ることを示す。履歴は、履歴マークが表示されている複合状態に適用される。また、ネストされた状態の最下層レベルに履歴標識を適用する場合にはH*を円で囲んで示す。
(8)状態遷移の分岐と合流
状態遷移は異なる2 つの状態を接続しているが、過渡的な状態間の遷移の場合もある。このような過渡的な一連の状態間の遷移を複合遷移と呼ぶ。複数の複合遷移が共通の状態遷移の系列を含んでいて同じ状態に合流することがある。また遷移を相互に排他的な遷移に分岐させる必要があることもある。これらの遷移の分岐や合流をもちいることで状態遷移図を単純化できる。
ただし、状態遷移の分岐と合流は、並行処理ではないので、並行遷移における同期状態に関するフォークやジョインとは異なることに注意する必要がある。
(9)同期状態
同期状態により状態機械の並行領域の同期をとることができる。フォークとジョインとともに同期状態を用いる。一方の並行領域からのフォークが他の並行領域へのジョインに結合するときに同期状態を利用するのである。同期状態から出ていく遷移数の上限を、同期状態に入ってくる遷移と出ていく遷移の数の差で指定することができる。
内部に上限を表す正の整数かアスタリスク(*)を持つ小さな円で同期状態を表す。同期が必要な2つの並行領域の境界を表す点線の上に同期状態を示す円を記述する。以上で説明した状態図の構成要素を表1にまとめる。表1では、ROSEで利用できる要素も示している。△記号で示した要素についてはROSEでは用意されていないが、これらの表記がなくても、同じ内容を表現できることを表す。たとえば、並行領域を区切る点線はなくても並行して存在する複数の状態を表現することはできる。
表1 状態図の構成要素