ステートマシン図からC++言語のソースコードを出力するサンプル
Enterprise Architectの一部のエディションでは、ステートマシン図などの振る舞い図からのソースコード生成をサポートしています。ただし、C++言語の既定の出力結果とは異なる形式に出力したいというご要望を少なからずいただいています。ここでは、イベントを状態マシンに渡す形式のソースコードを生成するサンプルをご紹介します。
なお、この例はサンプルとして作成した例です。C言語のテンプレートをカスタマイズした例はこちらをご覧ください。
例として、以下のようなステートマシン図を考えます。
(↓状態turning_rightの中のステートマシン図)
このような場合に、発生したイベントを状態マシンを表すクラスに渡して処理を行うようなソースコードを生成する例を作成しました。なお、現在のサンプルから生成したすべての結果はこちらに掲載しています。
このサンプルでは、performEventメソッドで外部からイベントを受け取り、状態遷移を行います。
void sampleCpp::performEvent(Event e)
{
if ( currState == ST_NOSTATE )
{
return;
}
externalTransition = false;
transcend = false;
nextState = currState;
StatesProc(currState, Do, e);
if ( nextState == ST_NOSTATE )
{
StatesProc(currState, Exit, e);
currState = ST_NOSTATE;
return;
}
if ( currState != nextState || externalTransition == true)
{
StatesProc(currState, Exit, e);
currState = nextState;
StatesProc(nextState, Entry, e);
}
}
StatesProcメソッドでは現在の状態に応じて、自動生成されるprivateメソッドを呼び出します。例えば、turing_left状態の場合の処理は以下のようになっています。
void sampleCpp::sampleStateMachine_turning_left(CommandType command, Event e)
{
switch(command)
{
case Do:
{
// Do Behaviors..
TurnLeftActions();
// State's Transitions
if (e == E_light_ON && (lightMode == true))
{
nextState = ST_sampleStateMachine_lightOn;
}
else
if (e == E_left)
{
nextState = ST_sampleStateMachine_turning_left;
externalTransition = true;
}
else
if (e == E_right)
{
nextState = ST_sampleStateMachine_turning_right_StateA;
transcend = true;
}
break;
}
default:
{
break;
}
}
}
このサンプルクラスに対して「ソースコードの生成」を実行すると、上記のコードが生成されます。なお、現在のサンプルから生成したすべての結果はこちらに掲載しています。
performEvent関数を利用する場合の想定している呼び出し方は、次の通りです。
sampleCpp *sm1;
sm1 = new sampleCpp();
sm1->initializeStateMachine();
sm1->performEvent(sampleCpp::E_left);
このサンプルの利用について
このサンプルにご興味がある方・実際に試したい方は、サポートにご連絡ください。上記の内容を含むプロジェクトファイルをお渡しいたします。(拡張子EAPX,QEAの2つのファイルがありますが、中身は同じです。)
なお、このサンプルはEnterprise Architectの一部エディションでのみ動作するため、サポートが有効な「ユニファイド版」「アルティメット版」の各エディションをお持ちの方に限定させていただきます。
このサンプルの制限・注意:
- このサンプルは、特定のOS/環境や言語処理系を想定したものではありませんので、必要に応じてカスタマイズしてご利用下さい。
(このサンプルは、2011年のETロボコンの研修向けに作成・配布したテンプレートを元にしています) - 選択点・連結点・フォーク&ジョインには対応していません。
- 入れ子の状態は、1階層のみ対応しています。
- 内部遷移には対応していません。
カスタマイズについて
この出力内容は、すべてEnterprise Architectのコード生成テンプレートをカスタマイズして作成したサンプルです。必要に応じてカスタマイズして利用することを前提としています。カスタマイズについては、有償でのカスタマイズサービスもございます。
補足
ステートマシン図からのソースコード生成の概要は、こちらのページをご覧ください。また、PDFドキュメント「ステートマシン図からのコード生成 機能ガイド」も参考になります。