我的系统有两台状态机,一台主机,一台从机。而且主从之间的状态也不是一一对应的。可能的相互作用如下。
如果master转换到某个master状态,它会通知slave转换到某个slave状态
slave可以请求master进入某个master状态;如果master成功,master会通知slave进入某个slave状态。
从站可能会向主站请求某些数据
描述这些交互的正确 UML 图是什么?状态图仅限于状态转换,不能描述来自从站的请求(状态转换或数据);交互图仅限于类/对象,不能应用于状态。
我的系统有两台状态机,一台主机,一台从机。而且主从之间的状态也不是一一对应的。可能的相互作用如下。
如果master转换到某个master状态,它会通知slave转换到某个slave状态
slave可以请求master进入某个master状态;如果master成功,master会通知slave进入某个slave状态。
从站可能会向主站请求某些数据
描述这些交互的正确 UML 图是什么?状态图仅限于状态转换,不能描述来自从站的请求(状态转换或数据);交互图仅限于类/对象,不能应用于状态。
您可以使用两个 UML 状态机图来描述这些交互,一个用于主设备,一个用于从设备。例如,要指定从状态 Idle 到状态 Busy 的转换发生在接收到来自 master 的信号时,您可以在从机的状态机图中Req
使用转换标签绘制从 Idle 到 Busy 的转换。Req
要指定主机Req
在进入状态 X 时发送信号,请entry/Req
在主机状态机图中 X 的状态符号内写入。
或者,您可以绘制用于发送和接收信号的元素(参见 UML 2.5.1 规范的 14.2.4.8.2 到 14.2.4.8.5 节):
例如,在接收到带有参数 id 的信号 Req 时从 Idle 转为 Busy:
您还描述了从站向主站请求某些数据的情况。为此,您需要主设备提供和从设备所需的接口的第三张图(或文本规范),例如:
在从机的状态机图中,可以调用接口中定义的操作。例如,调用slave进入状态Busy的read
操作master
并将其存储在局部变量x
中,写entry/x:=master.read()
在状态符号X里面。
关于UML状态机图的介绍,请参考wikipedia
你描述的是主从之间的交互。
没有单一的解决方案,并且很难同时拥有所有可能的状态和事务的逻辑(实际上我认为根本不可能)。
这里要考虑的主要图表是:
特别是最后一个是一个有趣的选项,因为它结合了活动和序列图的可能性。通常这是一种矫枉过正的做法,但对于您的具体情况可能是最好的主意。
除此之外,您还可以使用状态机图(两个,一个用于主设备,一个用于从设备),但它们将无法显示两个实体之间的交互。不过,解释什么是可用状态可能很有用。
如果不清楚,请随时评论此答案以获取更多详细信息。然后,我将尝试构建每个图表的示例(您已经在 www.admiralalit.nl 的答案中获得了活动图示例)。