UML简介1介绍

1 介绍

1.1 UML的历史

面向对象起源于20世纪60年代初的工作。最初的想法是在Sketchpad等系统中实现的,它提供了一种新的、人与计算机之间的图形通信方法。

编程语言SIMULA被认为是第一种面向对象的编程语言。SIMULA主要用于开发仿真软件,并没有得到特别广泛的应用。它已经包含了类、对象、继承和动态绑定等概念。

这些概念的引入是软件开发革命的开端。在随后的几十年中,出现了大量基于面向对象范式的面向对象编程语言。其中包括 Python、C++、Eiffel和 Smalltalk等语言。它们已经包含了现代编程语言的许多重要概念,并一直沿用至今。

面向对象作为软件工程方法的出现和引入与面向对象编程语言的出现密切相关。如今,面向对象已成为处理软件系统复杂性的一种行之有效的方法。它不仅应用于编程语言,还应用于其他领域,如数据库或用户界面描述。

软件系统是一种抽象概念,旨在借助机器解决现实世界中的问题。程序化编程语言并不一定是描述现实世界的最合适工具:对问题的自然描述与作为程序的实际实现在概念上存在巨大差异。面向对象编程试图开发出更好的程序,尤其是更易于维护的程序。

20世纪80年代,由美国国防部资助的编程语言Ada因其强大的概念和高效的编译器而大受欢迎。即使在当时,Ada也支持包形式的抽象数据类型和任务形式的并发性。包允许将规范和实现分离,允许使用对象和对象类。因此,Ada从根本上区别于当时流行的其他语言,如Fortran和Cobol。因此,人们对面向对象的分析和设计方法有了很大的需求,以简化Ada程序的开发。

由于Ada的广泛传播和来自美国国防部的压力,这些建模方法都是专门针对Ada的特点而设计的。Grady Booch是最早发表关于Ada程序面向对象设计的 Booch 方法的研究人员之一。

随着时间的推移,又出现了许多面向对象的建模方法。一般来说,这些建模方法要么与编程语言有密切联系,如Booch方法;要么与数据建模有密切联系,如Rumbaugh等人提出的ObOMT方法。

对象建模技术(OMT Object Modeling Technique)方法由 James Rumbaugh 等人开发。OMT 支持复杂对象的开发,是实体-关系模型的面向对象扩展,而实体-关系模型是为描述数据库而引入的。

Ivar Jacobson等人提出了Object OOSE 方法。这种方法最初是为描述电信系统而开发的。

20世纪80年代和90年代初,建模领域充斥着多种不同的建模语言。为了解决由此产生的兼容性问题,我们付出了巨大的努力。不同项目合作伙伴的模型往往互不兼容,在不同项目中重用模型也并非总是可行。结果,人们疲于讨论不同的符号,而忽略了实际的建模问题。由于新的建模语言层出不穷,人们并不清楚哪些值得投资,哪些只是短暂的趋势。如果一种语言不被接受,那么在项目或公司中为建立这种语言而进行的所有投资通常都会付诸东流。现在回想起来,这个方法繁多的时代被称为 "方法战争"。

对象目标管理小组(OMG Object Management Group)是面向对象软件开发领域最重要的标准化机构,它呼吁制定统一的建模标准。1995年,Grady Booch、Ivar Jacobson 和 James Rumbaugh 在 OOPSLA 会议(OOPSLA 是面向对象编程、系统、语言和应用的缩写)上结合了他们的想法和方法。从那时起,Booch、Jacobson 和 Rumbaugh 常被称为 "三友"。他们为自己设定了以下目标:

  • 使用面向对象的概念来表示完整的系统,而不仅仅是软件的一部分
  • 在建模概念和可执行程序代码之间建立明确的关系
  • 考虑复杂和关键系统中固有的扩展因素
  • 创建一种既能被机器处理,又能被人类读取的建模语言。

他们响应OMG的号召,于1997年提交了1.0版本。一些以前的竞争对手参与了1.1版本的创建,该版本随后于1998年面世。主要目标之一是UML(Unified Modeling Language )语言核心的一致规范。元模型定义了UML语言提供了哪些模型元素,以及如何正确使用它们。为了制定模型元素必须满足的约束条件,引入了基于对象约束语言(OCL Object Constraint Language)的谓词逻辑。

在随后的版本中,随着某些语言概念的修改,又增加了XML元数据交换格式(XMI XML Metadata Interchange format形式的模型互换机制。除了这些相当小的改动外,2000年OMG 启动了UML的现代化进程。最终,2005年通过了UML2.0语言标准。除了一些小的改动,通过临时版本,最终形成了当前的2.4.1版本,这就是我们在本书中将要了解和使用的UML语言描述。

最新的UML版本是2017年12月发布的 2.5.1。

今天,UML是最广泛使用的图形化面向对象建模语言之一。尽管经过多次修订,其根源(Booch 方法、OMT、OOSE)仍然清晰可辨。UML既适用于复杂对象关系的建模,也适用于具有并发性的流程建模。UML是一种通用建模语言,这意味着它的使用不局限于特定的应用领域。它为各种应用领域的建模提供了语言和建模概念以及直观的图形符号,使软件系统能够被指定、设计、可视化和文档化。使用UML建模的结果是图形模型,它以各种图表的形式提供了系统的不同视图。

1.2 使用方法

UML与特定的开发工具、特定的编程语言或特定的目标平台无关,开发的系统必须在这些工具、语言或平台上使用。UML也不提供软件开发过程。事实上,UML将建模语言和建模方法分开。后者可以根据项目或公司的具体情况来定义。然而UML的语言概念确实有利于迭代和增量过程。

UML可以在整个软件开发过程中统一使用。在开发的各个阶段,相同的语言概念可以使用相同的符号。因此,可以分阶段完善模型。

无需将模型翻译成另一种建模语言。这就实现了迭代和增量软件开发过程。UML非常适合于在复杂性、数据量、实时性等方面有不同要求的各种应用领域。

UML元模型规定了UML模型元素及其正确使用方法。语言概念的定义非常通用,因此具有广泛而灵活的适用性。为了避免限制 UML的使用,该标准在不同点上(故意)含糊其辞,允许以语义变化点的形式进行不同的解释。然而,这是一把双刃剑;它也导致建模工具对语言标准的不同实现,这反过来又使模型交流变得困难。

1.3 图

在UML中,模型以图的形式表示。图提供了模型所描述的现实部分的视图。
有的图表示哪些用户使用哪些功能,有的图表示系统的结构,但不指定具体的实现。还有一些图表示支持和禁止的流程。在 2.4.1 版本中,UML提供了14种描述系统结构或行为的图。

图通常由矩形框围成,矩形框左上角五边形包含图表类型和图表名称。可以选择在名称后指定参数,这些参数可以在图表中使用。

上图显示了名称为大学的类图(cd)和名称为注册、参数为课程和日期的序列图(sd)。

所有图表中都可能出现的概念是注释。注释可以包含任何形式的表达,以更精确地指定图及其元素--例如,用自然语言或对象约束语言(OCL Object Constraint Language)。注释可以附加到所有其他模型元素上。下图显示了使用注释的例子,该注释用自然语言说明不允许人员给自己打分。

1.3.1 结构图

UML提供了七种类型的图,从不同角度对系统的结构进行建模。这些图不考虑有关元素的动态行为(即它们随时间的变化)。

  • 类图

类图源于概念数据模型和面向对象的软件开发。这些概念用于指定系统的数据结构和对象结构。类图主要基于类、泛化和关联等概念。例如,在类图中,您可以模拟系统中的课程、学生和教授类。教授教授课程,学生选修课程。学生和教授有共同的属性,因为他们都是类Person的成员。

  • 对象图

对象图显示了特定执行时间内系统状态的具体快照。例如,对象图可以显示亨利-福斯特(henryFoster)教授面向对象建模(oom)和面向对象编程(oop)课程。

  • 包图

包图根据包图的共同属性(如功能内聚性)对图表或模型元素进行分组。例如,在大学管理系统中,可以引入包含教学、研究和行政方面信息的包。包通常集成在其他图中,而不是显示在单独的图中。

  • 组件图

组件是一个独立的可执行单元,它为其他组件提供服务或使用其他组件的服务。UML并没有严格区分面向对象和面向组件的概念。事实上,这些概念可以以任何需要的方式结合起来。当指定组件时,您可以明确地建模两个视图:外部视图(黑盒视图)和内部视图(白盒视图),前者表示组件的规范,后者定义组件的实现。

  • 组成结构图

组成结构图允许对系统各部分进行分层分解。因此,您可以使用组合结构图来详细描述类或组件的内部结构。与类图等相比,由于建模是针对具体上下文的,因此可以达到更高的详细程度。您可以指定内部结构的细节,而这些细节恰恰对所考虑的上下文有效。

  • 部署图

使用的硬件拓扑和分配的运行系统可以是部署图。硬件包括节点形式的处理单元以及节点之间的通信关系。运行时系统包含部署到节点上的工件。

  • Profile图

使用Profile,您可以扩展UML以引入特定领域的配置文件图 "元类"。UML语言定义的实际核心--元模型--保持不变。因此,您可以重复使用建模工具,而无需进行调整。例如,您可以使用配置文件来引入Java Enterprise Bean的概念。

参考资料

1.3.2 行为图

通过行为图,UML提供了详细定义行为的基础结构。

行为是指至少一个对象的动作的直接结果。它影响对象状态随时间的变化。行为既可以通过单个对象的操作来定义,也可以通过多个对象之间的交互来定义。

  • 用例图

UML 提供了用例图,使您能够定义系统必须满足的要求。该图描述了哪些用户使用系统的哪些功能,但不涉及实现的具体细节。系统为用户提供的功能单元称为用例。例如,在大学管理系统中,功能注册就是学生使用的用例。

  • 状态机图

在生命周期内,对象会经历不同的状态。例如第一次访问网站时处于注销状态。成功输入用户名和密码(登录事件)后,状态变为登录。一旦用户注销(事件 logout),就会返回到 ogged out 态。

  • 活动图

您可以用活动图为任何类型的过程建模:包括总线活动图和活动图。例如,活动图可以显示学生参与讲座和作业所需的操作。活动图提供了控制流机制和数据流机制,可以协调构成活动(即流程)的各项操作。

  • 顺序图

描述了对象之间的交互

学生完成一项特定任务,例如在大学管理系统中报名参加考试。重点是交互伙伴之间交换信息的时间顺序。通过各种用于控制消息时间顺序的构造以及模块化概念,可以建立复杂的交互模型。

  • 通信图

与顺序图类似,描述了不同对象之间的通信。这里的重点是交互伙伴之间的通信关系,而不是消息交换的时间顺序。这里没有复杂的控制结构。该图清楚地显示了谁与谁之间的交互关系。

  • 时序图

时序图明确显示了交互的状态变化。例如,一旦从大学管理系统接收到发送的密码有效的信息,一个人就处于登录状态。
交互概览图 交互概览图模拟了不同交互概览图(见第 6 章)之间的联系。

  • 交互概述图

在一个基于时间和因果关系的顺序中设置各个交互图(即顺序图、通信图、时序图和其他交互概览图),从而确定不同的交互过程。它还规定了允许发生交互过程的条件。为了建立控制流模型,使用了活动图中的概念。例如,大学管理系统的用户必须先登录(这已经代表了与系统的单独交互),然后才能使用其他功能。

1.4 本书中介绍的图

本书只介绍五种最重要、最普遍的UML图,即用例图、类图(包括对象图)、状态机图、顺序图和活动图。在本书中,我们按照软件开发项目中通常使用的顺序介绍这些图。我们从用例图开始,用例图规定了软件系统的基本功能。然后,类图定义了实现该功能所涉及的对象或类。然后,状态机图定义了对象内部的行为,而序列图则规定了对象之间的行为。最后,活动图允许我们定义"实现"用例图中的用例的流程。

热门相关:云家小九超皮哒   重生之女将星   楚氏赘婿   名门盛婚:首席,别来无恙!   魔神狂后