📌目录
- [⚖️ 系统动态分析:描述系统行为的关键技术](#⚖️ 系统动态分析:描述系统行为的关键技术)
-
- [🎯 一、系统动态分析概述](#🎯 一、系统动态分析概述)
- [📦 二、状态转换图](#📦 二、状态转换图)
- [🌐 三、状态转换表](#🌐 三、状态转换表)
- [📊 四、Petri网](#📊 四、Petri网)
- [📋 五、动态分析工具](#📋 五、动态分析工具)
- [💡 六、动态分析实例](#💡 六、动态分析实例)
- [📝 总结](#📝 总结)

⚖️ 系统动态分析:描述系统行为的关键技术
系统动态分析是需求分析的重要组成部分,它关注系统随时间变化的行为特征,描述系统在不同状态之间的转换过程。本文将详细介绍系统动态分析的概念、方法、工具及应用。

🎯 一、系统动态分析概述
(一)动态分析的定义
系统动态分析是分析系统随时间变化的行为特征,描述系统状态转换过程的分析方法。
动态分析概念:
#mermaid-svg-4OokYslZlwORm4aM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4OokYslZlwORm4aM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4OokYslZlwORm4aM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4OokYslZlwORm4aM .error-icon{fill:#552222;}#mermaid-svg-4OokYslZlwORm4aM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4OokYslZlwORm4aM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4OokYslZlwORm4aM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4OokYslZlwORm4aM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4OokYslZlwORm4aM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4OokYslZlwORm4aM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4OokYslZlwORm4aM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4OokYslZlwORm4aM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4OokYslZlwORm4aM .marker.cross{stroke:#333333;}#mermaid-svg-4OokYslZlwORm4aM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4OokYslZlwORm4aM p{margin:0;}#mermaid-svg-4OokYslZlwORm4aM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4OokYslZlwORm4aM .cluster-label text{fill:#333;}#mermaid-svg-4OokYslZlwORm4aM .cluster-label span{color:#333;}#mermaid-svg-4OokYslZlwORm4aM .cluster-label span p{background-color:transparent;}#mermaid-svg-4OokYslZlwORm4aM .label text,#mermaid-svg-4OokYslZlwORm4aM span{fill:#333;color:#333;}#mermaid-svg-4OokYslZlwORm4aM .node rect,#mermaid-svg-4OokYslZlwORm4aM .node circle,#mermaid-svg-4OokYslZlwORm4aM .node ellipse,#mermaid-svg-4OokYslZlwORm4aM .node polygon,#mermaid-svg-4OokYslZlwORm4aM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4OokYslZlwORm4aM .rough-node .label text,#mermaid-svg-4OokYslZlwORm4aM .node .label text,#mermaid-svg-4OokYslZlwORm4aM .image-shape .label,#mermaid-svg-4OokYslZlwORm4aM .icon-shape .label{text-anchor:middle;}#mermaid-svg-4OokYslZlwORm4aM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4OokYslZlwORm4aM .rough-node .label,#mermaid-svg-4OokYslZlwORm4aM .node .label,#mermaid-svg-4OokYslZlwORm4aM .image-shape .label,#mermaid-svg-4OokYslZlwORm4aM .icon-shape .label{text-align:center;}#mermaid-svg-4OokYslZlwORm4aM .node.clickable{cursor:pointer;}#mermaid-svg-4OokYslZlwORm4aM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4OokYslZlwORm4aM .arrowheadPath{fill:#333333;}#mermaid-svg-4OokYslZlwORm4aM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4OokYslZlwORm4aM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4OokYslZlwORm4aM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4OokYslZlwORm4aM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4OokYslZlwORm4aM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4OokYslZlwORm4aM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4OokYslZlwORm4aM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4OokYslZlwORm4aM .cluster text{fill:#333;}#mermaid-svg-4OokYslZlwORm4aM .cluster span{color:#333;}#mermaid-svg-4OokYslZlwORm4aM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4OokYslZlwORm4aM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4OokYslZlwORm4aM rect.text{fill:none;stroke-width:0;}#mermaid-svg-4OokYslZlwORm4aM .icon-shape,#mermaid-svg-4OokYslZlwORm4aM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4OokYslZlwORm4aM .icon-shape p,#mermaid-svg-4OokYslZlwORm4aM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4OokYslZlwORm4aM .icon-shape .label rect,#mermaid-svg-4OokYslZlwORm4aM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4OokYslZlwORm4aM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4OokYslZlwORm4aM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4OokYslZlwORm4aM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 系统动态分析
状态分析
事件分析
转换分析
行为建模
系统状态
触发事件
状态转换
行为模型
(二)动态分析与静态分析
分析对比:
| 分析类型 | 关注点 | 描述内容 | 工具 |
|---|---|---|---|
| 静态分析 | 数据结构 | 数据关系 | ER图 |
| 动态分析 | 行为特征 | 状态转换 | 状态图 |
| 功能分析 | 处理功能 | 数据流动 | DFD |
三者关系:
#mermaid-svg-CiIsc4dFqTpCXhqA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CiIsc4dFqTpCXhqA .error-icon{fill:#552222;}#mermaid-svg-CiIsc4dFqTpCXhqA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CiIsc4dFqTpCXhqA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CiIsc4dFqTpCXhqA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CiIsc4dFqTpCXhqA .marker.cross{stroke:#333333;}#mermaid-svg-CiIsc4dFqTpCXhqA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CiIsc4dFqTpCXhqA p{margin:0;}#mermaid-svg-CiIsc4dFqTpCXhqA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CiIsc4dFqTpCXhqA .cluster-label text{fill:#333;}#mermaid-svg-CiIsc4dFqTpCXhqA .cluster-label span{color:#333;}#mermaid-svg-CiIsc4dFqTpCXhqA .cluster-label span p{background-color:transparent;}#mermaid-svg-CiIsc4dFqTpCXhqA .label text,#mermaid-svg-CiIsc4dFqTpCXhqA span{fill:#333;color:#333;}#mermaid-svg-CiIsc4dFqTpCXhqA .node rect,#mermaid-svg-CiIsc4dFqTpCXhqA .node circle,#mermaid-svg-CiIsc4dFqTpCXhqA .node ellipse,#mermaid-svg-CiIsc4dFqTpCXhqA .node polygon,#mermaid-svg-CiIsc4dFqTpCXhqA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CiIsc4dFqTpCXhqA .rough-node .label text,#mermaid-svg-CiIsc4dFqTpCXhqA .node .label text,#mermaid-svg-CiIsc4dFqTpCXhqA .image-shape .label,#mermaid-svg-CiIsc4dFqTpCXhqA .icon-shape .label{text-anchor:middle;}#mermaid-svg-CiIsc4dFqTpCXhqA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CiIsc4dFqTpCXhqA .rough-node .label,#mermaid-svg-CiIsc4dFqTpCXhqA .node .label,#mermaid-svg-CiIsc4dFqTpCXhqA .image-shape .label,#mermaid-svg-CiIsc4dFqTpCXhqA .icon-shape .label{text-align:center;}#mermaid-svg-CiIsc4dFqTpCXhqA .node.clickable{cursor:pointer;}#mermaid-svg-CiIsc4dFqTpCXhqA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CiIsc4dFqTpCXhqA .arrowheadPath{fill:#333333;}#mermaid-svg-CiIsc4dFqTpCXhqA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CiIsc4dFqTpCXhqA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CiIsc4dFqTpCXhqA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CiIsc4dFqTpCXhqA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CiIsc4dFqTpCXhqA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CiIsc4dFqTpCXhqA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CiIsc4dFqTpCXhqA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CiIsc4dFqTpCXhqA .cluster text{fill:#333;}#mermaid-svg-CiIsc4dFqTpCXhqA .cluster span{color:#333;}#mermaid-svg-CiIsc4dFqTpCXhqA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CiIsc4dFqTpCXhqA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CiIsc4dFqTpCXhqA rect.text{fill:none;stroke-width:0;}#mermaid-svg-CiIsc4dFqTpCXhqA .icon-shape,#mermaid-svg-CiIsc4dFqTpCXhqA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CiIsc4dFqTpCXhqA .icon-shape p,#mermaid-svg-CiIsc4dFqTpCXhqA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CiIsc4dFqTpCXhqA .icon-shape .label rect,#mermaid-svg-CiIsc4dFqTpCXhqA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CiIsc4dFqTpCXhqA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CiIsc4dFqTpCXhqA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CiIsc4dFqTpCXhqA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需求分析
功能分析
数据建模
动态分析
数据流图
实体关系图
状态转换图
系统模型
(三)动态分析的意义
分析意义:
| 意义 | 说明 |
|---|---|
| 描述行为 | 描述系统行为特征 |
| 发现错误 | 发现状态转换错误 |
| 验证完整性 | 验证状态完整性 |
| 指导设计 | 指导后续设计 |
| 支持测试 | 支持测试用例设计 |
📦 二、状态转换图
(一)状态转换图概述
状态转换图(State Transition Diagram, STD) 是描述系统动态行为的主要工具。
STD组成:
#mermaid-svg-r1YJOY6hTwKU3h6s{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-r1YJOY6hTwKU3h6s .error-icon{fill:#552222;}#mermaid-svg-r1YJOY6hTwKU3h6s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-r1YJOY6hTwKU3h6s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-r1YJOY6hTwKU3h6s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-r1YJOY6hTwKU3h6s .marker.cross{stroke:#333333;}#mermaid-svg-r1YJOY6hTwKU3h6s svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-r1YJOY6hTwKU3h6s p{margin:0;}#mermaid-svg-r1YJOY6hTwKU3h6s .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-r1YJOY6hTwKU3h6s .cluster-label text{fill:#333;}#mermaid-svg-r1YJOY6hTwKU3h6s .cluster-label span{color:#333;}#mermaid-svg-r1YJOY6hTwKU3h6s .cluster-label span p{background-color:transparent;}#mermaid-svg-r1YJOY6hTwKU3h6s .label text,#mermaid-svg-r1YJOY6hTwKU3h6s span{fill:#333;color:#333;}#mermaid-svg-r1YJOY6hTwKU3h6s .node rect,#mermaid-svg-r1YJOY6hTwKU3h6s .node circle,#mermaid-svg-r1YJOY6hTwKU3h6s .node ellipse,#mermaid-svg-r1YJOY6hTwKU3h6s .node polygon,#mermaid-svg-r1YJOY6hTwKU3h6s .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-r1YJOY6hTwKU3h6s .rough-node .label text,#mermaid-svg-r1YJOY6hTwKU3h6s .node .label text,#mermaid-svg-r1YJOY6hTwKU3h6s .image-shape .label,#mermaid-svg-r1YJOY6hTwKU3h6s .icon-shape .label{text-anchor:middle;}#mermaid-svg-r1YJOY6hTwKU3h6s .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-r1YJOY6hTwKU3h6s .rough-node .label,#mermaid-svg-r1YJOY6hTwKU3h6s .node .label,#mermaid-svg-r1YJOY6hTwKU3h6s .image-shape .label,#mermaid-svg-r1YJOY6hTwKU3h6s .icon-shape .label{text-align:center;}#mermaid-svg-r1YJOY6hTwKU3h6s .node.clickable{cursor:pointer;}#mermaid-svg-r1YJOY6hTwKU3h6s .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-r1YJOY6hTwKU3h6s .arrowheadPath{fill:#333333;}#mermaid-svg-r1YJOY6hTwKU3h6s .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-r1YJOY6hTwKU3h6s .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-r1YJOY6hTwKU3h6s .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r1YJOY6hTwKU3h6s .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-r1YJOY6hTwKU3h6s .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r1YJOY6hTwKU3h6s .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-r1YJOY6hTwKU3h6s .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-r1YJOY6hTwKU3h6s .cluster text{fill:#333;}#mermaid-svg-r1YJOY6hTwKU3h6s .cluster span{color:#333;}#mermaid-svg-r1YJOY6hTwKU3h6s div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-r1YJOY6hTwKU3h6s .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-r1YJOY6hTwKU3h6s rect.text{fill:none;stroke-width:0;}#mermaid-svg-r1YJOY6hTwKU3h6s .icon-shape,#mermaid-svg-r1YJOY6hTwKU3h6s .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r1YJOY6hTwKU3h6s .icon-shape p,#mermaid-svg-r1YJOY6hTwKU3h6s .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-r1YJOY6hTwKU3h6s .icon-shape .label rect,#mermaid-svg-r1YJOY6hTwKU3h6s .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r1YJOY6hTwKU3h6s .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-r1YJOY6hTwKU3h6s .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-r1YJOY6hTwKU3h6s :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} STD组成
状态
事件
转换
动作
系统状态
圆形/圆角矩形
触发事件
转换条件
状态转换
箭头
转换动作
动作说明
STD符号:
| 符号 | 名称 | 说明 |
|---|---|---|
| ○/□ | 状态 | 系统的状态 |
| → | 转换 | 状态转换 |
| ● | 初态 | 初始状态 |
| ◎ | 终态 | 终止状态 |
(二)状态的定义
状态:
状态是系统在某一时刻的条件或情况,它描述了系统在一段时间内的特征。
状态特征:
| 特征 | 说明 |
|---|---|
| 持续性 | 状态会持续一段时间 |
| 互斥性 | 同一时刻只能处于一个状态 |
| 完整性 | 所有可能状态构成完整集合 |
| 可观测性 | 状态可以被观测 |
状态要素:
| 要素 | 说明 |
|---|---|
| 状态名 | 状态的名称 |
| 进入条件 | 进入该状态的条件 |
| 退出条件 | 退出该状态的条件 |
| 状态活动 | 在该状态下的活动 |
(三)事件的定义
事件:
事件是引起状态转换的外部或内部刺激。
事件类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| 外部事件 | 来自系统外部 | 用户输入 |
| 内部事件 | 来自系统内部 | 定时器触发 |
| 条件事件 | 条件满足时 | 库存不足 |
| 时间事件 | 时间到达时 | 超时 |
事件要素:
| 要素 | 说明 |
|---|---|
| 事件名 | 事件的名称 |
| 事件来源 | 事件的来源 |
| 事件数据 | 事件携带的数据 |
| 触发条件 | 触发条件 |
(四)转换的定义
转换:
转换是从一个状态到另一个状态的迁移。
转换要素:
| 要素 | 说明 |
|---|---|
| 源状态 | 转换的起始状态 |
| 目标状态 | 转换的目标状态 |
| 触发事件 | 引起转换的事件 |
| 守护条件 | 转换发生的条件 |
| 转换动作 | 转换时执行的动作 |
转换表示:
转换 = 事件 [条件] / 动作
转换示例:
| 源状态 | 事件 | 条件 | 动作 | 目标状态 |
|---|---|---|---|---|
| 待支付 | 支付 | 金额正确 | 更新订单 | 已支付 |
| 待支付 | 取消 | - | 释放库存 | 已取消 |
| 已支付 | 发货 | 库存充足 | 扣减库存 | 已发货 |
(五)状态转换图示例
订单状态转换图:
#mermaid-svg-IadGgHwHa9iAhqNi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IadGgHwHa9iAhqNi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IadGgHwHa9iAhqNi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IadGgHwHa9iAhqNi .error-icon{fill:#552222;}#mermaid-svg-IadGgHwHa9iAhqNi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IadGgHwHa9iAhqNi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IadGgHwHa9iAhqNi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IadGgHwHa9iAhqNi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IadGgHwHa9iAhqNi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IadGgHwHa9iAhqNi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IadGgHwHa9iAhqNi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IadGgHwHa9iAhqNi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IadGgHwHa9iAhqNi .marker.cross{stroke:#333333;}#mermaid-svg-IadGgHwHa9iAhqNi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IadGgHwHa9iAhqNi p{margin:0;}#mermaid-svg-IadGgHwHa9iAhqNi defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-IadGgHwHa9iAhqNi g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-IadGgHwHa9iAhqNi g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-IadGgHwHa9iAhqNi g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-IadGgHwHa9iAhqNi g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-IadGgHwHa9iAhqNi g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-IadGgHwHa9iAhqNi .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-IadGgHwHa9iAhqNi .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-IadGgHwHa9iAhqNi .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-IadGgHwHa9iAhqNi .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-IadGgHwHa9iAhqNi .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-IadGgHwHa9iAhqNi .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-IadGgHwHa9iAhqNi .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-IadGgHwHa9iAhqNi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IadGgHwHa9iAhqNi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IadGgHwHa9iAhqNi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IadGgHwHa9iAhqNi .edgeLabel .label text{fill:#333;}#mermaid-svg-IadGgHwHa9iAhqNi .label div .edgeLabel{color:#333;}#mermaid-svg-IadGgHwHa9iAhqNi .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-IadGgHwHa9iAhqNi .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-IadGgHwHa9iAhqNi .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-IadGgHwHa9iAhqNi .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-IadGgHwHa9iAhqNi .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-IadGgHwHa9iAhqNi .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IadGgHwHa9iAhqNi .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IadGgHwHa9iAhqNi #statediagram-barbEnd{fill:#333333;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IadGgHwHa9iAhqNi .cluster-label,#mermaid-svg-IadGgHwHa9iAhqNi .nodeLabel{color:#131300;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-IadGgHwHa9iAhqNi .note-edge{stroke-dasharray:5;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-note text{fill:black;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram-note .nodeLabel{color:black;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagram .edgeLabel{color:red;}#mermaid-svg-IadGgHwHa9iAhqNi #dependencyStart,#mermaid-svg-IadGgHwHa9iAhqNi #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-IadGgHwHa9iAhqNi .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IadGgHwHa9iAhqNi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 支付成功
超时/取消
确认
发货
确认收货
待支付
已支付
已取消
待发货
已发货
已完成
电梯状态转换图:
#mermaid-svg-y4KWTIWJdf918z7M{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-y4KWTIWJdf918z7M .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-y4KWTIWJdf918z7M .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-y4KWTIWJdf918z7M .error-icon{fill:#552222;}#mermaid-svg-y4KWTIWJdf918z7M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-y4KWTIWJdf918z7M .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-y4KWTIWJdf918z7M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-y4KWTIWJdf918z7M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-y4KWTIWJdf918z7M .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-y4KWTIWJdf918z7M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-y4KWTIWJdf918z7M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-y4KWTIWJdf918z7M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-y4KWTIWJdf918z7M .marker.cross{stroke:#333333;}#mermaid-svg-y4KWTIWJdf918z7M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-y4KWTIWJdf918z7M p{margin:0;}#mermaid-svg-y4KWTIWJdf918z7M defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-y4KWTIWJdf918z7M g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-y4KWTIWJdf918z7M g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-y4KWTIWJdf918z7M g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-y4KWTIWJdf918z7M g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-y4KWTIWJdf918z7M g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-y4KWTIWJdf918z7M .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-y4KWTIWJdf918z7M .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-y4KWTIWJdf918z7M .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-y4KWTIWJdf918z7M .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-y4KWTIWJdf918z7M .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-y4KWTIWJdf918z7M .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-y4KWTIWJdf918z7M .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-y4KWTIWJdf918z7M .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-y4KWTIWJdf918z7M .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-y4KWTIWJdf918z7M .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-y4KWTIWJdf918z7M .edgeLabel .label text{fill:#333;}#mermaid-svg-y4KWTIWJdf918z7M .label div .edgeLabel{color:#333;}#mermaid-svg-y4KWTIWJdf918z7M .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-y4KWTIWJdf918z7M .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-y4KWTIWJdf918z7M .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-y4KWTIWJdf918z7M .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-y4KWTIWJdf918z7M .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-y4KWTIWJdf918z7M .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-y4KWTIWJdf918z7M .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-y4KWTIWJdf918z7M #statediagram-barbEnd{fill:#333333;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-y4KWTIWJdf918z7M .cluster-label,#mermaid-svg-y4KWTIWJdf918z7M .nodeLabel{color:#131300;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-y4KWTIWJdf918z7M .note-edge{stroke-dasharray:5;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-note text{fill:black;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram-note .nodeLabel{color:black;}#mermaid-svg-y4KWTIWJdf918z7M .statediagram .edgeLabel{color:red;}#mermaid-svg-y4KWTIWJdf918z7M #dependencyStart,#mermaid-svg-y4KWTIWJdf918z7M #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-y4KWTIWJdf918z7M .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-y4KWTIWJdf918z7M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 上升请求
下降请求
到达目标层
到达目标层
经过楼层
经过楼层
停止
上升
下降
🌐 三、状态转换表
(一)状态转换表概述
状态转换表是状态转换图的表格表示形式。
表格结构:
| 当前状态\事件 | 事件1 | 事件2 | 事件3 |
|---|---|---|---|
| 状态1 | 状态2/动作1 | 状态3/动作2 | - |
| 状态2 | - | 状态3/动作3 | 状态1/动作4 |
| 状态3 | 状态1/动作5 | - | - |
(二)状态转换表示例
订单状态转换表:
| 当前状态\事件 | 支付 | 取消 | 发货 | 收货 |
|---|---|---|---|---|
| 待支付 | 已支付/更新订单 | 已取消/释放库存 | - | - |
| 已支付 | - | - | 已发货/扣减库存 | - |
| 已发货 | - | - | - | 已完成/更新状态 |
| 已完成 | - | - | - | - |
| 已取消 | - | - | - | - |
(三)状态转换表与状态图的对比
对比分析:
| 方面 | 状态转换图 | 状态转换表 |
|---|---|---|
| 表达方式 | 图形化 | 表格化 |
| 直观性 | 直观 | 需要分析 |
| 完整性 | 可能遗漏 | 容易检查完整性 |
| 适用场景 | 简单系统 | 复杂系统 |
| 补充使用 | 互相补充 | 互相补充 |
📊 四、Petri网
(一)Petri网概述
Petri网是一种描述异步并发系统的数学模型。
Petri网组成:
#mermaid-svg-y3DkdmbX9rcFD0M8{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-y3DkdmbX9rcFD0M8 .error-icon{fill:#552222;}#mermaid-svg-y3DkdmbX9rcFD0M8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-y3DkdmbX9rcFD0M8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .marker.cross{stroke:#333333;}#mermaid-svg-y3DkdmbX9rcFD0M8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-y3DkdmbX9rcFD0M8 p{margin:0;}#mermaid-svg-y3DkdmbX9rcFD0M8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .cluster-label text{fill:#333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .cluster-label span{color:#333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .cluster-label span p{background-color:transparent;}#mermaid-svg-y3DkdmbX9rcFD0M8 .label text,#mermaid-svg-y3DkdmbX9rcFD0M8 span{fill:#333;color:#333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .node rect,#mermaid-svg-y3DkdmbX9rcFD0M8 .node circle,#mermaid-svg-y3DkdmbX9rcFD0M8 .node ellipse,#mermaid-svg-y3DkdmbX9rcFD0M8 .node polygon,#mermaid-svg-y3DkdmbX9rcFD0M8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-y3DkdmbX9rcFD0M8 .rough-node .label text,#mermaid-svg-y3DkdmbX9rcFD0M8 .node .label text,#mermaid-svg-y3DkdmbX9rcFD0M8 .image-shape .label,#mermaid-svg-y3DkdmbX9rcFD0M8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-y3DkdmbX9rcFD0M8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-y3DkdmbX9rcFD0M8 .rough-node .label,#mermaid-svg-y3DkdmbX9rcFD0M8 .node .label,#mermaid-svg-y3DkdmbX9rcFD0M8 .image-shape .label,#mermaid-svg-y3DkdmbX9rcFD0M8 .icon-shape .label{text-align:center;}#mermaid-svg-y3DkdmbX9rcFD0M8 .node.clickable{cursor:pointer;}#mermaid-svg-y3DkdmbX9rcFD0M8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .arrowheadPath{fill:#333333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-y3DkdmbX9rcFD0M8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-y3DkdmbX9rcFD0M8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-y3DkdmbX9rcFD0M8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-y3DkdmbX9rcFD0M8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-y3DkdmbX9rcFD0M8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-y3DkdmbX9rcFD0M8 .cluster text{fill:#333;}#mermaid-svg-y3DkdmbX9rcFD0M8 .cluster span{color:#333;}#mermaid-svg-y3DkdmbX9rcFD0M8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-y3DkdmbX9rcFD0M8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-y3DkdmbX9rcFD0M8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-y3DkdmbX9rcFD0M8 .icon-shape,#mermaid-svg-y3DkdmbX9rcFD0M8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-y3DkdmbX9rcFD0M8 .icon-shape p,#mermaid-svg-y3DkdmbX9rcFD0M8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-y3DkdmbX9rcFD0M8 .icon-shape .label rect,#mermaid-svg-y3DkdmbX9rcFD0M8 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-y3DkdmbX9rcFD0M8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-y3DkdmbX9rcFD0M8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-y3DkdmbX9rcFD0M8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Petri网
库所
变迁
有向弧
令牌
位置/条件
圆圈表示
事件/转换
矩形表示
连接关系
箭头表示
资源/状态
黑点表示
Petri网符号:
| 符号 | 名称 | 说明 |
|---|---|---|
| ○ | 库所 | 位置或条件 |
| □ | 变迁 | 事件或转换 |
| → | 有向弧 | 连接关系 |
| • | 令牌 | 资源或状态 |
(二)Petri网的基本概念
库所(Place):
库所表示系统的位置、条件或状态。
变迁(Transition):
变迁表示系统的事件或转换。
令牌(Token):
令牌表示资源或状态,在库所中流动。
触发规则:
| 规则 | 说明 |
|---|---|
| 使能 | 输入库所都有令牌 |
| 触发 | 消耗输入令牌,产生输出令牌 |
(三)Petri网示例
生产者-消费者Petri网:
#mermaid-svg-BGpDLrxpFaX3ARqt{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BGpDLrxpFaX3ARqt .error-icon{fill:#552222;}#mermaid-svg-BGpDLrxpFaX3ARqt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BGpDLrxpFaX3ARqt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BGpDLrxpFaX3ARqt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BGpDLrxpFaX3ARqt .marker.cross{stroke:#333333;}#mermaid-svg-BGpDLrxpFaX3ARqt svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BGpDLrxpFaX3ARqt p{margin:0;}#mermaid-svg-BGpDLrxpFaX3ARqt .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BGpDLrxpFaX3ARqt .cluster-label text{fill:#333;}#mermaid-svg-BGpDLrxpFaX3ARqt .cluster-label span{color:#333;}#mermaid-svg-BGpDLrxpFaX3ARqt .cluster-label span p{background-color:transparent;}#mermaid-svg-BGpDLrxpFaX3ARqt .label text,#mermaid-svg-BGpDLrxpFaX3ARqt span{fill:#333;color:#333;}#mermaid-svg-BGpDLrxpFaX3ARqt .node rect,#mermaid-svg-BGpDLrxpFaX3ARqt .node circle,#mermaid-svg-BGpDLrxpFaX3ARqt .node ellipse,#mermaid-svg-BGpDLrxpFaX3ARqt .node polygon,#mermaid-svg-BGpDLrxpFaX3ARqt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BGpDLrxpFaX3ARqt .rough-node .label text,#mermaid-svg-BGpDLrxpFaX3ARqt .node .label text,#mermaid-svg-BGpDLrxpFaX3ARqt .image-shape .label,#mermaid-svg-BGpDLrxpFaX3ARqt .icon-shape .label{text-anchor:middle;}#mermaid-svg-BGpDLrxpFaX3ARqt .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BGpDLrxpFaX3ARqt .rough-node .label,#mermaid-svg-BGpDLrxpFaX3ARqt .node .label,#mermaid-svg-BGpDLrxpFaX3ARqt .image-shape .label,#mermaid-svg-BGpDLrxpFaX3ARqt .icon-shape .label{text-align:center;}#mermaid-svg-BGpDLrxpFaX3ARqt .node.clickable{cursor:pointer;}#mermaid-svg-BGpDLrxpFaX3ARqt .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BGpDLrxpFaX3ARqt .arrowheadPath{fill:#333333;}#mermaid-svg-BGpDLrxpFaX3ARqt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BGpDLrxpFaX3ARqt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BGpDLrxpFaX3ARqt .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BGpDLrxpFaX3ARqt .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BGpDLrxpFaX3ARqt .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BGpDLrxpFaX3ARqt .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BGpDLrxpFaX3ARqt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BGpDLrxpFaX3ARqt .cluster text{fill:#333;}#mermaid-svg-BGpDLrxpFaX3ARqt .cluster span{color:#333;}#mermaid-svg-BGpDLrxpFaX3ARqt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BGpDLrxpFaX3ARqt .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BGpDLrxpFaX3ARqt rect.text{fill:none;stroke-width:0;}#mermaid-svg-BGpDLrxpFaX3ARqt .icon-shape,#mermaid-svg-BGpDLrxpFaX3ARqt .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BGpDLrxpFaX3ARqt .icon-shape p,#mermaid-svg-BGpDLrxpFaX3ARqt .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BGpDLrxpFaX3ARqt .icon-shape .label rect,#mermaid-svg-BGpDLrxpFaX3ARqt .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BGpDLrxpFaX3ARqt .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BGpDLrxpFaX3ARqt .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BGpDLrxpFaX3ARqt :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 弧
弧
弧
弧
弧
弧
弧
弧
库所:空闲
变迁:生产
库所:产品
变迁:消费
库所:消费者
库所:消费完成
变迁:返回
简单Petri网:
库所:P1(空闲), P2(忙)
变迁:T1(开始), T2(结束)
弧:P1→T1, T1→P2, P2→T2, T2→P1
令牌:初始在P1
(四)Petri网的特点
Petri网特点:
| 特点 | 说明 |
|---|---|
| 并发描述 | 描述并发行为 |
| 异步特性 | 描述异步系统 |
| 冲突检测 | 检测状态冲突 |
| 形式化 | 有严格数学基础 |
| 可视化 | 图形化表示 |
Petri网应用:
| 应用领域 | 说明 |
|---|---|
| 并发系统 | 并发程序分析 |
| 工作流 | 工作流建模 |
| 通信协议 | 协议验证 |
| 制造系统 | 生产流程 |
📋 五、动态分析工具
(一)建模工具
建模工具:
| 工具 | 功能 | 特点 |
|---|---|---|
| Visio | 绘图工具 | 功能全面 |
| Stateflow | 状态机 | MATLAB集成 |
| Rational Rose | UML工具 | 功能强大 |
| Enterprise Architect | UML工具 | 专业建模 |
| draw.io | 在线绘图 | 免费开源 |
(二)UML状态图
UML状态图:
UML状态图是标准化的状态转换图。
UML状态图元素:
| 元素 | 说明 | 表示 |
|---|---|---|
| 初态 | 初始状态 | ● |
| 状态 | 系统状态 | 圆角矩形 |
| 转换 | 状态转换 | 箭头 |
| 终态 | 终止状态 | ◎ |
| 历史状态 | 历史状态 | ⓗ |
UML状态图示例:
#mermaid-svg-VbuySCq8MRjmpwDG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VbuySCq8MRjmpwDG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VbuySCq8MRjmpwDG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VbuySCq8MRjmpwDG .error-icon{fill:#552222;}#mermaid-svg-VbuySCq8MRjmpwDG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VbuySCq8MRjmpwDG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VbuySCq8MRjmpwDG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VbuySCq8MRjmpwDG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VbuySCq8MRjmpwDG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VbuySCq8MRjmpwDG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VbuySCq8MRjmpwDG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VbuySCq8MRjmpwDG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VbuySCq8MRjmpwDG .marker.cross{stroke:#333333;}#mermaid-svg-VbuySCq8MRjmpwDG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VbuySCq8MRjmpwDG p{margin:0;}#mermaid-svg-VbuySCq8MRjmpwDG defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-VbuySCq8MRjmpwDG g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-VbuySCq8MRjmpwDG g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-VbuySCq8MRjmpwDG g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-VbuySCq8MRjmpwDG g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-VbuySCq8MRjmpwDG g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-VbuySCq8MRjmpwDG .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-VbuySCq8MRjmpwDG .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-VbuySCq8MRjmpwDG .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-VbuySCq8MRjmpwDG .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VbuySCq8MRjmpwDG .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-VbuySCq8MRjmpwDG .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-VbuySCq8MRjmpwDG .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-VbuySCq8MRjmpwDG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VbuySCq8MRjmpwDG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VbuySCq8MRjmpwDG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VbuySCq8MRjmpwDG .edgeLabel .label text{fill:#333;}#mermaid-svg-VbuySCq8MRjmpwDG .label div .edgeLabel{color:#333;}#mermaid-svg-VbuySCq8MRjmpwDG .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-VbuySCq8MRjmpwDG .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-VbuySCq8MRjmpwDG .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-VbuySCq8MRjmpwDG .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-VbuySCq8MRjmpwDG .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-VbuySCq8MRjmpwDG .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VbuySCq8MRjmpwDG .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VbuySCq8MRjmpwDG #statediagram-barbEnd{fill:#333333;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VbuySCq8MRjmpwDG .cluster-label,#mermaid-svg-VbuySCq8MRjmpwDG .nodeLabel{color:#131300;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-VbuySCq8MRjmpwDG .note-edge{stroke-dasharray:5;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-note text{fill:black;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram-note .nodeLabel{color:black;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagram .edgeLabel{color:red;}#mermaid-svg-VbuySCq8MRjmpwDG #dependencyStart,#mermaid-svg-VbuySCq8MRjmpwDG #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-VbuySCq8MRjmpwDG .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VbuySCq8MRjmpwDG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开始工作
暂停
继续
完成
空闲
工作中
暂停
完成
(三)动态分析技术
分析技术:
| 技术 | 说明 | 适用场景 |
|---|---|---|
| 状态枚举 | 枚举所有状态 | 简单系统 |
| 状态覆盖 | 覆盖所有状态 | 测试设计 |
| 转换覆盖 | 覆盖所有转换 | 测试设计 |
| 路径覆盖 | 覆盖所有路径 | 完整测试 |
💡 六、动态分析实例
(一)实例背景
项目:自动售货机系统
系统描述:
- 用户投币选择商品
- 系统验证金额
- 出货找零
(二)状态识别
系统状态:
| 状态 | 说明 |
|---|---|
| 空闲 | 等待用户操作 |
| 投币中 | 用户正在投币 |
| 选择中 | 用户选择商品 |
| 出货中 | 正在出货 |
| 找零中 | 正在找零 |
| 故障 | 系统故障 |
(三)事件识别
系统事件:
| 事件 | 说明 |
|---|---|
| 投币 | 用户投入硬币 |
| 选择商品 | 用户选择商品 |
| 取消 | 用户取消操作 |
| 出货完成 | 出货完成 |
| 找零完成 | 找零完成 |
| 故障发生 | 系统故障 |
(四)状态转换图
自动售货机状态转换图:
#mermaid-svg-AuSyEKyCaHiEGrMh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AuSyEKyCaHiEGrMh .error-icon{fill:#552222;}#mermaid-svg-AuSyEKyCaHiEGrMh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AuSyEKyCaHiEGrMh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AuSyEKyCaHiEGrMh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AuSyEKyCaHiEGrMh .marker.cross{stroke:#333333;}#mermaid-svg-AuSyEKyCaHiEGrMh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AuSyEKyCaHiEGrMh p{margin:0;}#mermaid-svg-AuSyEKyCaHiEGrMh defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-AuSyEKyCaHiEGrMh g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-AuSyEKyCaHiEGrMh g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-AuSyEKyCaHiEGrMh g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-AuSyEKyCaHiEGrMh g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-AuSyEKyCaHiEGrMh g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-AuSyEKyCaHiEGrMh .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-AuSyEKyCaHiEGrMh .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-AuSyEKyCaHiEGrMh .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-AuSyEKyCaHiEGrMh .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-AuSyEKyCaHiEGrMh .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-AuSyEKyCaHiEGrMh .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-AuSyEKyCaHiEGrMh .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-AuSyEKyCaHiEGrMh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AuSyEKyCaHiEGrMh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AuSyEKyCaHiEGrMh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AuSyEKyCaHiEGrMh .edgeLabel .label text{fill:#333;}#mermaid-svg-AuSyEKyCaHiEGrMh .label div .edgeLabel{color:#333;}#mermaid-svg-AuSyEKyCaHiEGrMh .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-AuSyEKyCaHiEGrMh .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-AuSyEKyCaHiEGrMh .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-AuSyEKyCaHiEGrMh .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-AuSyEKyCaHiEGrMh .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-AuSyEKyCaHiEGrMh .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AuSyEKyCaHiEGrMh .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AuSyEKyCaHiEGrMh #statediagram-barbEnd{fill:#333333;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AuSyEKyCaHiEGrMh .cluster-label,#mermaid-svg-AuSyEKyCaHiEGrMh .nodeLabel{color:#131300;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-AuSyEKyCaHiEGrMh .note-edge{stroke-dasharray:5;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-note text{fill:black;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram-note .nodeLabel{color:black;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagram .edgeLabel{color:red;}#mermaid-svg-AuSyEKyCaHiEGrMh #dependencyStart,#mermaid-svg-AuSyEKyCaHiEGrMh #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-AuSyEKyCaHiEGrMh .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AuSyEKyCaHiEGrMh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 投币
继续投币
金额足够
取消
选择商品
金额不足
需要找零
无需找零
找零完成
故障发生
故障发生
故障发生
故障恢复
空闲
投币中
选择中
出货中
找零中
故障
(五)状态转换表
状态转换表:
| 当前状态\事件 | 投币 | 选择 | 取消 | 出货完成 | 找零完成 | 故障 |
|---|---|---|---|---|---|---|
| 空闲 | 投币中 | - | - | - | - | 故障 |
| 投币中 | 投币中 | 选择中 | 空闲 | - | - | 故障 |
| 选择中 | - | 出货中 | 投币中 | - | - | 故障 |
| 出货中 | - | - | - | 找零中/空闲 | - | - |
| 找零中 | - | - | - | - | 空闲 | - |
| 故障 | - | - | - | - | - | 空闲 |
(六)动态分析验证
验证内容:
| 验证项 | 验证内容 | 结果 |
|---|---|---|
| 状态完整性 | 所有状态是否定义 | 完整 |
| 转换完整性 | 所有转换是否定义 | 完整 |
| 可达性 | 所有状态是否可达 | 可达 |
| 无死锁 | 是否存在死锁 | 无死锁 |
📝 总结
系统动态分析是描述系统行为特征的重要方法。
🎯 基本概念:动态分析关注系统随时间变化的行为;描述系统状态、事件和转换;与静态分析、功能分析共同构成完整的需求模型。
📦 状态转换图:STD是描述动态行为的主要工具;由状态、事件、转换组成;直观描述系统状态变化过程。
🌐 状态转换表:状态转换表的表格形式;便于检查完整性;与状态图互相补充。
📊 Petri网:描述异步并发系统的数学模型;由库所、变迁、弧、令牌组成;适合描述并发行为。
💡 应用要点:识别系统状态;识别触发事件;定义状态转换;验证状态完整性;使用工具辅助建模。
核心启示:系统动态分析是需求分析的重要组成部分,它关注系统的行为特征,描述系统在不同状态之间的转换过程。在实际工作中,我们需要注意:第一,全面识别系统状态,不遗漏任何状态;第二,准确定义触发事件,明确事件来源;第三,完整定义状态转换,包括条件、动作等;第四,验证状态的完整性和可达性,确保没有死锁;第五,使用合适的工具辅助建模,提高效率。状态转换图、状态转换表、Petri网等工具各有特点,可以根据系统特点选择合适的工具。动态分析与静态分析、功能分析相结合,才能建立完整、准确的系统需求模型。