UML之属性与参数的多重性

news/2024/12/27 16:11:45/文章来源:https://www.cnblogs.com/gtyan/p/18636024

在UML中,多重性是指一个条目潜在的数量范围。多重性可被用于属性、操作参数、关联关系。UML元模型也使用多重性对元模型元素之间的关系进行约束。多重性总是包含基数值,它是相关条目在现实世界中的确切数量。本文将说明类属性和类操作参数的多重性。
一、属性的多重性
假设我们需要定义一个表示书的Book类,它包含有一系列的属性。我们只选取其中的书名(title)、作者(author)、页数(pages)少数几个属性进行多重性研究说明。在此前提下,Book的相关属性用类图表示如下:

在上图中,书的作者(author)是一个人,但在现实世界中,一本书的作者可能不止一人。为了能让Book类的定义适应大多数情况,我们可以考虑将作者增加到三人,这三名作者分别用属性author1、author2、author3表示,修改后的类图如下:

不过,上述设计还是存在一些潜在的问题,下面分别讨论。
首先,一本书的作者数量的限制(上述设计中的3个)是否合理?一些论文期刊允许最多3~5名作者,而许多书的作者则比3个更多,在科学研究领域,一些论文(有些论文本足以作为一本书)的作者超过了3500人。显然3500个作者的情况并不多见,但为了能够实例化作者众多的书籍,必须增加更多的作者属性。但多少个作者是合适的,这是一个难以确定的问题。
其次,定义数量庞大的作者属性而被实例化的书的作者又很少时,由于无法约束必须将作者挨个存储在排在前面的属性中,我们将不得不检查所有的作者属性,显然它的代码实现将是笨重低效的。
最后,可以使用循环简化处理众多的作者属性吗?由于这些属性的名称不同(虽然只是后缀不同,但它们是不同的属性名),对这种名称的循环在大多数编程语言中实现是困难的。
UML为上述问题提供的解决方案是指定属性的多重性,即可通过标记说明作者(author属性)的多重性表达这个属性可以存储多个值。采用多重性的Book类图如下:

在上图中可以看到,属性author在其类型Person后增加“[1..*]”说明,“[1..*]”定义了属性author的多重性,它表明属性author的值可以从1个到无限多个,或者说属性author至少有一个值。多重性使用中括号“[]”说明其允许的数量,在“[1..*]”中,1是下限,*是上限,中间的两个点表示省略的中间值,而*代表无限大,因此在这个类图中,属性author中可存储作者的数量是从1个到无限个,即属性author存储作者的数量没有限制。使用中括号“[]”说明多重性时,上限必须大于等于下限。
通常一本书至少有一名作者,而在某些特殊情况下,书的作者信息可能丢失了(佚名),或者某些电子书的作者故意不留下自己姓名,此时author这个属性的多重性就应当设定为“[0..*]”,表示有零个或者多个作者,修改后的类图如下:

在多重性为“[0..*]”时,因为其值最少可以为零,最多没有限制,表明该属性是一个可选的属性,又是一个可以有多重值的属性。在这种情况下,可以仅使用“*”更简单地表示,即“[*]”。按这种方式表达的类图如下:

了解了属性author的多重性以后,或许有人认为属性pages也应当被指定多重性。pages表示一本书的页数,书的页数确实也是一个范围内的数值,但是对于确定的一本书而言,作者可能有多个,而它的页数却是确定的一个数值。因此属性pages不具备多重值。如果您的意图是限制一本书页数所允许的范围,可以使用约束(constraint)进行指定。
同理,表示书名的属性title也不具备多重性。不过,在UML中,也允许我们使用多重性的表示方法明确指明一个属性仅有一个值。其表示方法是将多重性的上下限均指定为1,即“[1..1]”或“[1]”,故类Book的类图可修改如下,属性title和pages分别使用了上述两种形式限定其值仅有一个。

在UML中,多重性的默认值是“[1]”,即如果一个属性不指定多重性则表明该属性应当有且仅有一个值。因此,上面的两个图是等价的。所以,如果一个属性的值是可选的,即它的值可为0个或1个,此时需要明确标明其多重性,即“[0..1]”。例如一本书交由出版社正式出版时,会有一名编辑负责该书的编辑与审校,而一本书如果是电子书,则可能由作者直接发布而没有编辑。我们为Book类增加属性编辑(editor)时,同时使用多重性“[0..1]”表明其是可选的。修改后的类图如下:

在上图中,我们同时表明了属性pages的约束,约束使用大括号“{}”进行说明,它可以在属性中内嵌说明,也可以在类图中使用一个单独的区块说明,或者也可以在类图的注释中说明。上图采用内嵌说明的方式指定了属性pages的约束。
多重性与约束可同时指定,不过一些UML工具对使用内嵌方式指定这两者支持不足(主要是不支持内嵌方式的约束),此时可将约束放在类图的注释中进行说明。例如同时标明属性pages的多重性及约束时,可使用下图表示:

二、操作参数的多重性
我们也可将多重性应用于操作参数,其用法与在属性上应用相同。当然,如果一个参数的多重性为“[1]”时,我们通常省略不标记。
例如在下图中,类Ride中有一个设定骑行日程的schedule操作,它包含标明多重性的三个参数:参数for的多重性为“[1..*]”,表示参与骑行的骑手至少有一个;参数itinerary的多重性为“[2..*]”,表示路线至少有两个点(起点与终点,还可包含若干途经点);参数isSharedRide的多重性为“[0..1]”,表示它是一个可选参数,即该骑行日程是否可分享,通常一个参数如果是可选参数,应为其指定缺省值。

类图Marriage是另外一个例子,不同于上述示例中各参数多重值个数不定,其操作wed中前三个参数都有严格限定的值的个数。

多重性还可应用于其他一些行为元素中,其用法大抵一致,使用时可以举一反三,本文不再赘述。

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

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

相关文章

水仓水位异常识别智慧矿山一体机构建智慧矿山系统:监控硬盘如何影响监控系统的稳定性?

中国作为全球最大的煤炭生产和消费国,煤矿行业在能源供应中依然占据重要地位。虽然国家逐步推动能源结构转型,发展可再生能源,但煤炭仍然在短期内满足能源需求方面发挥着重要作用。近年来,煤矿安全生产水平有所提高,但仍存在一定的安全隐患。国家对煤矿的安全监管力度加大…

FANUC发那科机器人控制箱维修操作流程

FANUC发那科机器人在工业自动化领域中占有重要地位,其高效、稳定和精确的性能赢得了众多用户的青睐。然而,随着使用时间的增长,可能会出现FANUC机器人控制柜故障,影响到发那科机器人的正常运行。本文将详细介绍发那科FANUC机器人控制箱维修操作流程,帮助企业更好地了解和掌…

CH592 memcpy

memcpy提速方法: #define ALIGN_MASK 0x3 #define COPY32 *d32 = *s32; d32++; s32++; #define COPY8 *d8 = *s8; d8++; s8++; #define SET32(x) *d32 = x; d32++; #define SET8(x) *d8 = x; d8++; #define REPEAT8(expr) expr expr expr expr expr expr expr expr type…

【工作相关】gki boot.img下载

地址 https://source.android.com/docs/core/architecture/kernel/gki-android13-5_15-release-builds?hl=zh-cn Android13-5.15 发布版本查看Linux version信息: 相关解包命令参考这里【传送门】 解包过程:~/cts/gki$ ../bin/unpack_bootimg --boot_img boot-5.15.img --ou…

鸿蒙NEXT开发实战教程—小红书app

幽蓝君最近发现小红书是个好东西,一定要多逛今天就浅浅模仿一下小红书app,主要是底部tab栏和主页部分。首先看一下tabbar,由于中间有一个红色按钮的存在,所以这里我使用自定义导航栏来实现,自定义的实现逻辑是在本来app的上层叠加一层自定义tabbar,使用监听index的变化来…

Python数据结构之双向循环链表

1、循环双向链表特点通过当前结点直接获取上一结点 通过头结点的上一结点直接可以去找到尾结点 可以进行反向循环链表,即反转链表2、头结点 链表头: 在数据结构中,链表是一种常见的存储结构。链表的每个节点包含数据和指向下一个节点的指针。链表头是链表的第一个节点,它在…

CDS标准视图:功能位置 I_FunctionalLocation

视图名称:I_FunctionalLocation 视图类型:基础 视图代码:点击查看代码 @EndUserText.label: Functional Location @Analytics: { dataCategory: #DIMENSION } @VDM.viewType: #BASIC @AbapCatalog: { sqlViewName: IFUNCTLLOCATION, compiler.compareFilter, preserveKey } …

DNS 原理入门

DNS 原理入门 导读 DNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作。我的目标是,读完此文后,你就能完全理解DNS。一、DNS 是什么? DNS (Domain Name System 的缩写)的作用非…

Pycharm 2024.3 安装详细教程与激活方法(附常见问题解决)

Pycharm概述 Pycharm是JetBrains公司推出的一款功能强大的Python集成开发环境(IDE),凭借其丰富的功能和工具集,极大地提升了开发者的编程效率和工作体验。温馨提示: 本文中的方法仅供学习交流使用,如果条件允许,请支持正版软件。删除旧版本 Pycharm 如果您的电脑中已经安…

算法网关视频分析网关小知识:如何对视频分析系统实施冗余设计以提高稳定性?

在城市交通管理中,视频分析系统扮演着至关重要的角色,它不仅需要实时监控和分析交通流量,还需要在各种复杂环境下保持稳定运行。为了确保视频分析系统在面对设备故障、网络中断、电源波动等不可预见情况时仍能保持高可用性,实施冗余设计成为了提高系统稳定性的关键策略。以…

敏捷销售的基础:协同工具如何助力车企升级

今年来,国家在汽车产业领域频频出台利好政策,从新能源汽车补贴延续到以旧换新购车补贴,这一系列措施为汽车企业创造了全新的市场机遇。然而,面对复杂的销售网络、多样的营销活动和庞大的数据管理需求,车企如何迅速响应政策、提升协作效率,成为当前的核心挑战。 政策推动下…

在北大的第一学期结课小记——2024.12.27

本来是想昨天下午写的,因第一学期之课程在26日上午第四节课便已然完结,但却因个人的懒惰拖到了今日,我实在是罪无可恕,愿不要在接下来的期末复习上延续此般习气在开学初,本学期的选课方案可谓充满了妥协与权衡:为防掉课线代放弃了xsq,计概放弃了yhf,物院思修强制选课撞…