依存関係などの関係を元にソースコード生成結果を変える

Enterprise Architectでソースコード生成を行う場合、現在Java以外の言語では、クラス間に依存関係を設定してもinclude文が自動的に追加されるようにはなっていません。このような場合にinclude文のような内容を追加する場合には、ソースコード生成テンプレートの内容をカスタマイズし、依存関係がある場合のみの処理を追加します。

このような条件付のlistマクロの処理は以下の文法になります。「条件」の部分は、if文と同じ条件文をそのまま使えます。
%list="テンプレート名" @separator="セパレータ" 条件%

例えば、依存関係がある場合にImportテンプレートを呼ぶような場合には、次のようになります。
%list="Import" @separator="\n" importFromDependency=="T"%

このImport系テンプレートで利用可能な条件の例は、次のようなものがあります。

  • importFromAggregation=="T" : 集約関係にあるクラス
  • importFromAssociation=="T" : 関連関係にあるクラス
  • importFromAtt=="T" : 属性にあるクラス
  • importFromDependency=="T" : 依存関係にあるクラス
  • importFromGeneralization=="T" : 汎化関係にあるクラス
  • importFromMeth=="T" : メソッドにあるクラス
  • importFromParam=="T" : 引数にあるクラス
  • importFromRealization=="T" : 実現関係にあるクラス

上記の全てを含む場合のテンプレートの内容は、次のような形になります。

$imports += %list="Import" @separator="\n" importFromAggregation=="T" or importFromAssociation=="T" or importFromAtt=="T" or importFromDependency=="T" or importFromGeneralization=="T" or importFromMeth=="T" or importFromParam=="T" or importFromRealization=="T"%

これを応用して、C++言語で依存関係を作成した場合、include文を追加するための設定は次のとおりになります。

ImportSectionテンプレートの内容
$imports = %fileImports% + "\n"
$imports += %list="Import" @separator="\n" importFromDependency=="T"%
%REMOVE_DUPLICATES($imports, "\n")%

Importテンプレートの内容
#include"%importClassName%.h"

なお、この例ではクラスが異なるパッケージにある場合には正しくパスが追加されません。PackagePathなどのマクロを利用することで、より状況に合致した生成結果が得られます。