de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

一位实践者的UML复合结构图回顾

引言:为什么我转向了复合结构图

作为一名软件架构师,多年来我一直致力于应对复杂系统设计的挑战,我常常发现传统的类图在解释运行时组件实际交互方式方面力不从心。如何组件在运行时的实际交互方式。正是在那时,我发现了UML 2.0的复合结构图——它彻底改变了内部对象架构的可视化方式。

在这份指南中,我将分享自己学习和应用复合结构图的实战经验,通过真实案例、实用的实施技巧,以及说明为何这种图示类型值得成为你建模工具箱中的一员。无论你是学习UML的学生,还是希望完善设计文档的专业人士,这份以评述风格呈现的指南都能提供清晰的概念理解与可操作的洞见。


复合结构图到底是什么?

复合结构图是UML 2.0新增的几种新元素之一。复合结构图是一种UML结构图,包含类、接口、包及其关系,能够提供整个软件系统或其部分的逻辑视图。它展示了结构化分类器或协作的内部结构(包括部件和连接器)。

复合结构图的作用与类图类似,但它允许你更深入地描述多个类的内部结构,并展示它们之间的交互关系。你可以图形化地表示内部类和部件,并展示类之间以及类内部的关联关系。

Composite Structure Diagram Hierarchy

我的看法:可以把类图想象成一栋建筑的平面图,而复合结构图则像是X光片,能显示出墙体内隐藏的线路、管道和承重梁。正是这种“透视内部”的能力,使得这种图如此有价值。


更快、更轻松、更高效地学习UML

你正在寻找一款免费的UML工具,以便更快、更轻松、更迅速地学习UML吗?Visual Paradigm社区版是一款支持所有UML图类型的UML软件。它是一款荣获国际奖项的UML建模工具,同时又易于使用、直观且完全免费。
免费下载


复合结构图的目的:它解决了哪些问题?

  • 复合结构图使用户能够“透视”一个对象,清楚地看到它究竟由哪些部分组成。

  • 类的内部行为,包括嵌套类之间的关系,都可以被详细描述。

  • 对象被展示为由其他分类对象组合而成。

用户体验提示:当我首次使用这些图来记录微服务架构时,我的团队终于理解了我们的“黑箱”服务内部是如何协调工作的。这种视觉上的清晰性使新开发人员的入职时间减少了近40%。


复合结构图一览

  • 复合结构图展示了类的内部组成部分。

  • 部件的命名格式为:部件名称:部件类型[多重性]

  • 聚合的类是类的组成部分,但部件不一定是类——部件是构成包含类的任何元素。

Simple Composite Structure Diagram Example

专业提示:始终使用以下格式清晰地标记你的部件:名称:类型[数量]这一规范。看似微不足道,但在代码审查过程中却能避免无数小时的困惑。


从类图推导复合结构图:一个真实案例

在线商店场景

假设我们正在为一个在线商店建模系统。客户告诉我们,顾客可以加入会员计划,这将为他们提供特殊优惠和折扣运费,因此我们扩展了客户对象,以提供会员和普通两种选项。

让我们使用类图来建模在线商店:

Class Diagram

我们有一个Item类,它可能被Order类聚合,而Order类由Customer类组成,Customer类本身又由StoreManager类组成。我们有很多对象最终都包含在其他对象中。

看起来所有东西最终都进入了StoreManager,因此我们可以创建一个组合结构图,以真正看清它的构成。

Composite Structure Diagram

在上面的例子中,我们可以看到:

  • StoreManager自身的视角,而不是整个系统的视角。

  • StoreManager直接包含两种对象(CustomerItem),这由类图中的两条组合箭头表示。

  • 此处的组合结构图更明确地展示了Customer子类型的包含关系。

  • 请注意,这两个部分的类型都是Customer,因为商店将它们都视为Customer对象。

  • 我们还看到一个连接器,显示了Item和Order之间的关系。

  • Order并未直接包含在StoreManager类中,但我们可以在它聚合的对象内部嵌套的部分之间展示关系。

我的见解:这个例子完美地说明了为什么当利益相关者问“但这在内部到底是如何工作的?”时,我会选择使用组合结构图。类图展示了什么什么之间的关系;而组合结构图则展示了它们内部如何相互作用它们内部如何相互作用。


类图与组合结构图:澄清模糊之处

问题:下面两个图表达的是相同的意思吗?

回答:在类图中,Description 和 Pricing 之间的引用是模糊的;严格来说,它们并不完全相同。

  1. 类图确实显示了 Description 将引用一个 Pricing 对象

  2. 但它并未明确说明这两个对象之间的引用是否显式地包含在 Item 内部

Class vs Composite Structure Diagram

如果我们使用组合结构图,关联关系的包含含义就变得明确无误。

  • Description 和 Pricing 对象之间的引用被限定在由 Item 组成的对象内部。

  • 对象活动的具体实现可以被清晰地建模。

实践者视角:我见过团队浪费数周时间争论某个关系是组合还是聚合。一个绘制良好的组合结构图能从一开始就消除这种歧义。这是一种能防止争论的文档。


对外部部件的引用:建模现实世界的依赖关系

我们已经看到,组合结构图在描述聚合方面非常出色,但你的模型还需要包含对所建模类之外对象的引用。

但像下面例子那样,如何用组合结构图引用外部对象呢?

Composite Structure Reference to External Parts

  • 对外部对象的引用以带虚线矩形的部件形式表示。

  • 尽管被引用的对象在类之外,但引用本身位于所建模的类内部,这是展示其实现的重要一步。

现场笔记:在建模与第三方 API 的集成时,我总是对外部引用使用虚线矩形。这在视觉上向开发者发出信号:“此依赖关系存在于我们的代码库之外——请谨慎处理。”


组合结构图的基本概念:构建模块

UML 2.0 规范中识别出的关键组合结构实体包括结构化分类器、部件、端口、连接器和协作。

协作

协作描述了协作部件(角色)的结构。协作通过协作使用与操作或分类器关联。当你只想定义完成协作特定目标所需的那些角色和连接时,就使用协作。

例如,协作的目标可以是定义分类器的角色或组件。通过隔离主要角色,协作简化了结构,并在模型中明确了行为。

示例:在这个例子中, Wheels 和 Engine 是协作的部件,FrontAxle 和 RearAxle 是连接器。Car 是展示部件及其之间连接关系的组合结构。

Car Collaboration

部件

部件是表示包含的结构化分类器所拥有的一个或多个实例集合的图示元素。部件描述了实例在分类器中的角色。你可以在分类器的结构构件中创建部件,也可以在多种 UML 图中,如组合结构图、类图、对象图、组件图、部署图和包图中创建。

端口

端口定义了分类器实例与其环境之间,或分类器行为与其内部部件之间的交互点。

接口

组合结构图支持提供和需要的接口的球-插座表示法。根据需要,接口可以在图中显示或隐藏。

连接器

一条表示模型中关系的线。当你对分类器的内部结构进行建模时,可以使用连接器来表示部件或端口的两个或多个实例之间的链接。连接器定义了绑定到同一结构化分类器中角色的对象或实例之间的关系,并标识这些角色之间的通信。产品会自动指定要创建的连接器类型。


组合结构图示例:计算机系统分解

让我们为一个包含以下组件列表的计算机系统开发组合结构图:

  • 电源供应单元(PSU)

  • 硬盘驱动器(HDD)

  • 主板(MB)

  • 光驱(DVD-RW)

  • 内存模块(MM)

目前我们假设主板是内置声卡和显示适配器的类型:

Composite Diagram Example

为什么这个示例有效:这个PC组装图非常适合学习,因为每个人都知道计算机组件是如何组合在一起的。一旦你掌握了这个思维模型,将同样的模式应用到软件架构中就会变得直观。


如何在UML中绘制组合结构图:分步教程

组合结构图是一种UML图用于可视化类或协作的内部结构的图。它是一种主要在微观视角下对系统进行建模的组件图。

创建组合结构图

执行以下步骤以创建UML组合结构图:

  1. 选择 图 > 新建从应用程序工具栏中选择。

  2. 在 新建图窗口中,选择 组合结构图.

  3. 点击 下一步.

  4. 输入图的名称和描述。该 位置字段允许您选择一个模型来存储图表。

  5. 点击确定.

创建一个类

要在复合结构中创建一个类,请点击图表工具栏上的按钮,然后点击图表。

Create class

将创建一个类。

Class created

创建一个部件

要在类内部创建一个部件:

  1. 将鼠标指针移到类上。

  2. 点击资源目录按钮。

  3. 选择新建部件从资源目录中选择。

    已创建一个部件。

创建一个端口

要创建一个连接到类的端口:

  1. 将鼠标指针移到类上。

  2. 点击资源目录按钮。

    Clicking on Resource Catalog button

  3. 选择新建端口从资源目录中选择。

    To create port

    已创建一个端口。

    Port created

指定端口类型

右键单击端口并选择 打开规范… 从弹出菜单中选择。 端口规范 窗口出现。

单击 类型 组合框并选择一个类。

Select type

单击 确定 按钮以应用更改。类型将显示在端口的标题中。

创建连接器

要创建连接器,请单击 连接器 在图表工具栏上。

Create connector

从源形状拖动,将鼠标移动到目标形状上,然后释放鼠标按钮以创建连接器。

Connector created

继续完成图表。

Completed diagram

工具推荐:我测试过几种UML工具,Visual Paradigm用于复合结构图的拖放界面最为直观。仅资源目录功能就节省了数小时的菜单查找时间。


关键组件回顾:您的快速参考

在Visual Paradigm中,复合结构图是一种UML结构图,用于可视化类、组件或协作的内部结构。与展示静态关系的标准类图不同,该图“打开盒子”,展示内部部件如何在运行时交互以实现特定目标。

基本元素:

  • 部件:在包含的分类器内扮演特定角色的内部实例。

  • 端口:交互点,用于定义分类器或部件如何与其环境或其他内部部件通信。

  • 连接器:将部件或端口连接在一起的通信链路。

  • 接口: 支持提供的(棒棒糖)接口和必需的(插座)接口,用于定义外部依赖关系。

AI 驱动的辅助功能

AI 选项: 您也可以使用 AI 图表生成器 通过描述您的系统结构,并让 AI 自动完成部件和连接器的布局。

我使用 AI 工具的经验: 最初我持怀疑态度,但当我描述“一个带有验证、加密和日志组件的支付处理器”,并在几秒钟内获得一个初始图表时?这简直是效率的黄金体现。请记住:AI 生成的是草稿——你仍需完善细节。


结论:何时以及为何使用组合结构图

在多年跨企业项目中使用 UML 图表后,我完全可以肯定,组合结构图填补了系统设计文档中的一个关键空白。它们并非类图的替代品——而是强大的补充。

当您需要时使用组合结构图:

  • 记录复杂类或组件的内部架构

  • 澄清嵌套对象之间的运行时交互

  • 通过可视化、直观的系统图帮助新成员快速上手

  • 解决关于组合与聚合关系的歧义

  • 为模块化、可测试的设计建模基于端口的接口

当您不需要时可跳过它们:

  • 您正在记录简单、扁平的类层次结构

  • 您的受众仅需要高层次的系统概览

  • 时间限制更注重速度而非架构深度

学习曲线并不陡峭,尤其是使用 Visual Paradigm 等现代工具时。从系统中的一个复杂组件开始,绘制其内部结构,观察它如何将团队讨论从“我认为它是这样工作的……”转变为“这就是它确切的工作方式。”

组合结构图不仅仅是另一种 UML 工件——它们是一面透镜,将系统内部的运作清晰地展现出来。在当今复杂的软件环境中,这种清晰度不仅是一种优势,更是必不可少的。


参考文献

  1. 什么是组合结构图?: Visual Paradigm 提供的全面指南,涵盖定义、用途、示例以及在 UML 中创建组合结构图的逐步教程。
  2. 何时使用组合结构图:系统设计师的实用指南: 关于识别在系统设计和文档工作流中,组合结构图能提供最大价值的场景的实用建议。
  3. 精通 UML 2.5:组合结构图: 来自 Visual Paradigm UML 精通系列的深入模块,专注于使用敏捷建模实践的结构图。
  4. UML 组合结构图参考: 快速参考指南,涵盖组合结构图元素的语法、符号和最佳实践。
  5. AI 驱动的组合结构图建模: 指导如何利用 AI 工具加速组合结构图的创建和优化。
  6. 绘制组合结构图:用户指南: 官方 Visual Paradigm 用户文档,包含创建和编辑组合结构图的详细说明。
  7. AI 组合结构图生成器:OpenDocs: Visual Paradigm AI 驱动的图表生成功能的技术文档,包含使用示例和配置选项。
  8. AI 组合结构图生成器发布说明: Visual Paradigm 中 AI 图表生成功能的发布公告和功能概览。
  9. AI 图表编辑器工作流程指南: 使用 AI 辅助图表编辑器高效创建组合结构图的分步工作流程文档。