ステートマシン図からC++言語のソースコードを出力するサンプル

Enterprise Architect Suiteシリーズでは、ステートマシン図などの振る舞い図からのソースコード生成をサポートしています。ただし、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_light_ON && (lightMode == false))
			{
				nextState = ST_sampleStateMachine_turning_left;
				externalTransition = true;
			}
			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);

このサンプルの利用について

このサンプルにご興味がある方・実際に試したい方は、サポートにご連絡ください。上記の内容を含むEAPファイルをお渡しいたします。改善のご要望などがありましたら、ぜひお寄せください。

なお、このサンプルはEnterprise Architect Suiteの各エディションでのみ動作するため、サポートが有効なEnterprise Architect Suite日本語版の各エディションをお持ちの方に限定させていただきます。

このサンプルの制限・注意:

  • このサンプルは、特定のOS/環境や言語処理系を想定したものではありませんので、必要に応じてカスタマイズしてご利用下さい。
  • 選択点・連結点・フォーク&ジョインはすべて同じコード生成結果になります。
  • 入れ子の状態は、1階層のみ対応しています。
  • バージョン10.0で表現可能になった内部遷移には未対応です。

カスタマイズについて

この出力内容は、すべてEnterprise Architectのコード生成テンプレートをカスタマイズして作成したサンプルです。必要に応じてカスタマイズして利用することを前提としています。カスタマイズについては、有償でのカスタマイズサービスもございます。

なお、「生成元のステートマシン図」「生成結果となるソースコード」のサンプルを提供いただける場合に、弊社が無料でテンプレートをカスタマイズし、Enterprise Architectユーザーに広く公開するという選択肢もあります。(実施するかどうかは内容を見て、弊社で検討させていただきます。) ご興味がある方は、サポートにご連絡ください
(ただし、この場合には全ての場合において正しく動作するレベルまで作成するかどうか、は保証できません。)

補足

ステートマシン図からのソースコード生成の概要は、こちらのページをご覧ください。また、PDFドキュメント「ステートマシン図からのコード生成 機能ガイド」も参考になります。