首页 > 解决方案 > 时序图中的同步消息是否必须要有回复消息

问题描述

我对序列图只有 3 个疑问。

  1. 是否必须为每条同步消息提供回复消息,我还想知道回复消息是方法还是消息?
  2. 在下图中,我可以使用从右到左的同步消息而不是回复方向(例如:'showAllCompaniesView' 和'updateCompaniesView()')吗?

在此处输入图像描述

标签: umldiagramclass-diagramsequence-diagram

解决方案


  1. 不需要回复。如果省略它,同步消息将隐含返回。在被调用对象执行某些操作并且只有在发生进一步操作时才返回给调用者的情况下,您将使用返回消息。这是一个粗略的草图,我省略了几乎所有不需要的东西: 在此处输入图像描述
  • 所以在上图中,第一条消息没有显示返回,因为它很简单。Object2唯一执行一些操作。
  • 第二条消息触发了更复杂的事情Object2(即消息到Object3)。忽略返回仍然是微不足道的,因为只有在for 消息Object1的执行结束后才能开始。Object2
  • 第三条消息有明确的返回。您可能会展示在执行期间您有一些复杂的消息结构(我只展示了一条消息,但您可以在这里想象一个森林,我猜)。如果您有分配或与某些返回结果相关的任何其他签名,您还将显示返回消息。从 p。UML 2.5 的 575:

回复消息标签用于回复消息。它具有以下形式:

<reply-message-label> ::= [<assignment-target> ‘=’] <message-name> [‘(’ [<output-argument-list>] ‘)’] [‘:’ <value-specification>]

  1. 是的。反之亦然,您可以使用消息。如果你有一个调用,你最终会进入一个堆栈(你也可以看到对象生命线顶部的附加方块。从编程的角度来看,这将更加棘手,因为你必须以某种方式在你的程序中接受外部调用正在运行。通常你需要使用线程技术来实现它。

1 的更多背景知识。我的陈述更多是出于经验而非规范。我再次开始阅读 UML 2.5(第 17.4.3 章)以查找详细信息 - 但找不到直接的陈述。以下是我找到的段落(按命名章节下方的顺序):

  • 如果 messageSort 是回复,则 Message 表示从对 Operation 的同步调用返回。Message的参数对应Operation的out、inout和returnownedParameters,按照ownedParameters的顺序。

[...]

一条消息显示为从发送方 MessageEnd 到接收方 MessageEnd 的一条线。当从发送事件遍历到接收事件时,该行必须使得每个行片段都是水平的或向下的。发送和接收事件可能都在同一条生命线上。线或箭头的形式反映了消息的属性:

[...]

  • 回复消息(messageSort 等于回复)有一条虚线,带有打开或填充的箭头。

[...]

出现在 request-message-label 中的 message-name 是 Message 的 name 属性。如果消息有签名,这将是签名引用的操作或信号的名称。否则,名称不受约束。

到目前为止的规格。回复的出现次数更多,但只是为了描述它必须是什么样子。此外,通常与虚线和空心箭头一起使用的返回箭头未列在 B.6 UML Notations 和 UML DI Representations 下的17.1包含在序列图中的图形节点下的表格中。但它用于17.14 CombinedFragment等示例图中。

让我特别皱眉的是语句A reply Message (messageSort equals reply) 有一条虚线,带有打开或填充的箭头。看起来您可以任意选择表格(填写或不填写)而没有语义差异。

嗯,UML 规范是由人类制定的,并非没有错误(我已经发送了一些错误报告)。不过,我也是人。也许其他人发现了一些我找不到的细节。


正如 AxelScheithauer 所评论的,开/关箭头可能与 a-/synch 符号兼容。不过,从异步消息返回似乎毫无意义。好吧,除非少数 OMG 作者之一出现在这里告诉我们真相 xD,否则我们将其留给猜测


推荐阅读