类图实现及其java代码码可以在类图也可以在组件图中生成,为什么

本文面向于那些软件架构师设計师和开发人员,他们想使用 IBM? Rational? Software Architect 从 Java? 源代码来逆向工程生成 UML 类和序列图 逆向工程经常被用来从已有的源代码中以一种抽象模型 UML 格式来獲得丢失的设计文档,其可以用来研究一个系统的静态结构和动态行为并用于扩展新的特性到产品。 作者详细说明了使用 IBM Rational Software Architect 进行逆向工程嘚限制并阐述了克服这些限制的技术。 您将从使用这些技术技巧和窍门中受益以识别组件,并从 Java 类中产生像 UML 类和序列图这样的高层抽潒

软件结构师、开发人员及测试人员都熟知统一建模语言(UML),该语言适用于文档化用例、类图、序列图和其他图表也可以通过其他许多軟件辅助工具来帮助软件工程师来完成这些工作,或者是 正向工程 或者是 逆向工程的

正向工程是对一个系统物理结构实现的高层抽象性、逻辑性及独立性设计的传统处理过程。

逆向工程是对一个已存在系统的分析处理以鉴别它的组成部分及它们的内在联系,从而以高层抽象性来构建一个系统的框架在大多数情况下,逆向工程用于以抽象的模型 UML 格式从已存在的源代码中提取已丢失的设计文件,从而同時可得知一个系统的静态结构及动态行为

输出产物的技术。本篇文章论证了怎样使用这里介绍的技术技巧从 Java 代码中识别其组成部分及對 UML 种类和序列图进行高层的抽象。

使用逆向工程您可以很容易就从正向工程中得到您想要的,本篇文章将介绍在逆向工程以下领域中存茬的问题:

发现其抽象类及识别它们的等级结构

产生具有聚合及关联关系的高层抽象性的类图

接下来的部分为每个问题提供一个解决方案并论证了怎样产生有意义的类及序列图。例子向您展示了怎样从一个已给 Java 项目的源代码中识别一个系统的继承关系及组成部分,以对 UML 類图及序列图进行高层的抽象

识别一个 UML 类图的继承树

继承关系是一种普遍的对象型的模式。它允许一组类共享共同的状态和行为从而孓类可以从父类那里继承共同的状态和行为。从一个已存在系统中发现整个的继承树结构是相当有用的因为它能向您揭露在树中什么是頂级类以及什么是子类。而且您可以识别一个继承树中有哪些共同状态及行为,以及这些共同行为怎样起作用您可以在探索过程中以鉯下三种方式使用

从一个工作场所或工作集中发现其抽象结构

从抽象结构表中选择一个类从而显示其抽象类图

在一个浏览表中研究树状结構,您会发现显示在 Abstraction之下的一系列抽象类

第一步是在一个已存在系统中自动得到其顶级类。这样您就能使用这些类作为切入点以研究继承树中的类您可以按以下步骤来完成此项。

这可以揭示整个工作空间的架构

图 1.发现整个工作空间的架构

图 2 显示了得到一个抽象类图的樹状结构所需的剩余步骤:

通过右键点击位于 Abstraction之下的类 Car来打开内容菜单。

显示右边面板中 Car类图通过选择菜单中的 Show Diagram选项。

通过选择并右键點击右边面板中类图 Car来打开内容菜单

做完第六步,您将在右边面板中见到 Car类图的树状结构

图 2. 从整个工作场所中发现其抽象结构

结构树Φ被发现类的同类及子类可能被丢失。

除去被发现的抽象类之外其他类没有属性及操作。

要得到第六步产生的树状结构还需其他的步驟。您需要增加分离度(如图 3 所示)这决定了从被发现类扩展的层。

默认度是 1这就是为什么在继承树中一些子类会丢失的原因。在本例中分离度被增加至 2。

第二个问题是除了在树状结构中被发现的类其他类没有属性和操作。这不利于使用者出于再使用的目的来研究已存茬的普遍模式

接下来的例子将向您展示,怎样识别具有任意属性及操作的整个继承树

切换至 Diagram Navigation视图,按以上步骤所述从工作场所中发現其抽象结构。

从您感兴趣的第二步中找出一个抽象类

通过寻找模型搜索器中的类,找出等级树状结构类 双击打开编辑器中的类,按丅 F4以打开等级树确保 type hierarchy已被选择。

图 4 . 将类可视化为新的类图

图 5 展示了产生一个继承树类图的过程:

打开并按下 F4以显示类的等级

选择每一個类并将其添加到类图中。

图 5. 产生一个继承树类图的机理

默认格式产生有几个有用的修改可以帮助您将图表进行可视化。例如您可以修改连接路径样式以使用树状样式路径

,并且您可以通过在工作区右键点击来打开内容菜单然后点击 Arrange all到此产生的类图要比自动产生的看仩去更好。如图 6 所示

图 6. 带有属性的继承树状图及树状路径连接

图6中的类既显示了属性又显示了操作。属性及操作显示的好处在于您可鉯研究它们共同的状态及行为,从而进一步了解一个已存在系统是如何被实现的这将有助于系统的再使用。

产生一个高层的 UML 类图

在模型搜索器中使用 Visualize来将它们添加到一个新图或当前的类图中。

如果多个类已经被添加到当前的图中那么它们之间的关系也将被显示。

图 7 是┅个从 Java 代码中自动产生的类图的例子

图 7. 一个自动产生的类图

如图 7 所示您可以从模型搜索器中选择多个 Java 文件 来将它们在新的类图中可视化。如果您想添加更多的类您可以选择更多的 Java

源代码来将它们在当前的类图中可视化。本图显示类包括在项目及它们的基本关系中这有利于在项目中自动发现 UML

类,但是自动发现的关系在这里用处不大

在图 7 中,几乎所有的关系是 use除去继承关系使用关系太过平常以至于不能给出有用的设计信息,越来越多的特别的聚集及组成关系被隐藏了甚至当所有的关系在图中都出现过聚集关系表现为一对多关系当一個类含有其他类的很多项目时,组成关系用于描述一多一关系当一个类仅含有其他类的一个例子时这个高层的抽象意味着对类之间更精確的关系发现,并为本设计的执行提供了有用的信息这个类图如果没有抽象关系的细节将不再像以前那样有用。

这里我们尝试并探索叻,以半自动方法产生UML类图的高层抽象方案 UML 类以和以前同样的技术发现,并且类间的关系由人为指定高层的抽象方案基于研究已有源玳码所必须的知识。

图 8 的例子显示了怎样应用这个方法来得到高层的 UML 类图。

图 8. 使用 UML 模型向导建立一个空白模型

为了得到一个高层的类图您必须首先建立一个空白模型。

按图 8 所述步骤建立一个新的空白模型:在文件种类下选择 UML Modeling。

对于目的文件夹输入 example。

中的总结能让您从一个类中拷贝一个类并粘贴到另一个类图中,这必须在一个空白模型中完成如果您将总结的类粘贴到同一个类图,或本空白模型以外另一个类图中时那么该类的属性和功能将丢失。

在一个已选类上右键点击以打开内容菜单

将已总结的类粘贴至分离的创建于步 2 的类图Φ

在类间创建聚集及组成关系。

图 9. 一个类图中的总结类

下一步在类间创建关联关系,这使您能够在聚集及组成关系中选择一个图 10 显礻了一个高层的类图。

图 10. 半自动方法产生的 UML 类图的高层抽象

通过将图 10 与图 9 进行比较您可以发现半自动方法能精确显示类间关系。本图可鼡于独立设计执行文件或已有系统远期改善。

序列图是应用最为广泛的 UML 动态建模方法它致力于识别一个系统的行为。一个序列图通常應用于建模用例以显示一个系统的方法及功能。

创建一个序列图:在 Blank Model上右键点击

在两个类间对方法标记进行排序。

图 11. 创建一个序列图

當您完成创建一个序列图一个序列文件产生于 Collaboration: Interaction标签下。 您可以从 Java 代码中向序列图添加类二者均见于图 12 。

图 12 的主要工作区显示了一个序列图的例子

一个方法调用意味着信息从召集者传向被召集者。被召集者是方法所有人它从方法召集者那里收到信息。信息可以是单道嘚也可以是双道的一个序列图由在处于一组方法所有者及一个初始发起者之间的,一系列方法标记组成第一个标记必须从发起第一个方法标记的地方开始。

类及序列图层级类图代表着一种方式,该方式能发现在一个项目或工作集中发


这里不会将UML的各种元素都提到峩只想讲讲类图中各个类之间的关系; 能看懂类图中各个类之间的线条、箭头代表什么意思后,也就足够应对 日常的工作和交流; 同时峩们应该能将类图所表达的含义和最终的代码对应起来; 有了这些知识,看后面章节的设计模式结构图就没有什么问题了;


请看以下这个類图类之间的关系是我们需要关注的:
  • 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;
  • 尛汽车为与SUV之间也是继承关系它们之间的关系为泛化关系,使用带空心箭头的实线表示;
  • 小汽车与发动机之间是组合关系使用带实心箭头的实线表示;
  • 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
  • 学生与身份证之间为关联关系使用一根实线表示;
  • 学生上學需要用到自行车,与自行车是一种依赖关系使用带箭头的虚线表示;

下面详细介绍这六种关系;


继承关系为 is-a的关系;两个对象之间如果可以用 is-a 来表示,就是继承关系:(..是..)

eg:自行车是车、猫是动物

泛化关系用一条带空心箭头的直接表示;如下图表示(A继承自B);

eg:汽车茬现实中有实现可用汽车定义具体的对象;汽车与SUV之间为泛化关系;

注:最终代码中,泛化关系表现为继承非抽象类;

实现关系用一条帶空心箭头的虚线表示;

eg:”车”为一个抽象概念在现实中并无法直接用来定义对象;只有指明具体的子类(汽车还是自行车),才 可以用來定义对象(”车”这个类在C++中用抽象类表示在JAVA中有接口这个概念,更容易理解)

注:最终代码中实现关系表现为继承抽象类;

聚合關系用一条带空心菱形箭头的直线表示,如下图表示A聚合到B上或者说B由A组成;

聚合关系用于表示实体对象之间的关系,表示整体由部分構成的语义;例如一个部门由多个员工组成;

与组合关系不同的是整体和部分不是强依赖的,即使整体不存在了部分仍然存在;例如, 部门撤销了人员不会消失,他们依然存在;

组合关系用一条带实心菱形箭头直线表示如下图表示A组成B,或者B由A组成;

与聚合关系一樣组合关系同样表示整体由部分构成的语义;比如公司由多个部门组成;

但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了则部分也不存在了;例如, 公司不存在了部门也将不存在了;

关联关系是用一条直线表示的;它描述不同类的对象之间的结构关系;咜是一种静态关系, 通常与运行状态无关一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是┅种“强关联”的关系;

比如乘车人和车票之间就是一种关联关系;学生和学校就是一种关联关系;

关联关系默认不强调方向,表示对潒间相互知道;如果特别强调方向如下图,表示A知道B但 B不知道A;

注:在最终代码中,关联对象通常是以成员变量的形式实现的;

依赖關系是用一套带箭头的虚线表示的;如下图表示A依赖于B;他描述一个对象在运行期间会用到另一个对象的关系;

与关联关系不同的是它昰一种临时性的关系,通常在运行期间产生并且随着运行时的变化; 依赖关系也可能发生变化;

显然,依赖也有方向双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖杜绝双向依赖的产生;

注:在最终代码中,依赖关系体现为类构造方法及类方法的传入参數箭头的指向为调用关系;依赖关系处理临时知道对方外,还是“使用”对方的方法和属性;

我要回帖

更多关于 类图实现及其java代码 的文章

 

随机推荐