ステートマシン図から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);

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

このサンプルにご興味がある方・実際に試したい方は、サポートにご連絡ください。上記の内容を含むプロジェクトファイルをお渡しいたします。

なお、このサンプルはEnterprise Architectの一部エディションでのみ動作するため、サポートが有効な「ユニファイド版」「アルティメット版」の各エディションをお持ちの方のみ提供できます。

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

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

カスタマイズについて

この出力内容は、Enterprise Architectのコード生成テンプレートをカスタマイズして作成したサンプルです。必要に応じてさらにカスタマイズして利用することを前提としています。お客様自身で自由にカスタマイズし利用できます。なお、カスタマイズについては、有償でのカスタマイズサービスもあります。