UML:NetBeans 6.5 中的源代码合并
在使用 NetBeans 6.5 UML 的代码生成工具时,IDE 会将生成的代码与已存在的代码合并起来。此代码合并和代码同步功能基于已生成的文件是否存在,以及 IDE 用于为代码生成创建模板的 API。尽管 IDE 附带了为标记参数提供缺省值的模板,但是您可以创建自己的模板,该模板此后就属于您自己了。
目录
所需的软件
要学习本教程,您需要具备以下软件和资源。
逻辑
“域模板”配置 API 将为代码生成的元素创建一组模板。所生成代码的目标目录、生成的元素,以及相应的模板将产生一组目标文件路径,代码即在这些路径中生成。
合并过程
合并过程从成对文件开始,这些文件包含新的文件及其预先存在的版本。在合并和同步过程中,如果发现文件是预先存在的文件,则这些文件将成为候选的合并文件。
随后,该过程将遵循以下逻辑:
- 如果存在任何已生成的文件,则这些文件将成为相应新文件的候选合并文件。
- 新文件需是可解析的 Java 文件;如果文件不可解析,则 IDE 会在合并过程中创建现有文件的一个备份副本,用新文件替换旧文件,并在控制台日志中发出警告。
- 每个元素都有“源文件工件”属性,在合并进程中将检查该属性以了解是否存在潜在的合并候选项。作为候选项,文件需具备以下条件:
- 必须可解析。
- 必须用 IDE 类或该类中的类进行标记,或者
- 如果存在内部声明的公共类,则只对用 ID 标记的公共类进行计数。ID 采用 id=<唯一的 ID 值> 格式,无缺省值,并在匹配进程中使用。
- 合并进程将解析每个不含预先存在版本的新文件,以及其标记类的 ID。
- 如果发现匹配项,则定义匹配 ID 的文件将被视为预先存在的版本,该文件应与新文件进行合并。
流:搜索标记元素
API 将在每个文件对中搜索匹配元素:
- API 会将新文件的元素(包含类型、属性、方法或枚举字面值)与预先存在的文件中同种类型的元素进行匹配。
- 首次匹配尝试是使用标记 ID 完成的。其余的不匹配元素则使用操作的名称(对于类型、枚举字面值和属性)和签名进行匹配。
- 新文件的元素(类型、属性、方法、枚举字面值)将与预先存在的版本中同种类型的元素进行匹配。
可重新生成的元素
如果某个元素具有指定其可重新生成的标签,则该元素可重新生成。
重新生成标题和正文
为了便于修改源代码,在声明元素为类型、属性、操作或枚举字面值之前,应先添加一行注释或多行注释(包括标记注释)和 Javadoc 注释(如果可能)。
元素的标题是元素声明的标题加上任何注释。
缺省情况下,只能重新生成类型或枚举字面值元素的标题:也就是说,用新版本更新类型或枚举元素时,只更新元素的标题。这类更新将保持声明的正文不变。
但是,使用标记可以将元素显式定义为可重新生成标题和正文。
缺省情况下,在提供的模板中,不能重新生成方法的正文。
重新生成时缺省替换的元素
每个找到了匹配新元素的可重新生成的旧元素都将被新元素替换。
新元素只包含声明的标题,或同时包含声明的标题和正文。
每个未找到匹配“新”元素的可重新生成的旧元素都将被从预先存在的源中删除。
每个未找到匹配旧元素的新元素都将在合并活动发生时添加到预先存在的源中。
合并过程控制台输出
下面表示了执行合并时的典型控制台输出,并指明正在通过模板生成源。
代码生成选定的选项:
源文件夹位置 - C:\tmp\wrk\wss\NetBeansProjects\UMLBankAppSample24\src
备份源 - True
生成标记 - True
显示“生成代码”对话框 - True
处理第 1 个元素(共 1 个):类 class3 ...
正在通过模板 "Java/CompilationUnit.java" 生成代码... 确定
现有源文件 - C:\tmp\wrk\wss\NetBeansProjects\UMLBankAppSample24\src\Unnamed1.jav
正在合并现有源文件 ... 确定
标记
标记后应紧跟元素和单行注释(可能包含 NetBeans Java 编辑器代码折叠注释)。
标记采用以下格式
// #[(name=value(,name=value)*)?]
可识别的标记参数
模板 API 可以识别一小组参数,这些参数用于向合并过程指示是否应在文件中重新生成元素。
- regen=yes/no-- 指定元素是否可重新生成。如果参数不存在,则缺省值为 "no"。
- regenBody=yes/no-- 指定元素的标题可重新生成,还是标题和正文均可重新生成。缺省值为 "no"。
带有可重新生成参数的标记示例
#[regen=yes,id=DCE.837531C6-88E2-92F9-401E-EC3D10886772]
示例
由缺省模板生成的标记
使用 NetBeans IDE UML 功能生成代码时,可以获得与以下内容类似的代码及注释集。
请注意,标记应遵循上面指示的格式,并将 regen 设置为 yes,且使用特定标识符设置标记 ID。
/**
* cl2 class comment
*/
// #[regen=yes,id=DCE.837531C6-88E2-92F9-401E-EC3D10886772]
public class cl2 {
// #[regen=yes,id=DCE.D113E820-6111-0ACD-3734-107284B942AC]
private String Attr1;
// #[regen=yes,id=DCE.A68261A9-6DCE-418D-3E81-7863E83C205B]
public void op1 () {
}
// #[regen=yes,regenBody=yes,id=DCE.02E281C8-C473-EB3F-08A2-6967B09A4ACD]
public String getAttr1 () {
return Attr1;
}
// #[regen=yes,regenBody=yes,id=DCE.4D5F8CF3-9820-B029-5095-F03AA41EE94E]
public void setAttr1 (String val) {
this.Attr1 = val;
}
/**
* clas2 class comment
*/
// #[regen=yes,id=DCE.53C71074-4D93-0C5F-82E1-ABE5DE2C30F1]
class clas2 {
}
}
手动添加标记以便有选择地重新生成代码
您可以对现有源代码执行逆向工程,将其转换为模型。但是,您可能只想通过模型重新生成代码的某些部分。
为此,您需要按照下面显示的方式为名为 Attr1 的属性手动添加标记。
/**
* cl2 comment
*/
public class cl2 {
/**
* Attr1 comment
*/
// #[regen=yes]
private String Attr1;
/**
* Attr2 comment
*/
private String Attr2;
/**
* clas2 comment
*/
class clas2 {
}
}/**
* cl2 comment
*/
public class cl2 {
/**
* Attr1 comment
*/
// #[regen=yes]
private String Attr1;
/**
* Attr2 comment
*/
private String Attr2;
/**
* clas2 comment
*/
class clas2 {
}
}
下次通过模型生成代码时,将按名称匹配 Attr1,并用新版本对其进行更新。这是因为如果标记存在,则每个已找到匹配新元素的可重新生成的旧元素都会被替换为对应的新元素。
/**
* cl2 comment
*/
public class cl2 {
/**
* Attr1 comment modified in UML documentation property editor (???)
*/
// #[regen=yes,id=DCE.6914EA88-3C15-40EE-7B14-2D28B9CA4FF3]
private String Attr1;
/**
* Attr2 comment
*/
private String Attr2;
/**
* clas2 comment
*/
class clas2 {
}
}
重命名模型的属性
使用 ID 标记属性后,您可以重命名模型中的属性,而且在下次生成/合并代码期间 IDE 仍然会使用其 ID 来匹配该属性,因此也会在源代码中重命名该 ID。
/**
* cl2 comment
*/
public class cl2 {
/**
* Attr1 comment modified in UML documentation property editor
*/
// #[regen=yes,id=DCE.6914EA88-3C15-40EE-7B14-2D28B9CA4FF3]
private String[] Former_Attr1;
/**
* Attr2 comment
*/
private String Attr2;
/**
* clas2 comment
*/
class clas2 {
}
}
后续步骤
返回页首