用Petri网可视化UML无法表达的“动态”
Back to Top
为了覆盖更广泛的受众,这篇文章已从日语翻译而来。
您可以在这里找到原始版本。
# 仅用UML不够?了解Petri网后可更深入理解系统
#本文的目的
#本来打算把解读 UML Format2.5.1 的结果写成文章,但在解读过程中发现需要 Petri网 的思路,于是学习了 Petri网。既然如此,就把学习成果分享出来,所以写了这篇文章。
UML 是一款强大的建模工具,但在表达系统复杂的行为或状态变迁时,有时会存在局限。因此,本文将介绍一种补充 UML、更深入理解系统的建模方法——“Petri网”。
通过阅读本文,可以获得以下效果:
- 减少因模型编写方式而在评审中被指出的问题,提高成果物质量
- 在进行需求分析等创建模型时,能够正确理解自己所创建模型的含义
- 通过理解模型的含义,更容易向客户解释模型
由于 UML Format 中多次出现 Petri网 的概念,这次将聚焦 Petri网,阐述其与 UML 的区别以及 Petri网 的应用方法。
什么是 Petri网?与 UML 的区别
#Petri网 是 Karl Adam Petri 于 1962 年提出的一种用于数学描述离散分布式系统的方法。(离散分布式系统:如智能家居系统,将客厅照明调节、空调调节等并行且分散的操作串联起来,实现一个完整系统)
UML 和 Petri网 都是用于对系统行为进行建模的工具,但各有擅长的方面。
- UML: 擅长表达系统整体结构及对象之间关系。
- Petri网: 擅长清晰地表达系统内的状态变化、并行处理及时间流动。
例如,若用 UML 的活动图对系统行为进行建模,可以理解系统会执行哪些处理,但难以表达事件(动作)之间的状态变化,也不易在时间轴上表现行为,这是其弱点。
当客户提出“系统内部的各步骤以何种顺序发生”的更详细说明需求时,可借助 Petri网,更准确、清晰地进行说明和表达。
Petri网基础
#构建 Petri网 所需的要素如下。Petri网 由库所(状态)、变迁(转移/事件)、连接它们的弧(输入弧、输出弧)以及标记组成。
- 库所(Place): 表示状态的圆形节点
- 变迁(Transition): 表示状态变化的矩形节点
- 输入弧: 从前状态连接至变迁,用于表示变迁触发所需的库所
- 输出弧: 从变迁连接至后状态,用于表示变迁触发后用于迁移到下一状态的库所
- 标记(Token): 放置在库所内部的黑点,表示系统的局部状态,即资源当前所在的库所
这是构成简单 Petri网 的基本要素。简单 Petri网 适用于并行处理建模,非常适合对多个彼此独立并发执行的进程等情况进行建模。需要注意的是,简单 Petri网 只能对相对简单的问题建模。然而,通过使用扩展 Petri网(如 Colored Petri Nets、Timed Petri Nets 等),也可以对复杂系统进行建模。
下面展示一个简单 Petri网 的建模示例。
基于上述,以下以制作老式甜甜圈(Old-Fashioned)为例,用 Petri网 进行表示。首先,为制作 Old-Fashioned,需要甜甜圈以及用于涂层的巧克力。因此,作为原料,存在尚未油炸的甜甜圈和未加工成巧克力酱的巧克力,这些都作为库所存在。当然,在此状态中,标记同时位于代表甜甜圈和巧克力的最左侧库所。
在这里,当对甜甜圈进行油炸时,变迁“油炸甜甜圈”触发,标记从前状态移动到后状态。
进一步,将巧克力加工为涂层用巧克力酱时,变迁“将巧克力加工成巧克力酱”触发,标记从前状态移动到后状态。
最后作为收尾,将巧克力酱涂层于甜甜圈时,变迁“将巧克力涂层于甜甜圈”触发,两个标记从各自的前状态移动到后状态。
Petri网规则
#在 Petri网 中,标记有一些特殊的约束,这里进行说明。
状态表示
#- 库所中标记的数量表示系统的局部状态
- 一个标记对应一个资源。若任意库所中有 k 个标记,就表示该库所中存在 k 个资源
- 若同一库所中有多个标记,则这些标记不可区分
也就是说,标记只是表示在该库所的某个时间点上有多少资源,而不考虑这些标记(资源)的具体种类。
状态迁移规则
#- 若各输入库所中存在的标记数量不少于对应弧的权重,则该变迁可触发。
※弧的权重通过在箭头上标注数字来表示(例如:若权重为3,则需要3个标记) - 当变迁触发时,会从各输入库所中移除与输入弧权重(箭头数量)相同数量的标记,并在输出库所(后状态)添加与输出弧权重(箭头数量)相同数量的标记
也就是说,在整个 Petri网 中,标记数保持不变,不会有多于箭头数量的标记移动。
最后,以下示例展示了变迁触发前后的标记移动示意图。
结束语
#我也是借着解读 UML Format 的机会了解到 Petri网,认为它比 UML 更原始,却具有直观易懂的表达方式。
UML 有助于理解系统结构,而结合 Petri网 则能够更深入理解系统的动态方面。
- 虽然熟悉 UML,却无法很好地表达系统的动态…
- 想向客户具体说明系统的运行过程…
对于有上述困扰的读者,不妨考虑使用 Petri网 进行建模与表达。
理解 UML 与 Petri网 各自的优势,适当区分使用,应该能实现更高效的系统设计与开发。