《软件方法(下)》8.3.3 泛化的一些重点讨论(202405更新)

DDD领域驱动设计批评文集

做强化自测题获得“软件方法建模师”称号

《软件方法》各章合集


8.3 建模步骤C-2 识别类的关系

8.3.3 泛化的一些重点讨论

8.3.3.1 子集的不相交和完整

泛化是集合关系,在建模泛化关系时,我们对泛化关系中的子类(子集)的要求应该严格到什么程度?例如,不同子集可以有相同的元素吗?子集的并集必须等于全集吗?

UML规范对此持宽松的态度,泛化关系缺省是无约束的。如果要表达一个元素只能出现在一个子集中,需要给泛化关系加{disjoint}约束,如果要表达一个元素必须能出现在一个子集中,需要给泛化关系加{complete}约束,如图8-98。

图片

图8-98 泛化的不相交和完整约束

(1)不相交

本书认为,同一个泛化集中的任意子类之间不相交,应该是缺省的做法。或者说,尽量把泛化建立在子类不相交的类之上。

例如,自然语言“员工有调度员、装卸工、配货员”,可能有的人画成图8-99的组合关联:

图片

图8-99 错误的关联关系

这当然是错误的。“员工有调度员、装卸工、配货员”指的是“员工”的对象集合包含了“调度员”、“装卸工”、“配货员”的对象集合,不是指一个“员工”对象由“调度员”对象、“装卸工”对象、“配货员”对象组成。这个“有”是集合的“有”,是泛化关系,如图8-100。

图片

图8-100 泛化关系

但图8-100也不是合适的建模结果,因为很可能允许员工身兼数职,同时既是调度员也是配货员。此时, “员工”的任意子集之间的交集不再为空,应该调整泛化结构所在的位置,例如改为图8-101。

图片

图8-101 调整泛化关系的位置

图8-101中,“调度员”、“装卸工”、“配货员”的概念和图8-99相比含义已经不同,它们变成了“职位”的一种。“职位”的任意子集之间的交集应该为空。

如果“调度员”、“装卸工”、“配货员”取“职位”的概念,那么类似图8-99的图8-102其实也不是不可以。

图片

图8-102 员工关联到具体职位

读者可以思考一下,如果把图8-102中的“员工”换成图8-79的“人”,下方的类换成“▲▲”和“〇〇”,可以吗?

如果对于不同职位,系统关注的差别在属性值上就可以体现,不需要在行为上体现,那么,图8-101的泛化关系可以取消,只保留“职位”,如图8-103。

图片

图8-103 删去子类以及泛化关系

★图8-101到图8-103的“职位”,严格来说应该是“职位规格”。可以看得出来,“职位”实例的属性值不会随具体员工而变化。如果要记住张三做装卸工和配货员分别干了多少活,拿了多少绩效,还需要另外的类来区分。例如“员工-任职-职位”或“员工-职位-职位规格”。

(2)完整

本书认为,不需要要求子类完整,否则会导致批量刷废话。

如图8-104,一开始A有两个子类B和C,知道应该是不完整的。如果为了完整,强行加一个口袋子类“其他A”,那么很可能所有的泛化关系都会在结尾加一个“其他*”,这种批量的废话不如不要,缺省认为其不完整即可。

而且,“其他A”的集合元素是不定的,现在的含义是“非B非C”,假设以后A再加一个子类D,“其他A”的含义就变成“非B非C非D”,元素也变少了。

图片

图8-104 不要求完整

当然,如果添加D为B或C更下一级的子类,是可以的。如果“其他A”经过时间的沉淀变成了一个领域术语,D作为“其他A”的子类也无妨——第6章所列的需求分类中的“非功能需求”就是这样的“其他A”的例子。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【随笔】Git 高级篇 -- 远程跟踪分支 git checkout -b | branch -u(三十五)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

Postman基础功能-常见类型的接口请求

天空灰暗到一定程度,星辰就会熠熠生辉。大家好,之前给大家分享了关于 Postman 工具的介绍以及安装,在当今数字化的时代,接口请求在软件开发和系统集成中扮演着至关重要的角色。而 Postman 作为一款强大且广受认可的接口测试工具&a…

【系统架构师】-案例篇(一)UML用例图

1、概述 用于表示系统功能需求,以及应用程序与用户或者与其他应用程序之间的交互关系。 2、组成 参与者(Actors):与系统交互的用户或其他系统。用一个人形图标表示。用例(Use Cases):系统需要…

OpenAI 今日(北京时间 5 月 14 日凌晨两点)将发布的大更新,不是 GPT-5,也不是搜索引擎

🦉 AI新闻 🚀 OpenAI 今日(5月13日)将发布的大更新,不是 GPT-5,也不是搜索引擎 摘要:OpenAI 预计即将推出一款新的 AI 语音助手,该助手不仅可以进行语音和文字交流,还能…

如何利用AI提高内容生产效率与AIGC典型案例分析

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

Spring Boot:让微服务开发像搭积木一样简单!

带你一探 Spring Boot 的自动配置和 Starter POMs 的神奇之处,展示如何通过几个简单的步骤就能让你的微服务应用在云端翱翔! 文章目录 1. 引言1.1 简述Spring框架的起源与重要性1.2 阐述文章目的:深入解析Spring核心功能与应用实践2. 背景介绍…

Attention Sink

论文发现自回归LLM存在的一个有趣现象:对于输入文本最靠前的少量几个token,无论它们在语义上与语言建模任务的相关性如何,大量的注意力分数都会分配给他们,如下图所示: 模型的前两层还能保持attention score更多分配给…

Angular入门

Angular版本:Angular 版本演进史概述-天翼云开发者社区 - 天翼云 安装nodejs:Node.js安装与配置环境 v20.13.1(LTS)-CSDN博客 Angular CLI是啥 Angular CLI 是一个命令行接口(Angular Command Line Interface),是开发 Angular 应用的最快、最…

C++/Qt 小知识记录6

工作中遇到的一些小问题,总结的小知识记录:C/Qt 小知识6 dumpbin工具查看库导出符号OSGEarth使用编出的protobuf库,报错问题解决VS2022使用cpl模板后,提示会乱码的修改设置QProcess调用cmd.exe执行脚本QPainterPath对线段描边处理…

python实现幸运大转盘 python实现抽奖

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 幸运大转盘是一种活动形式,广泛应用于各种场合,如商业促销、展览活动、企业庆典以及体育课堂等,旨在增加活动的趣味性和参与度。以下是对幸运大转盘的详细介

STM32实现1.8寸液晶屏 LCD SPI串口显示屏模块 TFT彩屏(标准库和HAL库实现)

目录 一、所选模块 液晶模块选择(淘宝上均有售卖) 模块引脚 二、嵌入式单片机型号 三、接线表设计 四、开发环境版本说明 五、标准库实现 六、HAL库实现 七、完整工程(内含标准库和HAL库源码) 代码链接 一、所选模块 液…

什么是卷积神经网络

在机器视觉和其他很多问题上,卷积神经网络(Convolutional Neural Network,CNN)取得了当前最好的效果,被广泛用于各个领域,在很多问题上都取得了当前最好的性能。 卷积神经网络原理 卷积神经网络发展历史中…

开源免费的定时任务管理系统:Gocron

Gocron:精准调度未来,你的全能定时任务管理工具!- 精选真开源,释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发,是一个轻量级定时任务集中调度和管理系统,用于替代L…

14.CAS原理

文章目录 CAS原理1.什么是CAS2.Unsafe类中的CAS方法2.1.获取UnSafe实例2.2.调用UnSafe提供的CAS方法2.3.调用Unsafe提供的偏移量相关2.4.CAS无锁编程2.4.1.使用cas进行无锁安全自增案例 CAS原理 由于JVM的synchronized重量级锁设计操作系统内核态下的互斥锁的使用,其…

多剖面土壤墒情监测仪

TH-GTS04在农业生产中,土壤墒情是影响作物生长的关键因素之一。为了更好地了解土壤的水分状况,为农业生产提供科学依据,多剖面土壤墒情监测仪应运而生。这种先进的监测设备具有多项功能优势,为土壤水分的精准监测提供了有力支持。…

火绒安全原理、用法、案例和注意事项

火绒安全是一款功能强大的安全软件,它采用了先进的安全技术和算法,通过实时监测、恶意代码识别、防火墙功能、沙箱技术和网络保护等多种手段,为用户提供全面的计算机安全防护。 1.为什么选用火绒安全? 火绒安全是一款优秀的安全软…

通过内网穿透实现远程访问个人电脑资源详细过程(免费)(NatApp + Tomcat)

目录 1. 什么是内网穿透 2. 内网穿透软件 3. NatApp配置 4. 启动NatApp 5. 通过内网穿透免费部署我们的springboot项目 通过内网穿透可以实现远程通过网络访问电脑的资源,本文主要讲述通过内网穿透实现远程访问个人电脑静态资源的访问,下一章节将讲…

实验10配置 IPv4 和 IPv6 静态和 默认路由(课内实验)

上面这个是实验描述 下面是给的实验图 接下来我们跟着实验一步一步进行下去 第 1 部分:配置 IPv4 静态和 浮动静态默认路由配置ipv4静态路由:配置 IPv4静态和 浮动静态默认路由 步骤 1:配置一条 IPv4 静态 默认路由。在 Edge_Router 上&am…

Leetcode经典题目之用队列实现栈

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 目录 1、题目展示2、题目分析3、完整代码演示4、结语 1、题目展示 前面我们了解过如何实现队列…

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint?2. 为什么要使用 Flask Blueprint?3. 如何使用 Flask Blueprint?4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时,保持代码的组织结构清晰…