UML之包含用例

news/2025/3/29 2:26:57/文章来源:https://www.cnblogs.com/gtyan/p/18776794

对于规模较大的用例,建模过程中经常会发现多个用例存在共享相同的子目标或子行为的情况。为避免重复并实现共享,UML提供包含(«include»)机制允许一个用例包含另一个用例。当然,被包含的用例可以是一个被多个其他用例(此时,该用例称为“基本用例”)同时包含的用例,也可以仅仅被一个其他用例包含,此时建模者使用包含机制的目的一般是将大型复杂用例拆解为更小的、更易处理的用例。
作为建模者必须清楚,被包含用例是基本用例的一部分,也就是说基本用例如果缺失被包含用例它将是不完整的,基本用例的目标也就将因此而无法实现,被包含用例与基础用例是一个有机组合的整体,不可独立存在。
提取公共行为创建«include»用例的一般步骤如下:
1.识别出多个用例中共有的目标行为,并创建一个用例包含该行为;
2.从原始用例提取共有目标相关的需求与描述(提取过的原始用例称为基本用例);
3.将提取出的相关需求与描述放置到一个新用例(被包含用例)中,如果被包含用例已存在,则复用它;
4.使用从基本用例到被包含用例的虚线箭头将两个用例连接起来;
5.将连接基本用例与被包含用例的虚线标记为“«include»”;
6.除非被包含用例需要仅与其自身关联而不与基本用例关联的参与者,否则不应将参与者与被包含用例连接,如果参与者同时参与基本用例和被包含用例,则该参与者只需与基本用例连接即可;
7.对于其他也应包含新的被包含用例的原始用例,从第2步开始重复上述过程。
图 1展示了一个使用包含用例的例子,对于读者到图书馆“借书”和“还书”这两个用例,它们都包含了“检查借书证状态”这个用例。无论读者借书还是还书,系统都将检查借书证的状态,例如借书证的有效期等。如果不执行“检查借书证状态”这个用例,则“借书”和“还书”两个用例都将无法完成,“检查借书证状态”这个被包含用例是“借书”和“还书”两个基本用例的不可缺少的组成部分。

图 1 基础用例共享被包含用例
在上图中,读者是触发“借书”和“还书”用例的参与者,同时读者也是“检查借书证状态”用例的触发者,所以读者也是“检查借书证状态”的参与者,但由于读者已经与它的基本用例建立关联,所以不需要在读者与“检查借书证状态”之间重复建立关联。
假设用例“检查借书证状态”不能独立在当前系统中完成,而是必须借助另外一个名为“借书证管理系统”的参与者来获得借书证状态,此时被包含用例可以与名为“借书证管理系统”的参与者建立关联,如图 2所示。

图 2 建立被包含用例与参与者关联
如前所述,使用«include»用例不仅可以用在将多个用例共通部分抽取出来的场景,也可以用在将大型复杂用例进行分解的场景。例如,对储户去银行/ATM机取钱的场景,可以建立一个名为“取钱”的用例,但执行该用例涉及的环节比较多,因而可以考虑将其分解为多个“小”用例,然后“取钱”用例通过«include»关系将它们整合到一起,如图 3所示。

图 3 复杂用例分解
在用例之间存在继承关系时,使用被包含用例建模要注意用例之间的继承关系包括对用例的包含。例如在图书馆借阅场景下,假定借阅人群被划分为两类(或两档),能够“借阅图书”的“普通借阅者”和能够“借阅视听材料”的“视听借阅者”,其中视听借阅者拥有普通借阅者的所有权限,即视听借阅者也可以借阅图书,而用例“借阅视听材料”与“借阅图书”高度相似,只是被借阅的材料更宽泛。因而在参与者“视听借阅者”与“普通借阅者”之间、用例“借阅视听材料”和“借阅图书”之间都存在泛化关系,如图 4所示。

图 4 继承用例使用包含用例
在执行用例“借阅图书”和“借阅视听材料”时,用例都会去检查借阅者的借书证状态。如果在建模时将这个过程独立建模为用例“检查借书证状态”,则只需要在基本用例“借阅图书”和被包含用例“检查借书证状态”之间建立«include»关系即可。用例“借阅视听材料”也必须包含“检查借书证状态”才能够完整达成用例目标,但由于用例“借阅视听材料”继承于用例“借阅图书”,而用例“借阅图书”包含了用例“检查借书状态”,继承使得用例“借阅视听材料”已经包含用例“借阅图书”的特性,其中包括“借阅图书”对用例“检查借书证状态”的包含关系,因此不需要重复在用例“借阅视听材料”和“检查借书证状态”之间建立«include»关系。
基本用例调用被包含用例与程序中一个函数调用另一个函数完全不同,基本用例调用被包含用例没有调用参数,被包含用例运行完毕后也没有返回值,用例之间的包含关系更类似“复制-粘贴”——将被包含用例复制后粘贴到基本用例的适当位置。
最后,通过上述说明还可以推导出一个结论:一个基本用例可以包含多个被包含用例;一个被包含用例也可以被多个基本用例包含。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905260.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ESP32的物联网传感器和超声波距离传感器,Watmonitor可进行实时水位监测

Watmonitor是一个使用物联网传感器进行实时水位监测的自托管应用程序,具有多语言支持和易于访问的数据。Watmonitor是一个多功能的、自托管的web应用程序,专为实时水位监测而设计。使用基于ESP32的物联网传感器和超声波距离传感器,它可以跟踪各种环境中的水位,如水井,水箱…

【Java】【SpringBoot】Quartz——动态任务调度

回顾:前面学习了quartz的基础使用:https://www.cnblogs.com/luyj00436/p/18781141 定时任务可能是按照预设的时间进行。可是实际中,我们肯定希望自由的进行任务生成、暂停、恢复、删除、更新等操作。 Quartz本身没有提供动态调度的功能,需要自己根据相关的API开发。 场景订…

GrapeCity Documents V8.0 新版本特性

GcExcel V8.0 新版本特性丰富,包括:数据导入方面,可从多种数据源(如自定义对象、DataTable 等)导入,为 IRange.ImportData (..) 新增重载;假设分析上,通过 IWorksheet.Scenarios 接口支持 “方案” 功能,可进行多种操作且受保护工作表也能编辑;数据透视表能绑定表格数…

如何寻找替代FTP传输文件的软件,解决文件传输难题?

FTP因其操作简单、客户端种类多、价格低廉(甚至免费)等优势,受到众多企业的青睐,在全世界范围内得到广泛的应用。但它也面临着一些安全和效率方面的挑战,因此企业都在寻找可平滑替代FTP传输文件的软件。有以下局限性: 1.安全性弱:明文传输,漏洞频发,容易遭到DOS攻击;…

20244205 《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名: 高赫 学号:20244205 实验教师:王志强 实验日期:2025年3月24日 必修/选修: 公选课 1.实验内容 (1).熟悉Python开发环境; (2).练习Python运行、调试技能; (3).编写程序,练习变量和类型、字符串、对象、缩进和注释等; (4).编…

微积分的本质——导数.18790288

本篇为3b1b系列【微积分的本质】笔记 原视频:02-导数的悖论 | 03-用几何来求导 | 04-直观理解链式法则和乘积法则定义导数 这是一个随着时间变化,车辆行驶距离的坐标图在横轴的任何一个点\(t\)上,如果你去查看车的车速表,上面都有一个数字表示当前的车速,但这是如何计算的…

推荐8款 .NET 开源、免费、实用的 Windows 效率软件

前言 今天大姚给大家推荐8款基于 .NET 开源、免费、实用的 Windows 效率软件,开发工作提升利器,希望可以帮助到有需要的小伙伴。 DevToys DevToys是一个专门为开发者设计的Windows工具箱,完全支持离线运行,无需使用许多不真实的网站来处理你的数据,常用功能有:格式化(支…

解密prompt系列51. R1实验的一些细节讨论

DeepSeek R1出来后业界都在争相复现R1的效果,这一章我们介绍两个复现项目SimpleRL和LogicRL,还有研究模型推理能力的Cognitive Behaviour,项目在复现R1的同时还针对R1训练策略中的几个关键点进行了讨论和消融实验,包括DeepSeek R1出来后业界都在争相复现R1的效果,这一章我…

读DAMA数据管理知识体系指南30文件和内容治理

读DAMA数据管理知识体系指南30文件和内容治理1. 方法 1.1. 诉讼应诉手册1.1.1. 电子取证工作一般在发生诉讼的时候进行1.1.2. 指引应明确电子取证的目标环境,并评估当前环境和目标环境之间是否存在差距1.1.3. 应记载电子取证活动生命周期的业务流程,明确电子取证团队的角色和…

为什么springboot的jar可以直接启动

一、讲述 1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。 2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的 类。 3.java -jar会去找jar中的manifest文件,在那里面找…

折腾笔记[17]-使用rust创建linux系统服务

使用rust内嵌配置文件, 创建新用户并创建linux的service服务;实现后台服务循环打印时间到`/tmp/log_file_service`. Use Rust to embed configuration files, create new users, and create service services for Systemd; Implement a backend service loop to print time to …