序列图中方法调用的消息与信号的区别

4

我正在学习UML序列图,并遇到了方法调用。我注意到在统一建模语言(UML)中有两种方法可以调用方法行为,分别是信号和消息,但我不知道如何指定哪个以及基于什么?我的意思是什么时候使用消息,什么时候使用信号,因为我认为这是一个非常重要的设计决策,应该仔细选择。

2个回答

3
实际上是这样的,但我认为您使用的术语不是很准确(消息和信号)。在时序图中,两个对象之间的任何通信都被视为一条“消息”。然而,有两种基本类型的消息-同步和异步。
通常的方法调用即同步调用,也称同步消息。当方法调用者等待阻塞直到方法执行完成时,它将接收到调用方法的返回值并继续自己的执行。结果,只有一个执行线程。
还有异步通信,当一个对象向另一个对象发送消息并立即继续执行而不等待时。例如,SMS消息,UDP包发送等。这里有两个独立的执行线程。
通常所说的“信号”指的是异步消息发送。

0

Kirill Fakhroutdinov的页面http://www.uml-diagrams.org/sequence-diagrams.html解释了消息的含义

按操作类型分类的消息

..消息反映了操作调用和执行开始或发送和接收信号...

除了消息的同步/异步性质外,它还指出了在活动图中使用的“发送信号操作”

异步信号

..异步信号消息对应于异步发送信号操作..

对我来说,在建模消息与信号时一个重要的区别是单播/多播(广播)语义。信号可以从一个地方发送(带有所有必要的参数打包),并在多个地方接收。

序列图允许使用“找到消息”和“丢失消息”的概念对多播行为进行建模。

(我不是100%确定,但我相信我很接近)


编辑:添加更加正式的解释支持我的论点,即信号与单播/多播(广播)有关,以回应@Aleks的评论。

"统一建模语言参考手册"(James Rumbaugh,Ivar Jacobson,Grady Booch著,Addison Wesley Longman,Inc.版权所有©1999年)解释了消息和信号之间的区别,例如使用以下词汇:

消息..语义

..消息是从一个对象(发送者)向一个或多个其他对象(接收者)发送信号,或者是另一个对象(发送者或调用者)对一个对象(接收者)进行操作的调用。消息的实现可以采取各种形式...

信号事件

.. 信号具有显式参数列表。它由一个对象明确地发送到另一个对象或一组对象。事件的一般广播可以被视为向所有对象集发送信号,尽管..

.. 信号是对象之间可以异步通信的显式手段。要执行同步通信,必须使用两个异步信号,在通信的每个方向上使用一个信号..

编辑:添加企业架构可视化的三种不同消息表示法

请注意,由于信号的异步和多播特性(如上所述),相应的表示法不包括“返回值”部分。

3 different message types as supported by Enterprise Architect


信号(来自序列图)和发送信号动作(来自活动图)实际上是完全相同的东西,同一个概念,只是从不同的角度看待而已。这就是UML的美妙之处和抽象能力所在——它为我们提供了几种模拟同一概念的选项,我们必须在每个给定的上下文/情况中决定并选择最佳选项。另一方面,失物招领信息是带有未知发件人或收件人的信号,与广播无关。 - Aleks
@Aleks 我同意信号分类器在模型中可能以独特的方式表示,而图表只是系统不同方面的不同视角。我不同意“与广播无关”,但这种有主见的讨论不能回答PO的问题:“为什么有两种调用方法?何时使用消息,何时使用信号?”您可以在自己的答案中写出什么是正确的、什么是错误的和什么是美丽的,但在我看来,这并没有充分回答问题,这就是为什么我试图提出自己的解释。 - xmojmr
我认为我的答案应该足以澄清信号和同步消息之间的区别。了解这种区别,可以轻松决定在UML图中使用哪种 - 当通信的性质是同步时,使用同步消息,当它是异步时,使用信号。此外,还有评论可以进一步提问/澄清。 :) - Aleks
@Aleks,我使用了你的评论来改进我的答案,谢谢。顺便说一下,在你的回答和最后一条评论中,不是有两种消息(正如你所声称的),而是有三种消息,就像图片上显示的那样。 - xmojmr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接