发布于 2026-01-06 1 阅读
0

UML简介 什么是UML?不同类型的图表

UML简介

什么是UML?

不同类型的图表

介绍

作为软件开发人员,我们究竟在做什么?无非就是将人类语言翻译成计算机语言。人类语言指的是任何口语,例如英语;而计算机语言则是二进制代码。两者之间存在着巨大的鸿沟。为了跨越这道鸿沟,我们需要引入一些中间环节。一个众所周知的中间环节就是编程语言本身:没有人直接编写二进制代码,每个人都使用某种编程语言。从这一步开始,编译器(或在某些情况下是解释器)会将你的代码转换成低级语言(例如汇编语言),然后再转换成二进制代码。但是,口语和编程语言之间仍然存在着巨大的鸿沟,因此引入一些额外的中间步骤是很有必要的。

对于这类中间步骤,有多种选择,有些更接近人类语言,有些则更接近编程语言。例如:编写非正式需求规格说明、编写正式规格说明(例如契约式设计)、通过示例来描述程序,或者使用 UML 对程序进行建模。

什么是UML?

UML是统一建模语言(Unified Modeling Language)的缩写。UML的历史始于20世纪90年代中期,如今已发展到2.4.1版本。它有多个衍生版本和扩展,例如SysML。UML是一种使用不同类型图表进行建模的方法。UML是一种表示方法。之后,您可以根据自身目标,使用绘图软件或专业的UML编辑器,在桌面或白板上手绘UML图。市面上有很多UML编辑器工具,有些是免费的(例如Umbrello),有些则价格昂贵(例如Enterprise Architect)。有些工具功能单一,仅类似于绘图工具,而有些则包含许多功能,例如版本控制、图表之间的连接,甚至在一定程度上支持代码生成。

我还试用了几个免费的 UML 工具,但要找到一个能够以正确的方式将图表保存为图片,并且能够以标准化的方式绘制所有类型图表的工具,真的非常具有挑战性。

UML 图分为两大类:结构图(或静态图),表示软件的静态架构;行为图(或动态图),表示软件在不同情况下如何工作。

下面我简要介绍一下最流行的 UML 图类型。

不同类型的图表

结构图

第一大组图表描述了软件的结构。

组件图

组件图用于对代码的高级架构进行建模。

它的主要组成部分如下:

  • 组件(例如:图中的用户界面和业务逻辑)
  • 组件端口:端口在组件侧面用一个小矩形标记(参见用户界面侧边栏的“属性”)。它们是与其他组件的接口,本质上是一组提供的接口。
  • 提供的接口:提供的接口用连接到组件的圆圈表示。这些基本上是组件的接口函数,可以从外部访问。
  • 必需接口:它用连接到组件的半圆表示。这意味着该组件需要另一个组件提供的接口。因此,必需接口和提供的接口可以相互连接。

类图

最常用的UML图是类图。它表示程序或程序某一部分的类层次结构。

每个类都用一个矩形表示,类名写在矩形的顶部。要表示接口类,需要在右上角添加一个额外的矩形。

类名之后是类的属性(变量)部分。属性的可见性可以用“-”(私有)或“+”(公共)表示。接下来是属性名称、“:”符号和属性类型。

下一节介绍该类的操作(函数和方法)。

在某些情况下,类图会忽略属性和/或操作,而只关注不同类之间的连接。

这些课程可以通过四种不同的方式相互联系:

  • 组合:它用一个填充并旋转的矩形表示,该矩形位于与另一个类相连的类的一侧(例如游戏和桌子之间)。这意味着桌子是游戏的一部分,它们彼此互为组成部分。它们的生命周期相同(它们同时创建和销毁)。实际上,这意味着游戏拥有一个指向桌子实例的成员变量。可以通过在连接上添加数字来增加多重性(如果游戏有多个玩家),* 表示“任意数量”的连接。现实世界中的一个例子:人与头部之间存在组合关系:它们具有相同的生命周期,并且头部不能被分配给其他人。
  • 聚合:它用一个未填充的旋转矩形表示,该矩形位于与另一个类相连的类的一侧(例如 Game 和 Player 之间)。这意味着这些类彼此关联,但它们的生命周期可以不同。这意味着 Game 拥有一个 Player。但是 Player 和 Game 的生命周期不同,Player 可以被分配到不同的游戏中,甚至 Game 也可以在一段时间内更换其 Player。多重性与组合相同。在代码中,这意味着 Game 拥有指向 Player 的指针。在现实生活中,这意味着我和我的衣服之间存在聚合关系:我需要衣服,但我会定期更换它们,而且这些衣服也可以被其他人穿。
  • 关联:关联关系用两条线连接两个类(例如 Player 和 Table),有时也用一个箭头表示。它表示这两个类互相使用,但不拥有对方的所有权,例如它们在某个函数中拥有一个局部实例,或者被用作函数参数或返回值。这就像我乘坐公交车,我只是使用了公交车,这就是典型的关联关系。
  • 泛化:泛化用三角形箭头表示(例如 Game 和 PausableGame 之间的箭头)。它表示 Game 是 PausableGame 的泛化版本,或者换句话说,PausableGame 是 Game 的一个特殊版本。在代码领域,它通常表示继承。例如,在现实世界中,Animal 是猫狗的泛化版本。

对象图

对象图不如类图那么流行,但在某些情况下也非常有用。它表示面向对象程序中对象(类的实例)在特定时间点的状态。每个对象都用一个矩形表示。矩形的顶部是对象的名称(例如“player1”)和对象类型(例如“玩家”)。下方可以列出对象的属性及其实际值。对象之间可以相互连接(例如,一个游戏有两个玩家和一个桌子)。

部署图

如果您的软件分布在多台不同的机器上,部署图就非常有用。您可以将机器(设备)添加到图中,例如图中的“客户端机器”和“服务器”,并将运行在指定设备上的软件组件分配给它们。

行为图

第二大类图表是行为(动态)图。它们的目的是描述软件在不同使用场景下的行为方式。

序列图

序列图描述了特定用例中不同对象或软件组件之间的通信。

以上示例描述了网络门户的登录过程。

左上角的第一个元素是一个 Actor,代表用户本身。用户调用 Login 方法(点击登录按钮)。该事件将由用户界面处理,用户界面用一个矩形表示。这里还可以添加一个对象:类型对。下方的虚线表示对象/组件的生命周期。在本例中,所有组件的生命周期相同,但彼此之间可以不同。也可以稍后通过专门的调用创建对象,或提前销毁对象。在这种情况下,生命周期线当然会缩短。

下一步,用户界面会调用自身来检查用户名表单是否为空。调用完成后,左上角会出现一个带有“alt”标签的红色大矩形。这表示矩形内的代码只有在“用户名不为空”的条件为真时才会执行。否则,代码不会运行。除了使用“alt”标签,我们也可以使用循环。

因此,如果给定的用户名不为空,则用户界面调用业务逻辑。

业务逻辑调用数据库来检查用户名和密码是否正确。然后数据库返回一个值(虚线所示),业务逻辑也返回一个值。

当然,序列图可以绘制得更详细或更简略。

活动图

活动图可能是最简单的图表类型,因为它本质上就是一个精心设计的流程图。实心圆始终是程序/算法的起点。程序或算法的流程用箭头表示。圆角矩形(例如“请求一个数字”)代表一个活动。菱形代表一个决策(在本例中,即给定的数字是否为正数)。从决策点出发总是有多条箭头,这些箭头用决策结果(此处为“是”或“否”)标记。在某些表示方法中,还有一个合并元素,它也是一个菱形。合并元素总是有多条入线,但只有一条线是从它自身开始的。在本例中,我漏掉了这个元素,直接将其连接到了“请求一个数字”这个活动。

最后要提到的是空心圆内的实心圆,它始终是程序或算法的终点。一个程序可以有多个终点。

所以上面的图表表示一个简短的程序,它会不断地要求输入一个数字,直到输入的数字不是正数为止。

状态图

状态图用于表示状态机。起点和终点的表示方式与活动图类似。传输过程用箭头表示。程序的特定状态用圆角矩形标记。状态机可以有多个终点。此外,还可以存在并行状态,或者向现有状态添加子状态。这种程序表示方法的优点在于,它既能提供清晰易懂的概览,又能轻松地将其转换为源代码。

上图表明,程序启动时处于“未登录”状态,登录后变为“已登录”状态,注销后又变回“未登录”状态。无论处于哪种状态,最终都可以到达程序的结束状态。

用例图

用例图是从用户角度对程序功能或部分功能的任何轻量级表示。

所谓的参与者用简笔画表示,在本图中我们称之为“用户”。也可以有多个参与者(例如具有不同权限的用户),而且参与者也可能并非代表人类,而是代表使用我们程序的另一个系统。

可用的功能称为用例。用例用椭圆表示,可以直接用线连接到参与者,也可以通过特定的连接符连接到其他用例。在本例中,我们有两个主要用例:登录和注册。

用例之间的连接器可以是以下几种:

  • 泛化:它与类图非常相似,甚至连表示方式都相同。一个通用用例可以有一个或多个专门版本。例如,用例“登录”就有一个专门版本“使用 Google 帐户登录”。
  • 包含:包含连接器表示一个用例(功能)是另一个用例的一部分。例如,“设置新密码”是“注册”功能的一部分。它用带有尖括号 <> 的虚线表示。
  • 扩展:扩展是指一个用例是另一个用例的扩展。例如,“导入个人数据”选项是“注册”用例的扩展。它用带有尖括号 <> 的虚线表示。
  • 前置连接:示例中缺少一个名为“前置”的连接线。通过使用前置连接线,可以定义用例的顺序。例如,我们可以在“注册”和“登录”之间添加一个前置连接线,因为要登录,必须先注册。它用带有尖括号 <> 的虚线表示。

用例图是将程序的高级功能以易于理解的方式表示的完美工具。

概括

UML 是一种非常强大的工具,能够以人类可读的格式表示软件。它也是技术讨论的良好基础。然而,需要注意的是,由于 UML 只是一种半形式化的工具,因此同一事物常常会以不同的方式表示。

文章来源:https://dev.to/rlxdprogrammer/introduction-to-uml-12ih