遵义做网站推广百度提问在线回答问题
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番号。