掲示板一覧   -   トピック一覧
   EA ソースコード生成・コード生成テンプレート
     コード生成テンプレートに関するTIPS


スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
tkouno
投稿日時: 2007-1-5 18:36
EA Administrator
投稿: 4288

コード生成テンプレートに関するTIPS

あるお客様のとのやり取りの中で、サポートからの回答を
わかりやすい形でまとめてくださいました。

公開についてもご快諾くださいましたので
ここに公開させていただきます。
(Webでの表示用に体裁のみ多少修正しました)

その1: コメント関連

1.説明記述の設定

(1)クラス図を開き、コード出力先を設定する。

対象クラスの右クリックからコンテキストメニュー[ソースコードの生成]を選択し、開かれたダイアログ上
の"パス"にパスと出力ファイル名を設定し、[保存]そして「[閉じる]ボタンをクリックする。

注)クラス毎に1ファイルで出力する場合は、クラス図上で複数クラスを選択して一括生成できるが、
複数クラスを1ファイルに実装する場合は、上記手順で出力先に同じファイルを設定する必要がある。
但し、この機能はヘッダファイル(.h)にのみ有効で、ソースファイル(.cpp)には適用されない。


(2)ファイルの説明記述の設定

対象クラスの右クリックからコンテキストメニュー[ソースコードの生成]を選択し、開かれたダイアログ上
の"インポートおよびヘッダ"(上段が.h用,下段は.cpp用)に記述し、[保存],「[閉じる]ボタンをクリックする。

注)この部分の記述はクラスのコードの最上部に出力される(.hファイルでは#ifndefなどのマクロ文の次)。
従って、以下のような記述を行う。

(1)出力ファイル全体の説明
(2)include文
* クラス図で関連が設定されたクラスのヘッダのinclude分は自動生成される。
* C++Builderなどが自動生成するはずのinlude文も記述しておいた方がよい
(3)using namespace文
なお、上記(1)のように複数クラスのコードを1ファイルに出力する場合、記述が重複しないために
2番目以降の出力クラスにはこの記述をしてはいけない。


(3)クラスの説明記述の設定

対象クラスの右クリックからコンテキストメニュー[プロパティ]を選択し、開かれたダイアログ上の"ノート"に記述し、
[保存],「[閉じる]ボタンをクリックする。

注)この部分の記述は各クラスの先頭コードの直前に出力される。従って各クラス毎にクラス固有のコメントを書く。
なお出力の際には、その左端にコメント文にするための/*,*,*/などが自動挿入されるので、コメントには
これらの文字を含まないようにするのがよい(これらが重複して出力されるとエラーになったりするため)。


(4)メンバの説明記述の設定

対象クラスの右クリックからコンテキストメニュー[属性]を選択し、開かれたダイアログ下部の属性一覧から1つを
クリック選択してから"ノート"に記述し、[保存],「[閉じる]ボタンをクリックする。

対象クラスの右クリックからコンテキストメニュー[操作]を選択し、開かれたダイアログ下部の属性一覧から1つを
クリック選択してから"ノート"に記述する。さらに”振る舞い”タブを開いて”振る舞い"欄に記述してもよい。

その後”振る舞い”タブの[保存]をクリックした後、"一般"タブに戻って、[保存],「[閉じる]をクリックする。

注)操作の"ノート"欄の記述は各メソッドの先頭コードの直前に出力され、
"振る舞い"欄の記述は各メソッドのコード内"{"の次の行に出力される。

tkouno
投稿日時: 2007-1-5 18:37
EA Administrator
投稿: 4288

Re: コード生成テンプレートに関するTIPS

その2:コードテンプレートのカスタマイズ関連です。

2.出力書式の設定

(1)コード生成テンプレートを開き、言語を設定する

・EAのメインメニュー[設定]-[コード生成のテンプレート]
・言語をC++に選択設定する(左上)


(2)多重定義回避用のマクロ文を修正する

File の 16~20行を以下のように変更する。

$guid = "EA_" + %TRIM(eaGUID,"{}")%
$guid = %REPLACE($guid,"-","_")%
$guid += "__INCLUDED_"
#if !defined($guid)
#define $guid\n
%ImportSection%
%list="Namespace" @separator="\n\n"%
#endif // !defined($guid)\n

→$fname = %fileName%
$fname = "T" + %TO_UPPER($fname)%
$fname = %REPLACE($fname,".","")%
#ifndef $fname
#define $fname\n
%ImportSection%
%list="Namespace" @separator="\n\n"%
#endif


(3)括弧{}のスタイルを変更する

Class Body Impl の 12, 16, 21 行目:
){\n\n} →)\n{\n\n} に変更(コンストラクタ,デストラクタ,コピーコンストラクタ用)

Opreation Body の 1行目:
{\n→\n{\nに変更(一般メッソド用)


(4)public,protected,privateフィールドの出力順を逆転する。

Class Body の 68行目以降。以下の3ブロックを希望出力順にブロック単位で並替える

$pubFeatures = %TRIM($pubFeatures, "\n")%
$pubFeatures += "\n" + %list="Attribute" @separator="\n" @indent="\t" attScope=="Public" or
linkAttAccess=="Public" or attScope=="Package" or linkAttAccess=="Package"%

・(途中省略,Publicフィールドのブロック)

%endIf%

$protFeatures = %TRIM($protFeatures, "\n")%
$protFeatures += "\n" + %list="Attribute" @separator="\n" @indent="\t" attScope=="Protected" or
linkAttAccess=="Protected"%

・(途中省略,Protectedフィールドのブロック)

%endIf%

$privFeatures = %TRIM($privFeatures, "\n")%
$privFeatures += "\n" + %list="Attribute" @separator="\n" @indent="\t" attScope=="Private" or
linkAttAccess=="Private"%

・(途中省略,Privateフィールドのブロック)

%endIf%


(5)属性の説明記述を"//"に続く1行表現に変更して直前に空白行を1行追加する。

Attribute Notes の記述を以下のように変更する。

%if genOptGenComments != "T"%
%endTemplate%

%PI=""%
$style = %genOptCPPCommentStyle%

%if $style == "XML.NET"%
$wrapLen = %genOptWrapComment%(注:XML時の記述,wrapLen文コピー移動)
%XML_COMMENT($wrapLen)%
%elseIf $style == "JavaDoc"%
$wrapLen = %genOptWrapComment%(注:Java時の記述,wrapLen文コピー移動)
%JAVADOC_COMMENT($wrapLen)%
%else%
$wrapLen = %genOptWrapComment=="-1" ? "-1" : "40"%(注:C++時の記述,主な変更部分)
$attribute = %WRAP_LINES(attNotes, $wrapLen, "//", "")%
%if $attribute != ""%
\n$attribute(注:空白行を追加)
%endIf%


(6)操作の書式を調整する。

メソッドコードの先頭"{"に続く空白行を削除する
Operation Body の先頭行:\n{\n→\n{

メソッドコードの"{"に続く”振る舞い"の記述後の空白行2行を除く
Operation Body の5行目:$behaviour\n\n→$behaviour

メソッドコードの記述の最後に続けて空白行を1行追加する
Operation の最終行:%endIf% →%endIf%(改行後)\n


3.出力の有効/無効設定

メインメニュー[ツール]-[オプション]からローカルオプションウィンドウを開く。
左ボックスの"ソースコードの生成と読み込み"以下の項目をクリック選択すると、出力機能の細かなON/OFF設定を行える。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ