依存関係などの関係を元にソースコード生成結果を変える
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などのマクロを利用することで、より状況に合致した生成結果が得られます。