怎样把书上的事件图改编成活动图-《分析模式》漫谈43
DDD领域驱动设计批评文集
做强化自测题获得“软件方法建模师”称号
《软件方法》各章合集
《分析模式》中模型图的UML改编,之前也有人做过,Martin Fowler网站上给出了部分改编成果。
这些改编成果只覆盖了部分章节,而且只是把类型图(Type Diagram)改编成类图。书中的动态模型图,包括交互图(Interaction Diagram)、事件图(Event Diagram)和状态图(State Diagram)没有改编。
网络上其他地方也未搜到把书中的动态模型图改编成UML模型图的尝试。
之前的改编只是把类型图(Type Diagram)改编成类图,原因可能是这个相对来说比较容易,而动态模型图的改编更难一些。
动态模型图中,交互图和UML序列图的对应,状态图和UML状态机图的对应还是比较直接的,事件图又更复杂一些。
2024中译本(可能要到2025年初出版)将用UML改编全部模型图,覆盖全部章节,包括静态模型图和动态模型图。
**********
下面,我们来展示如何把事件图转成UML的活动图。
全书第一张事件图是图3.15:

图1 《分析模式》图3.15
Fowler在书中说,他是遵循James Odell的用法,并给出了参考书:James Martin和James Odell的Object-Oriented Methods: A Foundation(1995)。
UML1中的活动图来源是比较复杂的。以下文字摘自Martin Fowler的UML Distilled第2版(1999):
the activity diagram combines ideas from several techniques: the event diagrams of Jim Odell, SDL state modeling techniques, workflow modeling, and Petri nets.
可以看到,UML1的活动图参考了Odell的事件图、SDL状态建模、工作流建模和Petri网。
UML2的活动图做了大变革,改为基于Petri网的语义,解除了和其他表示法的绑定。
**********
我们先给出改编后的结果:

图2 原书图3.15的UML改编
并把图3.15的活动参数类型和图3.14的类图上的类对应:

图3 图3.15的活动图和图3.14类图的对应
改编后的图3.15看起来比原图复杂,但更严谨一些。
几个值得一提的地方:
(1)事件改为数据
下图是《分析模式》中给出的事件图规范:

图4 《分析模式》中给出的事件图规范
Odell的事件图上,结点是操作,是动词,输出是事件类型(event type,区分于事件发生event occurrence),还是动词。名词(对象、数据)呢?这个定义是有问题的。
Fowler可能也觉察到了这一点。图1给出的原图3.15中,Fowler在输出的地方写的是associated observation concepts(关联观察概念),这怎么看也不像是“事件类型”的命名,更像是输出的数据。

图5 associated observation concepts怎么看也不像“事件类型”
(2)把evaluate proposal(评估提案)合并到“提议观察”中
根据图4的事件图规范,菱形处应该是一个布尔表达式,这是合理的。但《分析模式》原图3.15中,菱形处所标的evaluate proposal看起来像是行为,不是一个条件表达式,这应该是Fowler的问题。

图6 《分析模式》原图3.15的菱形处看起来不像条件表达式
在UML活动图改编中,我们把evaluate proposal变成更合适的条件表达式。即使Fowler可能有这样的原意,想在evaluate proposal中包含一些行为,也应该把这些行为合并到Propose Observation中。
(3)添加了一个datastore(数据存储)结点
“做观察”活动应该有两个输出,一个是关联的观察概念(一个“观察概念”的对象集合),另外还应该产生观察的结果(一个“观察”的对象集合)。
前者Fowler原图有表达,并作为“提议观察”的输入;后者Fowler原图没有表达,所以添加一个datastore(数据存储)结点接收“做观察”产生的观察结果数据及令牌。
(4)钉耙符号
改编的图3.15中,结点图标右下角有一个钉耙形状的符号,说明这是一个Action(动作),是对Activity(活动)的调用,而不是Activity本身。

图7 图上是Action,不是Activity
Activity(活动)是定义。Activity Diagram(活动图)描述活动的实现,活动图上并没有“活动”,只有活动的调用(Action),调用的活动可以是其他活动,也可以是自己(递归)。
所以,平时我们见到的“流程图”或“活动图”,很多是不严谨的,把定义和使用混在了一起。
**********
一些参考:
(1)2002年4月,James J. Odell在UMLChina做的交流
交流实录在:umlchina.com/Chat/odell.htm

翻译整理发表在《非程序员》2002年第5期,所有各期《非程序员》杂志的pdf下载:umlchina.com/xprogrammer/index1.html


(2)“水蒸馏器”案例
如果想深入学习活动图,可以参考此案例,里面大量而且深入地使用了活动图。
umlchina.com/url/video.html,里面的SYS-001番号。

相关文章:
怎样把书上的事件图改编成活动图-《分析模式》漫谈43
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》中模型图的UML改编,之前也有人做过,Martin Fowler网站上给出了部分改编成果。 这些改编成果只覆盖了部分章节,而且只是把类型图&#…...
CodeFormer——基于代码本查找变换器的鲁棒盲人脸修复翻译
文章目录 原文翻译摘要1 Introduction2 Related Work3 Methodology3.1 Codebook Learning (Stage I)3.2 Codebook Lookup Transformer Learning (Stage II)3.3 Controllable Feature Transformation (Stage III) 4 Experiments4.1 Datasets4.2 Experimental Settings and Metri…...
监控场景下,视频SDK的应用策略
在当今数字化、智能化的时代背景下,音视频技术的快速发展正深刻改变着各行各业。特别是在监控领域,音视频SDK的应用不仅极大地提升了监控系统的性能与效率,还推动了监控技术的智能化转型。 一、音视频SDK 音视频SDK是一套集成了音视频编解码…...
前端面试必备!HTML 超实用考点全解析
在前端开发的广阔领域中,面试是检验开发者能力的关键环节。而 HTML 作为前端开发的基础,在面试中常常占据重要地位。无论是初入前端领域的新人,还是经验丰富的开发者,都可能在 HTML 的相关问题上遭遇挑战。今天,就让我…...
自动驾驶系统研发系列—避免事故的利器:AEB自动紧急制动系统详解
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…...
zabbix 6.0 监控clickhouse(单机)
zabbix 6.0 LTS已经包含了clickhouse的监控模板,所以我们可以直接使用自带的模板来监控clickhouse了。 0.前置条件 clickhouse 已经安装,我安装的是24.3.5.47zabbix-agent 已经安装并配置。系统是ubuntu 2204 server 1. 新建监控用户 使用xml的方式为…...
Redis的RDB执行原理
文章目录 引入‘页表’的概念Copy-On-WriteRDB快照 引入‘页表’的概念 Linux里面每个进程都是无法直接操作物理内存的,每个进程只能用页表映射本进程的虚拟内存到物理内存的映射。 bgsave的时候,主进程会fork(复制)一个子进程&am…...
速度背!24下软考网工“经典100道母题来了”!
2024下软考已经迫在眉睫了,准备考下半年软考多媒体应用设计师的小伙伴们准备得怎么样了? 单单只啃书肯定不太够,今天给大家整理了多媒体100道经典题, 这些都是历年高频考点整理,包含24下软考80%以上考点,跟…...
three.js 纹理(Texture)、深度纹理(DepthTexture)、视频纹理(VideoTexture)
纹理(Texture) 创建一个纹理贴图,将其应用到一个表面,或者作为反射/折射贴图。 构造函数 Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) // load a texture, set wrap…...
广东自闭症全托机构:提供高质量的康复服务
在广东这片充满活力的土地上,自闭症儿童的康复需求日益受到社会各界的关注。在众多自闭症全托机构中,位于广州的星贝育园自闭症儿童寄宿制学校以其专业的团队、全面的服务体系以及显著的康复成效,成为了众多家庭的信赖之选。 星贝育园&#…...
Nodejs安装配置及创建vue项目
文章目录 Node简介Node官网安装node.js验证是否安装成功 npm简介配置node远程拉取仓库安装cnpm(国内插件管理命令)npm相关参数解读 vue简介创建vue项目 Node 简介 Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境,它让开发人员能…...
浅析正交投影矩阵和透视投影矩阵的推导
先上矩阵的内容。在opengl中,分别通过glOrtho函数和glFrustum函数得到正交投影矩阵和透视投影矩阵。 glOrtho 函数描述生成正交投影矩阵。 (左、 下、 近) 和 (右、 上、 近) 参数分别指定近剪裁平面上映射到窗口左下角和右上角的点,假定眼睛位于 (0、0…...
python四舍五入保留两位小数不足补0
在 Python 中,当你想要对数字进行四舍五入并保留两位小数,同时确保当小数位数不足两位时能够补零,你可以继续使用 round() 函数进行四舍五入,然后在格式化输出时使用字符串格式化方法来确保小数位数。 round() 函数本身只会返回四…...
Mybatis-15.动态SQL-if
一.动态SQL 比如只想查询名字中带‘张’的,其他的都不进行条件筛查 会发现什么也查询不出来 我们希望SQL语句能够根据我们所输入的查询值进行动态的变化,就需要使用到动态SQL。动态SQL中有很多标签,其中用于条件判断的就是标签<if>。…...
gb28181-sip注册流程
gb28181-sip注册流程 当客户端第一次接入时,客户端将持续向Server端发送REGISTER消息,直到Server端回复"200 OK"后结束 它的注册流程如下图: 注册流程: 1 . SIP代理向SIP服务器发送Register请求: 第1行表…...
WEBRTC教程:局域网怎么调试,http://172.19.18.101:8080 ,无法访问摄像头和麦克风,请检查权限
在局域网中使用 WebRTC 时,无法访问摄像头和麦克风通常是因为浏览器的安全策略限制了 getUserMedia API 的使用。如果你在非 localhost 或非 HTTPS 环境下访问网页,浏览器会阻止访问摄像头和麦克风。 解决方案 在局域网中调试 WebRTC 时,你…...
Apache POI—读写Office格式文件
Apache POI 是一个开源的 Java 库,用于读写 Microsoft Office 格式的文件,主要包括 Excel、Word 和 PowerPoint 等文档。POI 对 Excel 文件的支持最为完善,通过 POI 可以方便地进行 Excel 文件的创建、编辑、读取等操作。 1. Apache POI 简介…...
3162. 优质数对的总数 I
3162. 优质数对的总数 I 题目链接:3162. 优质数对的总数 I 代码如下: class Solution { public:int numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k){int res 0;for (int i 0; i < nums1.size(); i){for (int…...
(五)Web前端开发进阶2——AJAX
目录 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.前后端分离开发 7.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。简单点说,就是使用XMLHttpRequest 对象与服务器通信。它可…...
数据结构(java)——数组的构建和插入
数组:地址连续,可以直接通过下标获取数组中的内容。(下标从0开始) 新建的数组都有默认值 //创建数组//Java是强类型 数组必须声明类型//以下是三种创建数组的方式 int[] arr {2,23,55,12,34,53};int[] brrnew int[5];int[] crrn…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手
华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...
