UML 是统一建模语言 Unified Modeling Language 的缩写,是一种标准化建模语言,由一组集成图组成,旨在帮助系统和软件开发人员指定、可视化、构建和记录软件系统的工件,以及用于业务建模和其他非软件系统。UML 代表了一组最佳工程实践,这些实践已被证明在大型复杂系统的建模中是成功的。UML 是开发面向对象软件和软件开发过程中非常重要的一部分。UML 主要使用图形符号来表达软件项目的设计。使用 UML 有助于项目团队进行交流、探索潜在的设计并验证软件的架构设计。在本文中,我们将为您详细介绍什么是 UML,
# UML 的起源
UML 的目标是提供一种标准符号,可以被所有面向对象的方法使用,并选择和集成前体符号的最佳元素。UML 被设计用于广泛的应用程序。因此,它为广泛的系统和活动(例如,分布式系统、分析、系统设计和部署)提供了结构。
UML 是一种由 OMT 统一产生的符号
- 对象建模技术 OMT [ James Rumbaugh 1991] - 最适合分析和数据密集型信息系统。
- Booch [ Grady Booch 1994] - 非常适合设计和实施。Grady Booch 与 Ada 语言进行了广泛的合作,并且是该语言的面向对象技术开发的主要参与者。虽然 Booch 方法很强大,但符号不太受欢迎(很多云形状主导了他的模型 - 不是很整齐)
- OOSE(面向对象的软件工程 [ Ivar Jacobson 1992]) - 以一个称为用例的模型为特色。用例是一种强大的技术,可用于理解整个系统(OO 传统上薄弱的领域)的行为。
1994 年,OMT 的创建者 Jim Rumbaugh 在离开通用电气并加入 Rational Corp 的 Grady Booch 时震惊了软件界。合作的目的是将他们的想法合并为一个单一的、统一的方法(该方法的暂定名称)。方法确实是 “统一方法”)。
到 1995 年,OOSE 的创建者 Ivar Jacobson 也加入了 Rational,他的想法(尤其是 “用例” 的概念)被输入到新的统一方法 - 现在称为统一建模语言 1。Rumbaugh、Booch 和 Jacobson 的团队被亲切地称为 “三人组”
UML 也受到其他面向对象表示法的影响:
- 梅勒和施莱尔 [1998]
- 科德和尤登 [1995]
- Wirfs-Brock [1990]
- 马丁和奥德尔 [1992]
UML 还包括当时其他主要方法中不存在的新概念,例如扩展机制和约束语言。
# UML 的历史
- 1996 年,对象管理组 (OMG) 发布的第一个提案请求 (RFP) 为这些组织联合起来制定联合 RFP 响应提供了催化剂。
- Rational 与几个愿意投入资源致力于强大的 UML 1.0 定义的组织建立了 UML 合作伙伴联盟。那些对 UML 1.0 定义贡献最大的人包括:
- 数码设备公司
- 生命值
- i-Logix
- 智能公司
- IBM
- 图标计算
- MCI 系统屋
- 微软
- 甲骨文
- 理性软件
- 德州仪器
- 优利系统
- 这种合作产生了 UML 1.0,这是一种定义良好、表达能力强、功能强大且普遍适用的建模语言。这在 1997 年 1 月作为初始 RFP 响应提交给 OMG。1
- 1997 年 1 月,IBM、ObjecTime、Platinum Technology、Ptech、Taskon、Reich Technologies 和 Softeam 也分别向 OMG 提交了 RFP 响应。这些公司与 UML 合作伙伴一起贡献了他们的想法,并且合作伙伴共同产生了修订后的 UML 1.1 响应。UML 1.1 版本的重点是提高 UML 1.0 语义的清晰度并吸收新合作伙伴的贡献。它在 1997.1 秋季提交给 OMG 供他们考虑并通过,将 1.1 增强到 1.5,随后从 01 到 06 到 UML 2.1(现在 UML 当前版本是 2.5)
# 为什么选择 UML
随着软件对许多公司的战略价值的增加,该行业正在寻找自动化软件生产和提高质量、降低成本和缩短上市时间的技术。这些技术包括组件技术、可视化编程、模式和框架。随着范围和规模的增加,企业还寻求管理系统复杂性的技术。特别是,他们认识到需要解决重复出现的架构问题,例如物理分布、并发性、复制、安全性、负载平衡和容错。此外,万维网的发展虽然使一些事情变得更简单,但也加剧了这些架构问题。统一建模语言 (UML) 旨在响应这些需求。
- 为用户提供即用型、富有表现力的可视化建模语言,以便他们开发和交换有意义的模型。
- 提供可扩展性和专业化机制来扩展核心概念。
- 独立于特定的编程语言和开发过程。
- 为理解建模语言提供正式的基础。
- 鼓励 OO 工具市场的增长。
- 支持更高级别的开发概念,例如协作、框架、模式和组件。
- 整合最佳实践。
# UML - 概述
在我们开始研究 UML 理论之前,我们将简要介绍一下 UML 的一些主要概念。
关于 UML,首先要注意的是有很多不同的图表(模型)需要习惯。这样做的原因是可以从许多不同的角度看待一个系统。软件开发将有许多利益相关者参与。
例如:
- 分析师
- 设计师
- 编码员
- 测试人员
- 质量保证
- 客户
- 技术作者
所有这些人都对系统的不同方面感兴趣,每个人都需要不同程度的细节。例如,编码人员需要了解系统的设计并能够将设计转换为低级代码。相比之下,技术作家对整个系统的行为感兴趣,需要了解产品的功能。UML 试图提供一种表达能力很强的语言,以使所有利益相关者都可以从至少一个 UML 图中受益。
下面快速浏览一下这 13 个图表中的每一个,如下面的 UML 2 图表结构所示:
结构图显示了系统的静态结构及其在不同抽象和实现级别上的部分,以及它们之间的关系。结构图中的元素代表系统的有意义的概念,可能包括抽象概念、现实世界和实现概念,结构图有以下七种类型:
- 类图
- 组件图
- 部署图
- 对象图
- 封装图
- 复合结构图
- 剖面图
行为图显示了系统中对象的动态行为,可以描述为系统随时间发生的一系列变化,行为图有以下七种类型:
- 用例图
- 活动图
- 状态机图
- 序列图
- 通讯图
- 交互概览图
- 时序图
# 什么是类图?
类图是一种中心建模技术,几乎贯穿所有面向对象的方法。该图描述了系统中对象的类型以及它们之间存在的各种静态关系。
# 关系
重要的关系主要有以下三种:
- 关联 - 表示类型实例之间的关系(一个人为一家公司工作,一家公司有多个办事处。
- 继承 - 用于 OO 的 ER 图最明显的补充。它与 OO 设计中的继承有直接的对应关系。
- 聚合 - 聚合,一种面向对象设计中的对象组合形式。
# 类图示例
有关类图的更多详细信息,请阅读文章什么是类图?
# 什么是组件图?
在统一建模语言中,组件图描述了组件如何连接在一起以形成更大的组件或软件系统。它说明了软件组件的体系结构以及它们之间的依赖关系。这些软件组件包括运行时组件、可执行组件以及源代码组件。
# 组件图示例
有关组件图的更多详细信息,请阅读文章什么是组件图?
# 什么是部署图?
部署图有助于对面向对象软件系统的物理方面进行建模。它是一个结构图,将系统的体系结构显示为软件工件到部署目标的部署(分布)。人工制品代表了物理世界中的具体元素,它们是开发过程的结果。它在静态视图中对运行时配置进行建模,并可视化应用程序中工件的分布。在大多数情况下,它涉及对硬件配置以及存在的软件组件进行建模。
# 部署图示例
有关部署图的更多详细信息,请阅读文章什么是部署图?
# 什么是对象图?
对象图是实例的图,包括对象和数据值。静态对象图是类图的一个实例;它显示了系统在某个时间点的详细状态的快照。不同之处在于类图表示由类及其关系组成的抽象模型。但是,对象图表示特定时刻的实例,这在本质上是具体的。对象图的使用相当有限,即显示数据结构的示例。
# 类图与对象图 - 一个例子
有些人可能会发现很难理解 UML 类图和 UML 对象图之间的区别,因为它们都由命名的 “矩形块” 组成,其中包含属性,并且之间具有链接,这使得两个 UML 图看起来相似。有些人甚至可能认为它们是相同的,因为在 UML 工具中,它们使用的类图和对象图的符号都放在同一个图编辑器 - 类图中。
但实际上,类图和对象图代表了代码库的两个不同方面。在本文中,我们将为您提供有关这两个 UML 图的一些想法,它们是什么,它们有什么区别以及何时使用它们。
# 类图与对象图的关系
您在编程时创建 “类”。例如,在网上银行系统中,您可以创建 “用户”、“帐户”、“交易” 等类。在课堂管理系统中,您可以创建 “教师”、“学生”、“作业” 等类。在每个类中,都有代表该类特征和行为的属性和操作。类图是一个 UML 图,您可以在其中可视化这些类,以及它们的属性、操作和相互关系。
UML 对象图显示系统中的对象实例在特定状态下如何相互交互。它还表示处于该状态的那些对象的数据值。换句话说,UML 对象图可以看作是在特定状态下如何使用类(在 UML 类图中绘制)的表示。
如果您不喜欢这些定义,请查看以下 UML 图示例。我相信你会在几秒钟内了解它们的差异。
# 类图示例
下面的类图示例表示两个类 - 用户和附件。用户可以上传多个附件,因此这两个类通过关联连接,在附件端使用 0..* 作为多重性。
# 对象图示例
下面的对象图示例向您展示了用户和附件类的对象实例在彼得(即用户)尝试上传两个附件时的 “样子”。所以要上传的两个附件对象有两个 Instance Specification。
有关对象图的更多详细信息,请阅读文章什么是对象图?
# 什么是封装图?
包图是 UML 结构图,显示包和包之间的依赖关系。模型图允许显示系统的不同视图,例如,作为多层(也称为多层)应用程序 - 多层应用程序模型。
# 封装图示例
有关包图的更多详细信息,请阅读文章什么是包图?
# 什么是复合结构图?
复合结构图是添加到 UML 2.0 的新工件之一。复合结构图类似于类图,是一种组件图,主要用于从微观角度对系统进行建模,但它描绘的是单个部分而不是整个类。它是一种静态结构图,显示了类的内部结构以及这种结构使协作成为可能。
该图可以包括内部部件、部件相互交互或类实例通过其与部件和外部世界交互的端口,以及部件或端口之间的连接器。复合结构是一组互连的元素,它们在运行时协作以实现某些目的。每个元素在协作中都有一些定义的角色。
# 复合结构图示例
有关复合结构图的更多详细信息,请阅读文章什么是复合结构图?
# 什么是剖面图?
概要图使您能够创建特定于域和平台的构造型并定义它们之间的关系。您可以通过绘制原型形状来创建原型,并通过以资源为中心的界面将它们与组合或概括联系起来。您还可以定义和可视化构造型的标记值。
# 剖面图示例
有关 Profile Diagram 的更多详细信息,请阅读文章什么是 UML 中的 Profile Diagram?
# 什么是用例图?
用例模型根据用例描述系统的功能需求。它是系统预期功能(用例)及其环境(参与者)的模型。用例使您能够将您对系统的需求与系统如何满足这些需求联系起来。
将用例模型想象成一个菜单,就像您在餐厅中找到的菜单一样。通过查看菜单,您可以了解可供您选择的菜品、个别菜肴及其价格。您还知道餐厅供应哪种美食:意大利菜、墨西哥菜、中国菜等。通过查看菜单,您可以对该餐厅的用餐体验有一个整体印象。实际上,菜单 “模仿” 了餐厅的行为。
因为它是一种非常强大的计划工具,所以用例模型通常被所有团队成员用于开发周期的所有阶段。
# 用例图示例
有关用例图的更多详细信息,请阅读文章什么是用例图?
# 什么是活动图?
活动图是逐步活动和操作的工作流的图形表示,支持选择、迭代和并发。它描述了目标系统的控制流程,例如探索复杂的业务规则和操作,描述用例以及业务流程。在统一建模语言中,活动图旨在为计算和组织过程(即工作流)建模。
# 活动图示例
有关活动图的更多详细信息,请阅读文章什么是活动图?
# 什么是状态机图?
状态图是 UML 中用于描述系统行为的一种图,它基于 David Harel 的状态图概念。状态图描述了允许的状态和转换以及影响这些转换的事件。它有助于可视化对象的整个生命周期,从而有助于更好地理解基于状态的系统。
# 状态机图示例
有关状态机图的更多详细信息,请阅读文章什么是状态机图?
# 什么是序列图?
序列图基于时间序列对对象的协作进行建模。它显示了对象在用例的特定场景中如何与其他对象交互。借助先进的可视化建模能力,您只需点击几下即可创建复杂的序列图。此外,Visual Paradigm 等一些建模工具可以根据您在用例描述中定义的事件流生成序列图。
# 序列图示例
有关序列图的更多详细信息,请阅读文章什么是序列图?
# 什么是通信图?
与序列图类似,通信图也用于对用例的动态行为进行建模。与序列图相比,通信图更侧重于显示对象的协作而不是时间序列。它们实际上在语义上是等价的,因此某些建模工具(例如 Visual Paradigm)允许您从一个到另一个生成它。
# 通信图示例
有关通信图的更多详细信息,请阅读文章什么是通信图?
# 什么是交互概览图?
交互概览图侧重于交互控制流的概览。它是活动图的变体,其中节点是交互或交互发生。交互概览图描述了隐藏消息和生命线的交互。您可以链接 “真实” 图表并在交互概览图中实现图表之间的高度可导航性。
# 交互概览图示例
有关交互概览图的更多详细信息,请阅读文章什么是交互概览图?
# 什么是时序图?
时序图显示了对象在给定时间段内的行为。时序图是序列图的一种特殊形式。时序图和时序图的区别在于轴是颠倒的,时间从左到右增加,生命线显示在垂直排列的单独隔间中。
# 时序图示例
有关时序图的更多详细信息,请阅读文章什么是时序图?
# 学习 UML。绘制 UML。
获取 Visual Paradigm 社区版,这是一个免费的 UML 工具,可以帮助您更快、更有效地学习 UML。Visual Paradigm Community Edition 支持所有 UML 图类型。它的 UML 建模器屡获殊荣,易于使用且直观。
# UML 词汇表和术语
- 抽象类 - 永远不会被实例化的类。这个类的实例永远不会存在。
- 参与者 - 启动系统所涉及的事件的对象或人。
- 活动:活动图中的步骤或动作。表示系统或演员采取的行动。
- 活动图:一个美化的流程图,显示流程中的步骤和决策以及并行操作,例如算法或业务流程。
- 聚合 - 是另一个类的一部分。在图表中包含类旁边显示有一个空心菱形。
- Artifacts - 描述设计过程中步骤输出的文档。描述是图形的、文本的或某种组合。
- 关联 - 模型的两个元素之间的连接。这可能表示代码中的成员变量,或人事记录与其所代表的人之间的关联,或两类工人之间的关系,或任何类似的关系。默认情况下,关联中的两个元素是相等的,并且通过关联相互了解。一个关联也可以是一个可导航的关联,这意味着关联的源端知道目标端,但反之则不然。
- 关联类:代表两个其他类之间的关联并向其添加信息的类。
- 属性 - 可用于引用其他对象或保存对象状态信息的对象的特征。
- 基类:定义由子类通过泛化关系继承的属性和操作的类。
- 分支:活动图中的决策点。分支中出现多个转换,每个转换都有一个保护条件。当控制到达 Branch 时,恰好有一个 Guard Condition 为真;并且控制遵循相应的转换。
- 类:类似对象的类别,都由相同的属性和操作描述,并且所有分配兼容。
- 类图 - 显示系统类和它们之间的关系。
- 分类器:具有属性和操作的 UML 元素。具体来说,Actors、Classes 和 Interfaces。
- 协作:通信图中两个对象之间的关系,表明消息可以在对象之间来回传递。
- 通信图 - 显示操作如何完成的图表,同时强调对象的角色。
- 组件:系统内可部署的代码单元。
- 组件图:显示各种组件和接口之间关系的图表。
- 概念 - 包含在领域模型中的名词或抽象概念。
- 构建阶段 ——Rational Unified Process 的第三阶段,在此阶段,功能的多次迭代被构建到正在构建的系统中。这是主要工作完成的地方。
- 依赖关系:表示一个分类器知道另一个分类器的属性和操作,但不直接连接到第二个分类器的任何实例的关系。
- 部署图:显示各种处理器之间关系的图表。
- 域 - 系统所涉及的宇宙的一部分。
- 细化阶段 - Rational Unified Process 的第二阶段,允许额外的项目计划,包括构建阶段的迭代。
- 元素:出现在模型中的任何项目。
- 封装 - 对象中的数据是私有的。
- 泛化 - 表示一个类是另一个类(超类)的子类。一个空心箭头指向超类。
- 事件:在状态图中,这表示导致系统采取行动或切换状态的信号或事件或输入。
- 最终状态:在状态图或活动图中,这表示图完成的点。
- Fork:活动图中多个并行控制线程开始的点。
- 泛化:一种继承关系,其中子类继承并添加到基类的属性和操作。
- GoF - 四组设计模式。
- High Cohesion - 一种 GRASP 评估模式,可确保类不太复杂,执行不相关的功能。
- 低耦合 - 一种 GRASP 评估模式,用于衡量一个类对另一个类的依赖程度或与另一个类的连接程度。
- 初始阶段 - Rational Unified Process 的第一个阶段,处理项目的最初概念化和开始。
- 继承 —— 子类继承其父(超类)类的属性或特征。这些属性可以在子类中被覆盖。
- 初始状态:在状态图或活动图中,这表示图开始的点。
- 实例 - 类被用作创建对象的模板。这个对象被称为类的一个实例。可以创建任意数量的类实例。
- 接口:定义形成行为契约的属性和操作的分类器。提供者类或组件可以选择实现接口(即实现其属性和操作)。然后,客户端类或组件可以依赖于接口,从而使用提供者,而不需要提供者的真实类的任何细节。
- 迭代 - 一个迷你项目部分,在此期间将一些小功能添加到项目中。包括分析、设计和编码的开发循环。
- 加入:活动图中的一个点,多个并行控制线程同步并重新加入。
- 成员:分类器中的属性或操作。
- 合并:活动图中不同控制路径汇集在一起的点。
- 消息 - 从一个对象到另一个对象的请求,要求接收消息的对象做某事。这基本上是对接收对象中的方法的调用。
- 方法 - 对象中的函数或过程。
- 模型 - 中央 UML 工件。由按包以层次结构排列的各种元素组成,以及元素之间的关系。
- 多重性 - 显示在域模型中并在概念框外表示,它表示对象数量与其他对象的分位数的关系。
- 可导航性:指示关系的哪一端知道另一端。关系可以具有双向可导航性(每一端都知道另一端)或单向可导航性(一端知道另一端,但反之则不然)。
- Notation - 带有用于创建分析和设计方法的规则的图形文档。
- 注意:添加到图表中的文本注释以更详细地解释图表。
- 对象 - 对象:在活动图中,从活动接收信息或向活动提供信息的对象。在协作图或序列图中,参与图中描述的场景的对象。通常:给定分类器(Actor、Class 或 Interface)的一个实例或示例。
- 包 - 一组逻辑上应该组合在一起的 UML 元素。
- 包图:一个类图,其中所有元素都是包和依赖项。
- 模式 - 用于确定交互对象的责任分配的解决方案。它是成功解决众所周知的常见问题的名称。
- 参数:操作的参数。
- 多态性 - 相同的消息,不同的方法。也用作图案。
- Private:应用于属性或操作的可见性级别,指示只有包含该成员的分类器的代码才能访问该成员。
- 处理器:在部署图中,这表示可以部署代码的计算机或其他可编程设备。
- 受保护:应用于属性或操作的可见性级别,指示只有包含该成员的分类器或其子类的代码才能访问该成员。
- Public:应用于属性或操作的可见性级别,表示任何代码都可以访问该成员。
- 阅读方向箭头 - 指示领域模型中关系的方向。
- 实现:表示组件或类提供给定接口。
- 角色 - 在领域模型中使用,它是关于参与者角色的可选描述。
- 序列图:显示对象随时间存在的图表,以及随时间在这些对象之间传递以执行某些行为的消息。状态图 - 显示所有可能的对象状态的图。
- 状态:在状态图中,这表示系统或子系统的一种状态:它在某个时间点正在做什么,以及它的数据值。
- 状态图:显示系统或子系统的状态、状态之间的转换以及导致转换的事件的图。
- 静态:属性的修饰符,指示在分类器的所有实例之间共享的属性只有一个副本。操作的修饰符,表示该操作独立存在并且不对分类器的一个特定实例进行操作。
- Stereotype:应用于模型元素的修饰符,表明它通常不能在 UML 中表达。本质上,Stereotypes 允许您定义自己的 UML “方言”。
- 子类:继承由子类通过泛化关系定义的属性和操作的类。
- 泳道:活动图的一个元素,指示系统或域的哪些部分执行特定的活动。Swimlane 中的所有活动都是由 Swimlane 表示的对象、组件或 Actor 的责任。
- Time Boxing - 每次迭代都有一个带有特定目标的时间限制。
- 过渡:在活动图中,表示从一个活动或分支或合并或分叉或连接到另一个的控制流。在状态图中,表示从一个状态到另一个状态的变化。
- 过渡阶段 - Rational Unified Process 的最后一个阶段,在此阶段用户接受培训以了解如何使用新系统,并且系统可供用户使用。
- UML - 统一建模语言利用文本和图形文档通过允许对象之间更紧密的关系来增强软件项目的分析和设计。
- 用例:在用例图中,表示系统为响应来自参与者的某些请求而采取的行动。
- 用例图:显示参与者和用例之间关系的图表。
- 可见性:属性或操作的修饰符,指示哪些代码可以访问该成员。可见性级别包括公共、受保护和私有。
- 工作流 - 一组产生特定结果的活动。
# 流行的 UML 书籍
下面列出了一些最畅销的 UML 书籍,您可以阅读这些书籍来学习 UML。
- UML Distilled:标准对象建模语言简要指南
- UML 2 和统一过程:实用的面向对象分析和设计
- 学习 UML 2.0
- 使用 UML 构建 Web 应用程序
- 统一建模语言参考手册
- UML 2.0 风格的元素
- 面向 Java 程序员的 UML
- Schaum 的 UML 大纲
- 统一建模语言用户指南
- UML 2 认证指南:基础和中级考试
- UML 中面向对象设计的基础
- 使用 UML 应用用例驱动的对象建模:一个带注释的电子商务示例
- 使用 UML 设计灵活的面向对象系统
- 使用 UML 的用例驱动对象建模
- 使用 UML 2.0 版进行系统分析和设计:一种面向对象的方法
- 简而言之 UML 2.0
- 面向对象的分析和设计与应用程序
- UML 解释
- 设计模式:可重用的面向对象软件的要素
- 对象入门:使用 UML 2.0 进行敏捷模型驱动开发
# 相关链接
- 用于可视化建模的专业 UML 设计工具
相关链接:wiki 统一建模语言