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






