在我的 UML 模型中,我有一个系统及其相互通信的子组件。例如,我有一台计算机和一个遥控机器人,它们通过蓝牙进行通信。目前图中的流程类似于:
“计算机”触发“遥控车”的“setVelocity()”函数。
在这一点上,我想通过说以下的话来完善沟通:
- 计算机发送“移动”消息
- 速度场设置为 100,方向场设置为 0
- 遥控车通过发送 ACK 消息进行确认
- 带有消息 ID“Movement”和序列号 X。
我怎么做?
EDIT:澄清
通常,这就是我的图表在没有协议详细信息的情况下的样子:
但是当我尝试添加消息时,至少存在两个问题:
- 看起来计算机首先触发了 setVelocity() 函数,然后依次触发了 sendBluetoothMessage() ,这不是顺序的。 setVelocity() 的以下内容实际上是其中发生的事情。
- sendBluetoothMessage()实际上是Computer的一个函数。但这里它属于遥控车。 (或者我错了?)对于 ACK 来说也是同样的事情。
感谢您的回复。你是金子!
一般通信协议
有两种主要方式来表示两个设备之间发送移动消息:
-
A movement()
在目标设备上进行操作,带有速度和方向参数。您通常会在序列图中显示交换,并使用从发送者到接收者的调用箭头。返回消息可以只标记为 ACK。
-
A «signal» Movement
: Signals https://www.uml-diagrams.org/common-behaviors.html#signal对应事件消息。在类图中,它们像一个类一样表示,但带有«signal»
关键词:velocity
and direction
将是该信号的属性。ACK
将是另一个信号。能够接收信号的类显示为接待 https://www.uml-diagrams.org/common-behaviors.html#reception(看起来像一个操作,但又带有“signal”关键字)。
在这两种情况下,您都将使用几乎相同的序列图来显示通信协议的交互。但信号用于异步通信,并且更好地反映了通信的本质。它的语义更适合您的需求。
如果你更喜欢通讯图 https://www.uml-diagrams.org/communication-diagrams.html在交互图上,信号方法会更清晰,因为通信图不显示返回消息。
为什么信号是您所需要的(您的编辑)
有了图表,您编辑的问题就更加清晰了。我对信号使用的立场没有改变:信号将对应于计算机和汽车之间交换的信息。因此,在类图中,您可以记录«signal»Movement
因为有属性id
, velocity
and direction
:
在您的序列图中,您可以发送 和 箭头Movement (X,100,0)
。 Signal 允许显示协议交换的高级视图,而不会迷失实际的实现细节:
然后可以在单独的图表中显示实现细节。当然,计算机一侧(一张图,最终动作是某种发送)和汽车一侧(另一张图:如何接收和发送消息,并解码其内容)涉及多个类。我不提供示例,因为它非常类似于您当前的图表,但发送功能可能由通信控制器实现。
如果您尝试将协议及其实现放在同一个图中(如第二个图中所示),由于缺乏关注点分离,它会变得混乱:这里您说计算机正在调用汽车上的发送函数,这不是一切你想要的。读者很难看出协议真正需要什么,以及实现细节是什么。比如,根据你的图我还是不知道,如果setVelocity
应该直接向汽车发送一些东西,或者如果它是发送速度运动消息的准备步骤。
最后但并非最不重要的一点是,请记住序列图仅代表一个特定的场景。如果您想在 UML 中正式定义一个协议,您还需要创建一个协议状态机来告诉消息的有效连续性。当您使用信号时,您可以直接使用它们的名称作为状态转换触发器/事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)