
3.4.1 Rational Rose双向工程
前面关于Rational如何对UML提供支持中介绍过Rational Rose可以进行代码生成以及逆向工程。代码生成能够使在Rational Rose中设计的解决方案的架构信息在一开始就转换为相关目标语言的代码,这样就不需要人工再重新创建这些代码了。逆向工程使所创建的代码逆向转换为对应的模型,能够使设计者或程序员把握系统的静态结构,并且帮助程序员编写良好的代码。
1.Rational Rose生成代码
在Rational Rose 2007中,不同的版本对于代码生成提供了不同程度的支持,对于前面所介绍的三个版本中,Rational Rose Modeler仅可以提供生成系统的模型,不支持代码生成功能。Rational Rose Professional版本只提供对一种目标语言的支持,这种语言取决于用户在购买该版本时的选择。Rational Rose Enterprise版本对UML提供了更高程度的支持,可以使用多种语言进行代码生成,这些语言包括Ada83、Ada95、ANSI C++、CORBA、Java、COM、Visual Basic、Visual C++、Oracle8和XML_DTD等。可以通过选择“Tools”(工具)下的“Options”(选项)选项来查看所支持的语言信息,如图3-25所示。

图3-25 Rational Rose Enterprise支持的语言信息
使用Rational Rose进行生成代码可以通过以下四个步骤进行,以目标语言为Java代码为例。
(1)选择待转换的目标模型。在Rational Rose中打开已设计好的目标图形,选择需要转换的类、构件或包。使用Rational Rose生成代码一次可以生成一个类、一个构件或一个包,我们通常在逻辑视图的类图中选择相关的类,在逻辑视图或构件视图中选择相关的包或构件。
(2)检查Java语言的语法错误。Rational Rose拥有独立于各种语言之外的模型检查功能,通过该功能可以在代码生成以前保证模型的一致性。
使用Rational Rose进行模型检查可以通过选择“Tools”(工具)下的“Check Model”(检查模型)选项来检查模型的正确性,如图3-26所示。出现的错误写在下方的日志窗口中。常见的错误包括对象与类的映射不正确等。在检查模型错误时发现的这些错误,需要及时地进行校正。在Report(报告)工具栏中,可以通过Show Usage、Show Instances、Show Access Violations等功能来辅助校正错误。

图3-26 检查模型示例
对于Java语言的语法检查,可以通过选择“Tools”(工具)中“Java”菜单下的“Syntax Check”(语法检查)选项来进行Java语言的语法检查,如图3-27所示。如果检查发现一些语法错误,也将在日志中显示出来。如果检查正确,则会出现如图3-28所示的提示信息。

图3-27 Java语言的语法检查

图3-28 语法检查正确示例
(3)设置代码生成属性。在Rational Rose中,可以对类、类的属性、操作、构件和其他一些元素设置一些代码生成属性。通常,Rational Rose提供默认的设置。可以通过选择“Tools”(工具)下的“Options”(选项)选项来自定义设置这些代码生成的属性。如图3-29所示,是对Java语言进行的代码生成属性的设置。对这些生成属性设置后,将会影响模型中使用Java实现的所有类。
对单个类进行设置时,可以选择该类的规范窗口,在对应的语言中改变相关的属性,如图3-30所示。

图3-29 Java语言代码生成属性设置示例

图3-30 单个类的生成设置
(4)生成代码。在使用Rational Rose Professional或Rational Rose Enterprise版本进行代码生成之前,一般来说需要将一个包或组件映射到一个Rational Rose的路径目录中来指定生成路径。可以通过选择“Tools”(工具)中“Java”菜单下的“Project Specification”(项目规范)选项来设置项目的生成路径,而后弹出如图3-31所示的窗口,在classpaths下添加生成的路径,可以选择目标是生成在一个jar/zip文件中或者是在一个目录中。
在设置完生成路径之后,可以在工具栏中通过选择“Tools”(工具)中“Java”菜单下的“Generate Code”(生成代码)选项来执行代码的生成,如前面图3-27所示。
下面以图3-32中的类模型为例生成代码来进行说明。在该类模型中,类的名称为“ClassName”,包含一个私有属性为name,它的类型为Boolean;另外还包含一个“public”类型的方法,方法的名称为“opname”,除此外,还包含该类的构造函数。通过上面的步骤,生成该类的代码,生成的代码如程序3.1所示。在程序中,可以一一对应图中所要表达的内容。

图3-31 设置项目生成路径

图3-32 类模型
程序3.1 通过模型生成的代码示例

在生成的代码中,注意到会出现如下的语句:
@roseuid 47903BFD0216
这些数字和字母的符号是用来标识代码中的类、操作以及其他模型元素,便于Rational Rose中的模型与代码进行同步。
2.逆向工程
在Rational Rose中,可以通过收集有关类(Classes)、类的属性(Attributes)、类的操作(Operations)、类与类之间的关系(Relationships)以及包(Packages)和构件(Components)等静态信息,将这些信息转化成为对应的模型,并在相应的图中显示出来。以下是将Java代码逆向转化为Rational Rose中的类图的过程。
程序3.2 逆向工程代码示例

在该程序中,包含两个私有属性和一个公有属性,分别是APriNumber、ALongNumber和APubNumber,还包含两个公有操作和一个私有操作,分别是AddAPriNumber、RemoveLong和SwapTwoNumber,除此之外还包含一个类的构造函数TestProject。在设置完成路径之后,可以在工具栏中通过选择“Tools”(工具)中“Java”菜单下的“Reverse Engineer...”(逆向工程)选项来执行逆向工程。程序3.2生成的类模型如图3-33所示。从图中,可以一一对应在程序中所要表达的内容。

图3-33 逆向工程生成模型
Rational Rose除了能够将代码直接转换成类图以外,还能够通过代码间的关系转换成相关图形来表达类与类之间的关系。例如程序3.3,在名称为“TestA”的类中声明了名称为“TestB”的类,根据这些代码创建的关联关系如图3-34所示。

图3-34 关联关系逆向转换图
程序3.3 逆向工程代码关系示例
//Source file: E:\\TestA.java public class TestA{ public TestB testBClass; public TestA() {} } //Source file: E:\\TestB.java public class TestB{ public TestB() {} }