掲示板一覧   -   トピック一覧
   EA ソースコード生成・コード生成テンプレート
     [Java] 関連からフィールド作成


スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
未登録ゲスト
投稿日時: 2007-12-12 15:08

[Java] 関連からフィールド作成

関連端名を指定しない場合のフィールド名の既定値ですが、
$LinkClass
を使用すると先頭が大文字になってしまい Java の規約に違反してしまいます。
そこで、コード生成テンプレートの
LinkedAttributeDeclaration
を以下のように変更してみました(抜粋)。

$initial=""
%if $type != linkAttName%
$initial = " = new " + $type + "()"
$initial = %REPLACE($initial, ".List", ".ArrayList")%
$initial = %REPLACE($initial, ".Map", ".LinkedHashMap")%
%endIf%

%if linkAttRole != ""%
%linkAttRole%
$initial;
%else%
$name = %REPLACE(genOptDefaultAssocAttName,"$LinkClass",linkAttName)%
$head = %LEFT($name, 1)%
$name = %TO_LOWER($head)% + %MID($name, 1)%
%if $type != linkAttName%
$name += "s"
%endIf%
$name
$initial;
%endIf%

目的どおり、
java.util.List<Foo> foos = new java.util.ArrayList<Foo>();
のようなコードが生成できたのですが、
コード生成するたびにこの行が複製されてしまいます。
フィールド名を変更しているのが問題のようなのですが、
対処方法がわかりましたらご教示ください。
tkouno
投稿日時: 2007-12-12 15:19
EA Administrator
投稿: 3939

Re: [Java] 関連からフィールド作成

ご質問の件、結論から先に申し上げますと
現在のEnterprise Architectでは対処不可能です。

ご提示のスクリプトの中で、
$name += "s"
の処理を行っています。この時点で、モデル内の名前の情報と
コードに出力された名前の情報が不一致となります。

Enterprise Architectは、他のいくつかのツールのように
出力されるソースコードにツールのための情報を埋め込みません。

この点は、コードが汚くならないということで多くの方の
支持をいただいていますが、その反面、今回のように
名前が変わる場合には、同じものであるという判断ができません。
(今は名前を中心に同一性の判断をしています)

出力される名前が変わるため、出力前にチェックした結果
「ソースコードに存在しない」ということで、結果として
重複して出力されます。


申し訳ございませんが、この点は現在のEnterprise Architectでは
対処不可能です。モデルの情報とコードの情報の同一性を
判断するための「ツールのための情報」を入れる以外の
対処法がございません。
しかしながら、これを行うことは、Enterprise Architectを
支持している人にとっては良くない話であり、また開発者
(Geoffrey Sparks)の方針もありますので、この方法での
解決は現時点では考えていません。

申し訳ございませんが、ご理解いただけますと助かります。
ご要望に沿えず申し訳ございません。

未登録ゲスト
投稿日時: 2007-12-12 15:39

Re: [Java] 関連からフィールド作成

素早い回答ありがとうございます。
1点だけ追加で質問です。

オリジナルのテンプレートでも、
%REPLACE(genOptDefaultAssocAttName,"$LinkClass",linkAttName)%
のように関連端名の置換(生成?)をしていますが、
コードのフィールド名と、モデルの「何が」同じなら、
同一の要素と見なされるのでしょうか?
tkouno
投稿日時: 2007-12-12 15:54
EA Administrator
投稿: 3939

Re: [Java] 関連からフィールド作成

追加のご質問の件ですが、ご指摘の$LinkClassに関連する
設定の欄である「属性の既定の名前」(オプションダイアログの
「属性と操作」グループ)の情報と一致すれば、同じと
判断しています。

例えば、今回の例ですと、(ちょっとわかりにくいのですが)
「$LinkClass」の代わりに、最後にsを一つ追加した「$LinkClasss」を上記オプションに設定することで
出力される属性名の最後にはsの文字が付加され、さらに
同一のものであるとみなされます。
(出力しても重複しないはずです)

先ほどの回答をより正確に申し上げますと、
名前にsをつけているので同期できない、ということではなく
コード生成テンプレート側で名前を編集して出力することで
同期が取れなくなる、ということになります。

先ほどの回答の仕方が混乱を招いてしまったかもしれません。

ご理解いただけますと助かります。

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