ガード・アクション

<< 目次を表示 >>

ページ位置:  シミュレーション > 振る舞いモデルのシミュレーション > JavaScriptを利用した自動実行 >

ガード・アクション

フローや遷移のガードとアクションは、処理の流れを制御したり、シミュレーション中に追加の処理を行う場合に利用できます。

 

 

項目

参照

ガード

ガードでは、シミュレーション実行中に次の遷移先を決める為の条件式を指定します。一般的にはガードでは次のような特徴があります。

  • 遷移やコントロールフローを辿る際の条件を決める
  • Javascript形式で記述される
  • シミュレーション変数の参照も可能

ガードの定義

ガードの内容を定義するには、コントロールフローや遷移(以下、まとめて「パス」と記述します)のプロパティダイアログを利用します。

ガードには、JavaScriptの文法で、trueあるいはfalseのどちらかの結果になるような条件式を記入します。下の画像の例では、シミュレーション変数Balanceの内容を参照し、0以上であればこのパスが実行できる条件を満たすことになります。なお、thisの接頭辞は、シミュレーション変数である事を示します。

 

評価式

シミュレーションの実行中には、次の遷移先を決める前に、遷移可能性のあるすべてのパスについて、それぞれのパスのガード条件を評価します。この評価の結果、以下のような処理が行われます。

 

  • 遷移可能なパス(条件式がtrueになるパス)が1つのみの場合、そのパスを辿ります。
  • 遷移可能なパスが2つ以上の場合には、遷移を停止します。変数の値が変更されるなどで、遷移可能なパスが1つになるまで停止し続けます。
  • 遷移可能なパスがない場合には、遷移可能なパスが2つ以上の場合と同じ動作になります。
  • すべてのガード条件がfalseになる場合で、ガード条件が指定していないパスが1つ存在する場合には、そのパスを辿ります。
    (ガード条件が指定されているパスと指定されていないパスが混在する場合には、指定されているパスを優先して判定します。)

アクション

アクションとして処理を記述することで、以下の場合に内部の処理を行うことができます。

  • 状態のentryアクション
  • 状態のexitアクション
  • 状態間の遷移の「アクション」
  • アクション要素の「効果」

 

アクションの内容は、Javascript文法で記述できますし、他の振る舞いを呼び出せます。

Javascriptで記述する効果

Javascriptで効果を記述する場合には、以下のようになります。この例では、シミュレーション変数Balanceの変数の値を1減らしています。

 

振る舞い呼び出しのアクション

下の例では、アクションの内容として別の振る舞い要素を指定しています。

この例では、"Decrement Balance"という名前のアクションを指定しています。シミュレーションの処理は指定された要素に移り、処理が完了するとアクションが指定されたパスの位置に戻ります。

 

アクションの実行順序

状態が入れ子になっているようなモデルのシミュレーションを実行する場合には、アクションの実行順序に注意する必要があります。シミュレーション機能では、以下の順序で処理が実行されます。

 

  • すべてのexitアクションが実行されます。入れ子になっている場合には、中(子)の状態のexitアクションから順番に実行されます。
  • 遷移に定義されたアクションを実行します。
  • 次の状態について、entryアクションを実行します。入れ子になっている場合には、外(親)の状態のentryアクションから順番に実行されます。

 

つまり、exitアクション・遷移のアクション・entryアクションという順序で実行されます。なお、遷移先の判定は、これらのアクションの実施前に行われる点にも注意が必要です。

Javascript変数についての注意

Javascriptの変数は、シミュレーション実行中に参照・利用できます。以下のいずれかの接頭辞が必要です。

 

  • sim.  例 sim.pedestrianwaiting - グローバルな変数に利用すると良いでしょう。
  • this.  例 this.CustomerNumber - 対象のモデルを所有しているクラスの変数(属性)に利用すると良いでしょう。

 

これらの接頭辞により、シミュレーションのJavascriptエンジンでシミュレーション変数を確実に参照するようになります。なお、名前は、次の例のように、.(ピリオド)を複数利用して指定できます。

 

例. this.customer.name

 

 

参照: