LOGO
《UML 统一建模》
第14章
Rose的双向工程
目录
14.1 双向工程简介
14.2 正向工程
14.3 逆向工程
14.4 实例应用
小结
第14章 Rose的双向工程
双向工程包括正向工程和逆向工程。正向工程指把设计模型映射为代码;逆向工程是指将代码转换成设计模型。
14.1 双向工程简介
无论是把设计模型转换成代码,还是把代码转换为设计模型,都是一项非常复杂的工作。正向和逆向工程这两方面结合在一起,定义为双向工程。双向工程提供了一种机制,它使系统架构或者设计模型与代码之间进行双向交换。
正向工程把设计模型转换为代码框架,开发者不需要编写类、属性、方法代码。一般情况下,开发人员将系统设计细化到一定的级别,然后应用正向工程。
逆向工程是指把代码转换成设计模型。在迭代开发周期中,一旦某个模型作为迭代的一部分被修改,采用正向工程把新的类、方法、属性加入代码;同时,一旦某些代码被修改,采用逆向工程,将修改后的代码转换为设计模型。
自从1997年正式发布UML以后,出现了许多UML建模CASE工具。其中最具代表性的两款CASE工具是Sparx Systems的Enterprise Architect和IBM 的Rational Rose。
14.2 正向工程
正向工程(代码生成)是指把Rose模型中的一个或多个类图转换为Java源代码的过程。Rational Rose里的正向工程是以组件为单位的。即Java源代码的生成是以组件为单位的,不是以类为单位的。所以,创建一个类后需要把它分配给一个有效的Java组件。如果模型的缺省语言是Java,Rose会自动为这个类创建一个组件。
当对一个设计模型元素进行正向工程时,模型元素的特征会映射成Java语言的框架结构。例如,Rose中的类会通过它的组件生成一个.java文件;Rose中的包会生成一个java包。另外,当把一个UML包进行正向工程时,将把属于该包的每一个组件都生成一个.java文件。
14.2 正向工程
Rose工具能够使代码与UML模型保持一致,每次创建或修改模型中的UML元素,它都会自动进行代码生成。缺省情况下,这个功能是关闭的,可以通过【Tools→Java→Preject Specification】打开该功能,选择“Code Generation”选项卡,选中“Automatic Synchronization”,如图14-1所示。
图14-1所示的“Code Generation”窗口是代码生成时最常用的一个窗口,下面对该窗口中的每项做详细的介绍。
(1)IDE:指定与Rose相关联的Java开发环境。下拉框列出了系统注册表里的IDE。Rose可以识别的开发环境有以下几种:VisualAge for Java,VisualCafe,Forte for Java以及JBuilder。缺省的IDE是Rose内部编辑器,它使用Sun的JDK。
14.2 正向工程
(2)Default Data Types:该项用来设置缺省数据类型,当创建新的属性和方法时,Rose就会使用这个数据类型。缺省情况下,属性的数据类型是int,方法返回值的数据类型是void。
(3)Prefixes该项设定缺省前缀(如果有的话),Rose会在创建实例和类变量的时候使用这个前缀。缺省不适用前缀。
(4)Generate Rose ID:设定Rose是否在代码中为每个方法都加惟一的标识符。Rose使用这个RoseID来识别代码中名称被改动的方法。缺省情况下,将生成RoseID.如果关闭了“Automatic Synchronization”,就需要打开该功能。
图14-1 打开自动同步
14.2 正向工程
(5)Generate Default Return Line:设定Rose是否在每个类声明后面都生成一个返回行。缺省情况下,Rose将生成返回行。
(6)Stop on Error:设定Rose 在生成代码时,是否在遇到第一个错误时就停止。缺省情况下这一项是关闭的,因此即使遇到错误,也会继续生成代码。
(7)Create Missing Directories:如果在Rose模型中引用了包,这项将指定是否生成没有定义的目录。缺省情况下,这个功能是开启的。
(8)Automatic Synchronization Mode:当启用这项时,Rose会自动保持代码与模型同步,也就是说代码中的任何变动都会立即在模型中反映出来,反过来也一样的。缺省情况下,没有使用这个功能。
(9)Show Progress Indicator:指定Rose是否在遇到复杂的同步操作时显示进度栏。缺省情况下不会显示。
14.2 正向工程
(10)Source Code Control:指定对哪些文件进行源码控制。
(11)Put source code of the project under Source Control:是否使用Rose J/CM Intergration对Java源代码进行版本控制。
(1)Input Checkin/Checkout comment:指定用户是否需要对检入/检出代码的活动进行说明。
(2)Select Source Root Path for Source Control:选择存放生成的代码文件的路径。
下面将详细介绍如何从模型生成Java代码:
1. 将UML类加入模型中的Java组件
14.2 正向工程
Rose会将.java文件与模型中的组件联系起来。因此,Rose要求模型中的每个Java类都必须属于组件视图中的某个Java组件。
有两种给组件添加Java类的方法。
(1)当启动代码生成时,可以让Rose自动创建组件。如果这样,Rose会为每个类都生成一个.java文件和一个组件。为使用这个功能,必须将模型的缺省语言设置为Java,可以通过【Tools→Options→Notation→Default Language】进行设置
Rose不会自动为多个类生成一个.java文件。如果将Java类分配给一个逻辑包,Rose将为组件视图中的物理包创建一个镜像,然后用它创建目录或是基于模型中包的Java包。
(2)可以自己创建组件,然后显式地将类添加到组件视图中。这样做可以将多个类生成的代码放在一个.java文件中。
14.2 正向工程
有两种方法可以将一个类添加到组件中。无论选择哪种方法,都必须首先创建这个组件。
第1种,使用游览器将类添加到组件中。首先在游览器视图中选择一个类,然后将将类拖放到适当的组件上。这样,就会在该类名字后面列出其所在组件的名字;第2种,使用Rose里的“Component Specification”窗口。首先打开组件的标准说明:如果该组件不是一个Java组件(也就是它的语言仍然是Anaysis),双击浏览器或图中的组件;如果它已经是Java组件,选中它并单击右键然后选择【Open Standard Specification】子菜单。
2. 语法检查
这是一个可选的步骤。生成代码前,可以选择对模型组件的语法进行检查。在生成代码时Rose会自动进行语法检查。Rose的Java语法检查是基于Java代码语义的。
可以通过以下的步骤对模型组件进行Java语法错误检查。
(1)打开包含将用于生成代码的组件图。
14.2 正向工程
(2)在该图中选择一个或多个包和组件。
(3)使用【Tools→Java/J2EE→Sysntax Check】对其进行语法检查。
(4)查看Rose的日志窗口。如果发现有语法错误,生成的代码有可能不能编译。
(5)对组件进行修改。
3. 设置“Classpath”
14.2 正向工程
通过【Tools→Java/J2EE→Project Specification..】打开Rose中的“Java Project Specification”,其中“ClassPath”选项卡,为模型指定一个Java类路径。
4. 设置“Code Generation”参数
5. 备份文件
代码生成以后,Rose将会生成一份当前源文件的备份,它的前缀是.jv~。在用代码生成设计模型时,必须将源文件备份。如果多次为同一个模型生成代码,那么新生成的文件会覆盖原来的.jv~文件。
6. 生成Java代码
选择至少一个类或组件,然后选择【Tools-Java/J2EE→Generate Code】子菜单。如果是第1次使用该模型生成代码,那么会弹出一个映射对话框,它允许用户将包和组件映射到“classpath”属性设置的文件夹中。
14.3 逆向工程
逆向工程是分析Java代码,然后将其转换到Rose模型的类和组件的过程。Rational Rose允许从Java源文件(.java文件)、Java字节码(.class文件)以及一些打包文件(.zip .cab .jar文件)中进行逆向工程。
下面将会详细介绍逆向工程的过程。
(1)设置或检查CALSSPATH环境变量。Rose要求将CLASSPATH环境设置为JDK的类库。根据使用的JDK的版本不同,CLASSPATH可以指向不同类型的类库文件,例如.zip 等。
设置CLASSPATH环境变量的步骤如下。
14.3 逆向工程
首先,右击“我的电脑”,然后选择【属性→高级】选项,单击【环境变量】按钮
在“系统变量”区域中,首先查找是否已经有了CLASSPATH环境变量。如果没有,单击【新建】按钮,如果有,则单击【编辑】按钮,然后在弹出的对话框中输入路径。
另外,还需要为自己的库创建一个Classpath属性。可以使用“project Specification”窗口中的“Classpath”选项进行设置。
(2)启动逆向工程。有3种方式可以启动逆向工程。第1种,选择一个或多个类,然后单击【Tools→Java/J2EE→Reverse Engineer】子菜单;第2种,右键单击某个类,然后在弹出的菜单中选择【Java/J2EE→Reverse Engineer】;第3种,将文件拖放到Rose模型中的组件图或类图中。当拖放.zip 、.cab和.jar文件时,Rose会自动将它们解压。注意,Rose不能将代码生成这种文件。
14.4 实例应用
1.生成代码实例
由于Rose的正向工程只能从UML类生成代码,所以首先必须画出类图。以下面的类为例,如图14-2所示:选中这些类,然后选择【ToolsJava/J2EEGenerate Code】,如果还没设置Classpath,那么会弹出一个对话框(如图14-3),要求选择Classpath,如果当前还没有Classpath,点击“Edit”,进行Classpath配置。
图14-2
14.4 实例应用
选择下图(图14-4)中右边的第一个“添加”按钮,弹出选择Classpath配置确认框(图14-5)。
图14-4
图14-5 Classpath配置确认框
14.4 实例应用
Classpath配置有两种形式:
一种是选择.jar或.zip+Directory形式——将Classpath指向为JDK的类库文件(如:C:\Program Files\Java\\lib\),另外再定义一个Directory(如D:\),可将生成的java文件放在这个独立的Directory下。
一种是只选择Directory——将Classpath指向为JDK的类库Directory(如:C:\Program Files\Java\\lib),则生成的java文件将放在C:\Program Files\Java\\lib下。
这里选择第一种形式,配置如下图14-6所示。
图14-6
14.4 实例应用
按“确定”返回。选择设定的Classpath,然后在右面选中所有的类,最后点击【OK】,Rose就开始生成Java代码,如图14-7所示。
在Classpath下可以找到已经生成的Java文件,如图图14-8所示:
14.4 实例应用
基类Person的源代码如下:
//Source file: D:\\JavaSource\\
public class Person
{
private String name;
private String ID;
private String address;
private String phoneNo;
/**
@roseuid 4921532B01A5
*/
public Person()
14.4 实例应用
{
}
/**
@roseuid 492152A003A9
*/
public void getName()
{
}
/**
@roseuid 4921532B0138
*/
public void setName()
{
14.4 实例应用
}
/**
@roseuid 49215335002E
*/
public void getID()
{
}
/**
@roseuid 4921533E031C
*/
public void setID()
{
14.4 实例应用
}
/**
@roseuid 49215343000F
*/
public void getAddress()
{
}
/**
@roseuid 4921534E030D
*/
public void setAddress()
{
}
14.4 实例应用
}
再看看,Rose是否在代码里保持了模型中的继承关系,以Customer子类为例,代码如下:
//Source file: D:\\JavaSource\\
public class Customer extends Person
{
private String CarType;
private String licenceNo;
private String RequestOrder;
/**
@roseuid 4921539A000F
*/
14.4 实例应用
public Customer()
{
}
}
令人欣喜的是,它保持了模型中的继承关系。代码生成后,开发者就可以在这个代码框架中实现具体的方法,大大节省了开发的时间。
2.逆向工程实例
14.4 实例应用
修改Customer类,在里面加入一个print方法,暂时不加入任何实现内容,再去掉RequestOrder成员变量。
public void print(){} Rational Rose的逻辑视图中选择Customer类,单击右键在弹出的菜单中选择【Java/J2EEReverse Engineer】子菜单。弹出如图14-9所示的窗口。
在左边的目录结构选择D:\JavaSource,然后右边就会显示出该目录下的.java文件,选择文件,点击【Reverse】按钮,完成以后点击【Done】按钮,可以发现Customer类发生了变化,如图14-10所示。
图14-10
小结
双向工程包括正向工程和逆向工程。正向工程指把设计模型映射为代码;逆向工程是指将代码转换成设计模型。
正向工程把设计模型转换为代码框架,开发者不需要编写类、属性、方法代码。一般情况下,开发人员将系统设计细化到一定的级别,然后应用正向工程。
逆向工程是分析Java代码,然后将其转换到Rose模型的类和组件的过程。Rational Rose允许从Java源文件(.java文件)、Java字节码(.class文件)以及一些打包文件(.zip .cab .jar文件)中进行逆向工程。