《分析模式》漫谈07-怎样把一张图从不严谨改到严谨

DDD领域驱动设计批评文集

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

《软件方法》各章合集


下图是《分析模式》原书第2章的图2.10,里面有一些错误和考虑不周的地方:

图片

2004中译本和2020中译本的翻译如下: 

图片

图片

基本上都是照搬,没有改过来。

Fowler网站上提供了该图的UML版本:

图片

但从图上看,除了多重性和角色颠倒的错误得到修正——而且也没修正到位,角色应该靠近Party Type而不是放中间。

其他错误没有改过来,只是把这个图的表示法改成了UML。

我们下面先来看一下,图2.10有哪些问题,以及应该怎么改。

我把有问题的地方编了号,如下:

图片

(1)

约束应该加在Accountability上,而不是加在Accountability Type上。

一般来说,**Type(**类型)这样的类,它的对象个数很少,而且值很稳定。很少需要在上面加不变式之类的约束。

就像一个类是“人”,一个类是“性别”,约束加在哪里?一般是加在“人”上面。

人的属性值会变,年龄增加,个子变高,体重变重,结婚有配偶……

他的属性值之间可能会存在约束。例如,如果年龄不到20岁,是不能有配偶的。或者说,如果说你年龄是20岁以下又有配偶,那就违反了约束。

如果在“性别”上搞一个不变式,“性别”除了“名称”,还有什么属性?让“性别”知道“人”然后把“性别”所关联的“人”(一个很大的集合)拉进来?那为什么不干脆放在“人”上面呢?

图2.10就是如此。约束加在Accountability Type上,但第1行就定义了一个x,说是self.Accountability,这不又绕回去了嘛,干吗不把约束加在Accountability上面呢?

(2)

假设我们咬紧牙关,坚持己见,一定要把约束加在Accountability Type上,但self.Accountability的Accountability在哪里呢?图上没有。

(3)

即使图上有Accountability,还有另一个问题:Accountability Type的self.Accountability是一个集合,不能直接.commissioner,得加类似->forAll(a|a.commissioner……

2020中译本把原文以复数形式表示的词都加了一个后缀“集合”,这个做法好不好另外讨论,不过如果这样做的话,下面这个地方也要加一个“集合”:

图片

(4)

多重性和角色颠倒的问题:type、all types放在Party一侧,supertype和subtypes的多重性颠倒。

(5)

多了一个冗余关联all types,意思是Party所属的Party Type以及其上的所有supertype组成的Party Type集合。

在图上是用自然语言表达的,现在可以用OCL的闭包(Closure)运算来表达并删除冗余关联。

求闭包是关系代数常见试题,下图是2021年的一道软考题:

图片

OCL有closure运算:

图片

考虑以上的问题之后,我们修正的类图如下:

图片

修改的要点:

(1)加上了“当责(Accountability)”。

(2)把约束放在“当责”上。

(3)多重性和角色位置的调整。

(4)删除冗余all types关联

(5)约束的意思是:

对“当责”的“委托方”(当事者)的“类型”(当事者类型)做求超类型的闭包运算,就得到了原书图上的冗余all types“当事者类型”集合,然后,该集合中有元素也在“当责”的“类型”(当责类型)的“委托方”(当事者类型)集合中,也就是说,这两个集合交集不为空。

对“责任方”也如此操作,就得到了图中的约束。

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

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

相关文章

widows下 vscode 的 terminal / powershell,ctrl+v失灵,输出^v

问题 原因 最近装了PSReadLine Import-Module PSReadLineSet-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle InlineView Set-PSReadLineOption -EditMode Emacsvscode不兼容 解决方法 注释掉最后面的 Import-Module PSReadLineS…

2021年12月电子学会青少年软件编程 中小学生Python编程等级考试三级真题解析(选择题)

2021年12月Python编程等级考试三级真题解析 选择题(共25题,每题2分,共50分) 1、小明在学习计算机时,学习到了一个十六进制数101,这个十六进制数对应的十进制数的数值是 A、65 B、66 C、256 D、257 答案&#xff…

浅析Resource Quota中limits计算机制

前言 在生产环境中,通常需要通过配置资源配额(Resource Quota)来限制一个命名空间(namespace)能使用的资源量。在资源紧张的情况下,常常需要调整工作负载(workload)的请求值&#xf…

MySQL周内训参照4、触发器-插入-修改-删除

触发器 1、用户购买商品时,要求库存表中的库存数量自动修改 详细示例 delimiter $$ create trigger stock_change after -- 事件触发在 下订单之后 insert -- 监视插入事件 on stock -- 监视 order订单表 for each row begin update stock set stockstock-new.st…

ROT5、ROT13、ROT18、ROT47全系列加解密小程序

ROT5、ROT13、ROT18、ROT47全系列加解密小程序 这几天在看CTF相关的课程,涉及到古典密码学和近代密码学还有现代密码学。自己编了一个关于ROT全系列的加、解密小程序。 ​ ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性&a…

音视频入门基础:H.264专题(8)——H.264官方文档的描述符

音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

开发自动回复信息的插件:代码的力量与智慧!

在信息爆炸的时代,自动回复信息的插件成为了许多用户和管理者的得力助手,这些插件能够根据预设的规则或算法,自动、快速、准确地回复用户的信息,极大地提高了沟通效率和用户体验。 而开发这样一款插件,离不开一系列精…

这三款工具很好用,赶快试试

FileZilla FileZilla是一款免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。它是一个快速、可信赖的FTP客户端以及服务器端开放源代码程序,具有多种特色和直觉的界面。FileZilla客户端版是一个方便高效的FTP客户端工具…

校企合作,为人才培养注入新动力

树莓集团在校企合作育人方面取得了显著成效,通过共建专业、定制课程、实习实训等多种方式,实现了教育资源的优化配置和高效利用,为高校和企业提供了更多的发展机会和合作空间。 1、共建专业与实验室:树莓集团与高校共同建设数字产…

Transformer教程之Transformer的历史背景

在现代人工智能领域,Transformer模型已经成为一种不可或缺的技术,它在自然语言处理(NLP)和计算机视觉等多个领域取得了巨大的成功。本文将带你回顾Transformer的历史背景,了解它是如何从最初的构想到今天的广泛应用的。…

分享一款永久免费内网穿透工具——巴比达内网穿透

最近在做web项目,想办法将web项目映射到公网进行访问,由于没有固定IP,只能使用内网穿透的方法,于是在网上搜索了一番,只有神卓互联旗下的这款巴比达内网穿透是真正免费的, 其它的要么用不了、要么限制没有流…

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息,在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…

Dataease配置Nginx代理

Dataease配置Nginx代理 一.修改前端静态资源地址和后端接口地址 **1.**修改应用程序的上下文路径 配置文件地址:backend/src/main/resources 找到文件application-whole.properties,做如下修改: **2.**修改前端静态资源路径和打包配置 配…

产品经理面试指南:四大专栏助你成功上岸

面对产品经理的职位面试,你是否感到有些紧张和迷茫?不用担心,我们为你精心准备了四大面试专栏,包括产品经理专业面试、部门负责人复试、HR面试以及面试技巧,让你在面试过程中如鱼得水,轻松应对。 01 产品经…

ScheduledThreadPoolExecutor和时间轮算法比较

最近项目中需要用到超时操作,对于不是特别优秀的timer和DelayQueue没有看。 Timer 是单线程模式。如果某个 TimerTask 执行时间很久,会影响其他任务的调度。Timer 的任务调度是基于系统绝对时间的,如果系统时间不正确,可能会出现…

视频多功能闪剪助手,智能去重去水印一键剪辑

这款软件具有全平台去水印的功能,无论视频来自哪个平台,无论水印的位置如何变换,它都能轻松去除。同时,它还支持各种去重方法,无论重复内容的形式如何,它都能一一识别并移除,让你的视频内容始终…

干货:ANR日志分析全面解析

ANR类型 出现ANR的一般有以下几种类型: 1:KeyDispatchTimeout(常见) input事件在5S内没有处理完成发生了ANR。 logcat日志关键字:Input event dispatching timed out 2:BroadcastTimeout 前台Broadcast:onReceiver在…

深圳技术大学oj B : 所有不含逆序对的组合数

Description 数组中可能包含重复的数字, 求由这些数字组成的不重复字符串, 且字符串中不包含逆序对。 Input 有若干组测试数据,(1~20之间) 每一组测试数据第一行输入一个整数 n (0 ≤ n ≤ 20)&#xff…

【Micro-ROS学习】

Micro-ROS 是专为 ROS 2 设计的,它允许在微控制器(microcontrollers)上实现ROS 2的功能。Micro-ROS 从 ROS 2 架构优化而来,目的是让那些资源有限的嵌入式设备也能够接入ROS 2生态系统,享受ROS 2带来的标准化通信、模块…

【Redis】三大Redis内存分析工具介绍(Redisinsight、RDR、RMA)

一、RedisInsight工具介绍 RedisInsight是一款Redis官方开源的可视化管理工具,旨在帮助开发人员和管理员更轻松地设计、开发和优化Redis应用程序。以下是关于RedisInsight的详细介绍: 1、工具概述 定义:RedisInsight是一个直观且高效的Red…