状態遷移の解析

<< 目次を表示 >>

ページ位置:  プログラムの動作解析 > 動作の記録 >

状態遷移の解析

状態遷移の解析機能は、クラスのインスタンスの状態がどのように変わったかを検知し記録する機能です。利用するためには、状態の定義をクラスの定数として定義するほか、ソースコードに状態記録ポイントと呼ばれるマーカーを設定する必要があります。この機能は、Enterprise Architectの動作解析機能が対応する言語、つまり.NET, Mono, Java, ネイティブのC++で利用できます。

 

この機能を利用するためには、まず状態を定義する必要があります。

 

 

 

このクラスについての状態定義を、以下のクラス図のように行いました。それぞれの定義の内容はノート要素に記載したとおりです。この例を元に、この機能の利用方法やその結果を紹介します。

 

 

状態記録ポイントは、ソースコード内では次のように表示されます。

 

 

設定が完了したら、動作解析の機能の記録サブウィンドウの「状態解析」タブから実行します。実行中に状態記録ポイントに到達すると、実行中のクラスのインスタンスの状態を解析します。インスタンスの状況が定義した内容に一致する場合には、その状態であることが記録されます。状態の変化があった場合には、その変化についても記録されます。このサブウィンドウには、状態が検知されるとその内容が表示されます。それぞれの状態には、遷移先の状態についての情報も表示されます。

 

 

この情報から、ステートマシン図を生成することができます。

 

 

また、この情報からヒートマップを作成することもできます。次の例は、Trainクラスの「Bulletin」状態の定義とその動作結果のヒートマップを示しています。ヒートマップ内の数値は割合(パーセント)を示しています。この内容から、この例では46%が「In Transit」状態であったことがわかります。

 

 

以下の内容は、この例での'Bulletin'状態定義の解析例です。この内容から上の画像のヒートマップを自動生成しました。

 

 

 

利用手順:

リボン

  • 動作解析 > ツール > 記録 > サブウィンドウの表示 > 状態解析
  • ホーム > 画面 > プロパティ > プロパティダイアログ > 制約

 

 

状態の定義

状態の定義は、クラス要素の制約として定義します。制約の名前は、「StateDefinition.name」としなければなりません。なお、この「name」の部分は、定義の名前を示す文字列で、適切に指定してください。この名前が、記録サブウィンドウ内の状態解析タブ内で表示されます。複数の定義がある場合には、そのうちの1つを指定して実行します。このページの最初の例の場合には、制約の名前は「StateDefinition.Location」ですのでこの「name」に該当する部分は「Location」です。この制約はCTrainクラスに定義されていますので、CTrainクラスのインスタンスの状態変化が対象になります。

 

状態の定義の内容は、1つ以上の具体的な状態定義になります。それぞれの定義は 'statedef' のキーワードで始まり、1つ以上の文が続きます。文は{と}の括弧で囲み、それぞれの文の末尾にはセミコロンが必要です。文のうちの1つはその状態を示す具体的な条件(変数とその値)で、状態名の定義に変数名を利用する場合には、その変数名も含める必要があります。具体的には、以下のようになります。

 

statedef {

     Location=0;

     Departing.Name;

}

 

 

変数を利用して状態名をつける

次の例では、Locationは定数値でDeparting.nameは変数です。状態の名前を、この変数の値を利用して設定しています。

 

statedef {

     Location=0;

     Departing.Name;

}

name=Departing.Name;

 

 

定数値で状態名をつける

次の例は、状態の名前を固定の定数値で指定しています。

 

statedef {

   Location=100;

}

name='Central';

 

 

複数の状態の定義をまとめて行う例

 

statedef {

   Passengers > 100;

}

name=Busy;

statedef {

   Passengers >= 50;

}

name=Quiet;

statedef {

   Passengers < 50;

}

name=Very Quiet;

statedef {

   Passengers = 0;

}

name=Idle;

 

 

既定の状態

状態の定義では、他の定義に該当しない場合に適用される「既定の状態」を定義することができます。この定義があると、他の定義に全て該当しない場合には、指定した状態となります。定義の例は次の通りです。

 

statedef {

     Location=0;

     Departing.Name;

}

name=Departing.Name;

default=Moving;

 

 

上の定義の例では、'Location'属性の値が0以外の場合には条件に該当せず、結果的に'Moving'状態となります。

「初期状態を含む」の設定を無効にすることで、既定の状態を記録の対象外にすることができます。ツールバーのボタンから設定できます。この設定を無効にすると、すべての既定の状態への遷移は記録されません。

 

 

クラス要素の状態定義を表示するノート要素を作成する

クラスに定義された、状態の定義内容を表示するノート要素を図に配置する方法を説明します。

 

手順

項目

説明

クラス図を開く

既存のクラス図を開くか、新規にクラス図を作成します。

クラス要素を配置する

対象のクラス要素をダイアグラム内に配置します。

ノート要素を作成する

ノート要素をダイアグラム内に追加します。

ノート要素とクラス要素を結ぶ

要素間をクイックリンクで結び、ノートリンクを作成します。ノートリンクを右クリックし、「ノート要素にプロパティの内容を表示」を選択します。

ノートに表示する内容を指定する

プロパティの種類として、「制約」を選択します。定義された制約が一覧に表示されますので、内容を表示する制約を選択します。

繰り返す

必要に応じて、この操作を繰り返します。