ステートマシン図

<< 目次を表示 >>

ページ位置:  UMLのモデリング > UMLのダイアグラム > 振る舞い図 >

ステートマシン図

ステートマシン図では要素(主にクラス)が複数の状態間をどのように遷移するか、および遷移の条件(トリガ)となるものは何か、などを記述します。

 

ステートマシン図からのコード生成については、「ステートマシン図からのソースコード生成」 および 「ハードウェア記述言語(HDL)を対象にしたステートマシン図のモデリング」 のページをご覧ください。

ステートマシン図は、UMLとしての表現のほかに、状態遷移表の形式でも表現することができます。

 

 

名称について

 

 

状態遷移表

ステートマシン図を、状態遷移表の表示形式で表示できます。

変更する手順は次の通りです。

 

#

操作方法

1

ダイアグラムの背景で右クリックします。

2

「状態遷移表」の以下のいずれかの項目を選択します。

  • ステートマシン図
  • 状態遷移表 (状態-次の状態)
  • 状態遷移表 (状態-トリガ)
  • 状態遷移表 (トリガ-状態)

 

 

ダイアグラムの例

下のダイアグラムではステートマシン図の主な要素や接続が利用されています。Saved状態は コンポジット状態 状態であり、中に含まれる状態はサブ状態です。開始状態と終了状態は擬似状態です。

 

下のステートマシン図には、ステートマシン図のモデリングで利用できるいくつかの機能が含まれています。

 

 

子ダイアグラム

上の図のSaved状態の右下には、特別なマークが表示されています。このマークは、状態が子ダイアグラムを保持していることを示しています。

子ダイアグラムを保持している状態について、その内容を表示する方法には2種類あります。1つめの方法は、子ダイアグラムを持つ要素をダブルクリックすることです。これにより、子ダイアグラムに移動し、その内容が表示されます。

 

 

子ダイアグラムには、ダイアグラムフレーム(枠)が表示されます。ダイアグラムの背景で右クリックし、「ダイアグラムフレームの表示」「ダイアグラムフレームの非表示」を実行することで、表示するかどうかを切り替えることができます。

 

あるいは、子ダイアグラムを持つ状態要素(この例ではSaved状態)を右クリックし、「子ダイアグラムの追加 | 子ダイアグラムの中身を表示」 を実行することで、下の図のように子ダイアグラムの内容を表示することができます。

(この表示にする場合には、「ダイアグラムフレームの非表示」を実行し、子ダイアグラム内のダイアグラムフレームは表示しないようにするのがよいでしょう。)

 

 

 

 

プロトコル状態マシン

UMLの仕様では、プロトコル状態マシンは以下のように定義されています。

 

プロトコルステートマシンを作成するには、状態マシン要素を選択し、プロパティサブウィンドウの「振る舞い」タブ内の「プロトコル状態マシン」のチェックボックスにチェックを入れてください。要素の上部に<<protocol>> のキーワードが表示され、区別可能になります。

 

 

ツールボックスの要素と接続

要素

接続

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注意:

  • 状態要素に対しては、状態要素内の線(名前の下の線)を表示することができます。下の図のような線は、状態要素にアクションが定義されている場合や、状態要素の区画を表示するようにユーザーのオプションダイアログで設定している場合に表示されます。
  • 状態の境界に入場点や退場点を配置する場合には、対象の状態要素を右クリックし、「子要素の追加」 以下の項目を選択して下さい。この場合には、その状態要素に子ダイアグラムを作成し、その子ダイアグラム内でダイアグラムフレームを表示する設定にすると、追加した入場点・退場点を利用できます。
  • 状態の型として状態マシンを指定していて、その状態マシンが入場点・退場点を持つ場合には、状態要素が持つ(継承した)入場点・退場点をダブルクリックすると「入場点・退場点の参照設定」ダイアログが表示され、参照関係の定義ができます。
  • 状態要素や状態マシン要素のフレームを右クリックし、「領域の定義」を選択することで、フレーム形式で表示されている場合でも領域を作成することができます。
  • ステートマシン図のシミュレーションを実行する場合には、シミュレーション対象の要素は、ダイアグラムと同じパッケージ内に含まれている必要があります。もし、異なるパッケージに含まれる要素が配置されている場合には、パッケージ図を作成し、ダイアグラムが含まれるパッケージから要素が含まれるパッケージへの「インポート」の接続を追加する必要があります。

 

 

参照: