logo资料库

UML基础.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
UML基础: 统一建模语言简介
UML 基础: 统一建模语言简介 级别: 初级 Donald Bell 文档选项 将此页作为电子邮 件发送 拓展 Tomcat 应用 下载 IBM 开源 J2EE 应用服务器 WAS CE 新版本 V1.1 XML error: Please enter a value for the author element's jobtitle attribute, or the company-name element, or both. 2004 年 2 月 01 日 回顾 20 世纪晚期--准确地说是 1997 年,OMG 组织(Object Management Group 对象管理组织) 发布了统一建模语言(Unified Modeling Language,UML)。UML 的目标之一就是为开发团队提供标 准通用的设计语言来开发和构建计算机应用。UML 提出了一套 IT 专业人员期待多年的统一的标准建模符 号。通过使用 UML,这些人员能够阅读和交流系统架构和设计规划--就像建筑工人多年来所使用的建筑 设计图一样。 到了 21 世纪--准确地说是 2003 年,UML 已经获得了业界的认同。在我所见过的专业人员的简历中, 75%都声称具备 UML 的知识。然而,在同绝大多数求职人员面谈之后,可以明显地看出他们并不真正了 解 UML。通常地,他们将 UML 用作一个术语,或对 UML 一知半解。大家对 UML 缺乏理解的这种状况, 促进我撰写这篇关于 UML 1.4 的快速入门文章。当阅读完本文时,您还不具备足够的知识可以在简历上 声称自己掌握了 UML,但是您已具有了进一步钻研该语言的良好起点。 一些背景知识 正如前面曾提到过的,UML 的本意是要成为一种标准的统一语言,使得 IT 专业人员能够进行计算机应用 程序的建模。UML 的主要创始人是 Jim Rumbaugh、Ivar Jacobson 和 Grady Booch,他们最初都有 自己的建模方法(OMT、OOSE 和 Booch),彼此之间存在着竞争。最终,他们联合起来创造了一种开 放的标准。(听起来是不是很熟悉?这个现象类似 J2EE、SOAP 和 Linux 的诞生。)UML 成为"标准" 建模语言的原因之一在于,它与程序设计语言无关。(IBM Rational 的 UML 建模工具被广泛应用于 J2EE 和.NET 开发。)而且,UML 符号集只是一种语言而不是一种方法学。这点很重要,因为语言与方法学不 同,它可以在不做任何更改的情况下很容易地适应任何公司的业务运作方式。 既然 UML 不是一种方法学,它就不需要任何正式的工作产品(即 IBM Rational Unified Process?术语 中所定义的"工件")。而且它还提供了多种类型的模型描述图(diagram),当在某种给定的方法学中使 用这些图时,它使得开发中的应用程序的更易理解。UML 的内涵远不只是这些模型描述图,但是对于入 门来说,这些图对这门语言及其用法背后的基本原理提供了很好的介绍。通过把标准的 UML 图放进您的
工作产品中,精通 UML 的人员就更加容易加入您的项目并迅速进入角色。最常用的 UML 图包括:用例 图、类图、序列图、状态图、活动图、组件图和部署图。 深入讨论每类图的细节问题已超出了这篇入门文章的范围。因此,下面仅给出了每类图的简要说明,更详 细的信息将在以后的文章中探讨。 用例图 回页首 用例图描述了系统提供的一个功能单元。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统 的功能需求,包括基于基本流程的"角色"(actors,也就是与系统交互的其他实体)关系,以及系统内用 例之间的关系。用例图一般表示出用例的组织关系--要么是整个系统的全部用例,要么是完成具有功能(例 如,所有安全管理相关的用例)的一组用例。要在用例图上显示某个用例,可绘制一个椭圆,然后将用例 的名称放在椭圆的中心或椭圆下面的中间位置。要在用例图上绘制一个角色(表示一个系统用户),可绘 制一个人形符号。角色和用例之间的关系使用简单的线段来描述,如图 1 所示。 图 1:示例用例图 图字(从上到下):CD 销售系统;查看乐队 CD 的销售统计;乐队经理;查看 Billboard 200 排行榜 报告;唱片经理;查看特定 CD 的销售统计;检索最新的 Billboard 200 排行榜报告;排行榜报告服
务 用例图通常用于表达系统或者系统范畴的高级功能。如图 1 所示,可以很容易看出该系统所提供的功能。 这个系统允许乐队经理查看乐队 CD 的销售统计报告以及 Billboard 200 排行榜报告。它也允许唱片经 理查看特定 CD 的销售统计报告和这些 CD 在 Billboard 200 排行榜的报告。这个图还告诉我们,系统 将通过一个名为"排行榜报告服务"的外部系统提供 Billboard 排行榜报告。 此外,在用例图中,没有列出的用例表明了该系统不能完成的功能。例如,它不能提供给乐队经理收听 Billboard 200 上不同专辑中的歌曲的途径 -- 也就是说,系统没有引用一个叫做"收听 Billboard 200 上的歌曲"的用例。这种缺少不是一件小事。在用例图中提供清楚的、简要的用例描述,项目赞助商就很 容易看出系统是否提供了必须的功能。 类图 回页首 类图表示不同的实体(人、事物和数据)如何彼此相关;换句话说,它显示了系统的静态结构。类图可用 于表示逻辑类,逻辑类通常就是业务人员所谈及的事物种类--摇滚乐队、CD、广播剧;或者贷款、住房 抵押、汽车信贷以及利率。类图还可用于表示实现类,实现类就是程序员处理的实体。实现类图或许会与 逻辑类图显示一些相同的类。然而,实现类图不会使用相同的属性来描述,因为它很可能具有对诸如 Vector 和 HashMap 这种事物的引用。 类在类图上使用包含三个部分的矩形来描述,如图 2 所示。最上面的部分显示类的名称,中间部分包含 类的属性,最下面的部分包含类的操作(或者说"方法")。 图 2:类图中的示例类对象 根据我的经验,几乎每个开发人员都知道这个类图是什么,但是我发现大多数程序员都不能正确地描述类 的关系。对于像图 3 这样的类图,您应该使用带有顶点指向父类的箭头的线段来绘制继承关系 1,并且箭 头应该是一个完全的三角形。如果两个类都彼此知道对方,则应该使用实线来表示关联关系;如果只有其 中一个类知道该关联关系,则使用开箭头表示。
图 3:一个完整的类图,包括了图 2 所示的类对象 在图 3 中,我们同时看到了继承关系和两个关联关系。CDSalesReport 类继承自 Report 类。一个 CDSalesReport 类与一个 CD 类关联,但是 CD 类并不知道关于 CDSalesReport 类的任何信息。CD 类和 Band 类都彼此知道对方,两个类彼此都可以与一个或者多个对方类相关联。 一个类图可以整合其他许多概念,这将在本系列文章的后续文章中介绍。 序列图 回页首 序列图显示具体用例(或者是用例的一部分)的详细流程。它几乎是自描述的,并且显示了流程中中不同 对象之间的调用关系,同时还可以很详细地显示对不同对象的不同调用。 序列图有两个维度:垂直维度以发生的时间顺序显示消息/调用的序列;水平维度显示消息被发送到的对 象实例。 序列图的绘制非常简单。横跨图的顶部,每个框(参见图 4)表示每个类的实例(对象)。在框中,类实 例名称和类名称之间用空格/冒号/空格来分隔,例如,myReportGenerator : ReportGenerator。如 果某个类实例向另一个类实例发送一条消息,则绘制一条具有指向接收类实例的开箭头的连线,并把消息 /方法的名称放在连线上面。对于某些特别重要的消息,您可以绘制一条具有指向发起类实例的开箭头的 虚线,将返回值标注在虚线上。就我而言,我总喜欢绘制出包括返回值的虚线,这些额外的信息可以使得 序列图更易于阅读。 阅读序列图也非常简单。从左上角启动序列的"驱动"类实例开始,然后顺着每条消息往下阅读。记住:虽 然图 4 所示的例子序列图显示了每条被发送消息的返回消息,但这只是可选的。
图 4:一个示例序列图 通过阅读图 4 中的示例序列图,您可以明白如何创建一个 CD 销售报告(CD Sales Report)。其中的 aServlet 对象表示驱动类实例。aServlet 向名为 gen 的 ReportGenerator 类实例发送一条消息。该消 息被标为 generateCDSalesReport,表示 ReportGenerator 对象实现了这个消息处理程序。进一步 理解可发现,generateCDSalesReport 消息标签在括号中包括了一个 cdId,表明 aServlet 随该消息 传递一个名为 cdId 的参数。当 gen 实例接收到一条 generateCDSalesReport 消息时,它会接着调用 CDSalesReport 类,并返回一个 aCDReport 的实例。然后 gen 实例对返回的 aCDReport 实例进行调 用,在每次消息调用时向它传递参数。在该序列的结尾,gen 实例向它的调用者 aServlet 返回一个 aCDReport。 请注意:图 4 中的序列图相对于典型的序列图来说太详细了。然而,我认为它才是足够易于理解的,并 且它显示了如何表示嵌套的调用。对于初级开发人员来说,有时把一个序列分解到这种详细程度是很有必 要的,这有助于他们理解相关的内容。 状态图 回页首 状态图表示某个类所处的不同状态和该类的状态转换信息。有人可能会争论说每个类都有状态,但不是每 个类都应该有一个状态图。只对"感兴趣的"状态的类(也就是说,在系统活动期间具有三个或更多潜在状 态的类)才进行状态图描述。 如图 5 所示,状态图的符号集包括 5 个基本元素:初始起点,它使用实心圆来绘制;状态之间的转换, 它使用具有开箭头的线段来绘制;状态,它使用圆角矩形来绘制;判断点,它使用空心圆来绘制;以及一 个或者多个终止点,它们使用内部包含实心圆的圆来绘制。要绘制状态图,首先绘制起点和一条指向该类 的初始状态的转换线段。状态本身可以在图上的任意位置绘制,然后只需使用状态转换线条将它们连接起 来。
图 5:显示类通过某个功能系统的各种状态的状态图 图 5 中的状态图显示了它们可以表达的一些潜在信息。例如,从中可以看出贷款处理系统最初处于 Loan Application 状态。当批准前(pre-approval)过程完成时,根据该过程的结果,或者转到 Loan Pre-approved 状态,或者转到 Loan Rejected 状态。这个判断(它是在转换过程期间做出的)使用一 个判断点来表示--即转换线条间的空心圆。通过该状态图可知,如果没有经过 Loan Closing 状态,贷款 不可能从 Loan Pre-Approved 状态进入 Loan in Maintenance 状态。而且,所有贷款都将结束于 Loan Rejected 或者 Loan in Maintenance 状态。 活动图 回页首 活动图表示在处理某个活动时,两个或者更多类对象之间的过程控制流。活动图可用于在业务单元的级别 上对更高级别的业务过程进行建模,或者对低级别的内部类操作进行建模。根据我的经验,活动图最适合 用于对较高级别的过程建模,比如公司当前在如何运作业务,或者业务如何运作等。这是因为与序列图相 比,活动图在表示上"不够技术性的",但有业务头脑的人们往往能够更快速地理解它们。 活动图的符号集与状态图中使用的符号集类似。像状态图一样,活动图也从一个连接到初始活动的实心圆 开始。活动是通过一个圆角矩形(活动的名称包含在其内)来表示的。活动可以通过转换线段连接到其他 活动,或者连接到判断点,这些判断点连接到由判断点的条件所保护的不同活动。结束过程的活动连接到 一个终止点(就像在状态图中一样)。作为一种选择,活动可以分组为泳道(swimlane),泳道用于表 示实际执行活动的对象,如图 6 所示。
图 6:活动图,具有两个泳道,表示两个对象的活动控制:乐队经理,以及报告工具 图字(沿箭头方向):乐队经理;报告工具;选择"查看乐队的销售报告";检索该乐队经理所管理的乐队; 显示报告条件选择屏幕;选择要查看其销售报告的乐队;从销售数据库检索销售数据;显示销售报告。 该活动图中有两个泳道,因为有两个对象控制着各自的活动:乐队经理和报告工具。整个过程首先从乐队 经理选择查看他的乐队销售报告 肌H缓蟊ǜ婀ぞ呒焖鞑⑾允舅 芾淼乃 欣侄樱 ⒁ 笏 又醒≡褚桓 隼侄印T诶侄泳 硌≡褚桓隼侄又 螅 ǜ婀ぞ呔图焖飨 坌畔⒉⑾允鞠 郾ǜ妗8没疃 急砻鳎 允颈ǜ 媸钦 龉 讨械淖詈笠徊健? 组件图 回页首 组件图提供系统的物理视图。它的用途是显示系统中的软件对其他软件组件(例如,库函数)的依赖关系。
组件图可以在一个非常高的层次上显示,从而仅显示粗粒度的组件,也可以在组件包层次 2 上显示。 组件图的建模最适合通过例子来描述。图 7 显示了 4 个组件:Reporting Tool、Billboard Service、 Servlet 2.2 API 和 JDBC API。从 Reporting Tool 组件指向 Billboard Service、Servlet 2.2 API 和 JDBC API 组件的带箭头的线段,表示 Reporting Tool 依赖于那三个组件。 图 7:组件图显示了系统中各种软件组件的依赖关系 回页首 部署图 部署图表示该软件系统如何部署到硬件环境中。它的用途是显示该系统不同的组件将在何处物理地运行, 以及它们将如何彼此通信。因为部署图是对物理运行情况进行建模,系统的生产人员就可以很好地利用这 种图。 部署图中的符号包括组件图中所使用的符号元素,另外还增加了几个符号,包括节点的概念。一个节点可 以代表一台物理机器,或代表一个虚拟机器节点(例如,一个大型机节点)。要对节点进行建模,只需绘 制一个三维立方体,节点的名称位于立方体的顶部。所使用的命名约定与序列图中相同:[实例名称] : [实 例类型](例如,"w3reporting.myco.com : Application Server")。 图 8:部署图。由于 Reporting Tool 组件绘制在 IBM WebSphere 内部,后者又绘制在节点
分享到:
收藏