阅读序列图

4
我有一个序列图,包含两个生命线和同步消息。 enter image description here 我理解如下:
“生命线1”代表一个对象执行一段时间。在“生命线1”执行期间,恰好在红色圆圈处,“生命线1”需要从“生命线2”获取某些内容才能完成其执行。
因此,
1)“生命线1”暂停执行,然后
2)调用同步消息。(请在您的答案中澄清一下)
粉色线条表示“生命线1”到达“生命线2”并开始执行所需的时间。
3)蓝色矩形表示消息执行的持续时间。
4)虚线表示“生命线2”需要多长时间才能到达“生命线2”以恢复其执行。
5)黑色矩形表示“生命线1”空闲的时间段。
我理解得对吗?
我是否漏掉了任何步骤?
2个回答

2
“生命线1”代表在一段时间内执行的对象。虚线垂直线表示对象的生命周期。当对象处于活动/执行/控制状态时,在该线上绘制“执行规范”框。
在“生命线1”执行期间,恰好在红色圆圈处,“生命线1”需要“生命线2”的某些东西才能完成其执行。
如果它需要某些东西来开始执行,那么它不会显示为具有执行规范,而是在接收到消息后被显示为变为活动状态。相反,该块显示“生命线1”处于活动状态,并发送同步消息。
“生命线1”暂停其执行,然后调用同步消息。这类似于在对象上调用方法-同步消息的控制流立即从发送者传递到接收者,并且在接收同步消息后,接收者将显示为活动对象。
“粉色的线代表了“生命线1”需要到达“生命线2”以执行操作的时间持续期。这个时序图并不涉及时间,它只展示了操作的顺序。使用持续约束和持续观察符号可以展示时间持续期,这些符号在OMG† UML2 Superstructure 的表14.1中有说明。”
“蓝色矩形代表消息执行的时间持续期。在蓝色矩形所表示的过程阶段中,“生命线2”对象正在响应该消息进行执行。说“消息执行”有点含糊,实际上是对象在执行,而不是消息本身。”
“虚线代表返回消息的时间持续期。因为从“生命线1”发送的消息是同步的,所以它只有收到返回消息后才会继续执行。”
“黑色矩形代表“生命线1”处于空闲状态的时间段。”
UML序列图中的执行规范块表示对象正在积极执行。等待同步消息返回的空闲对象应该在其生命线上没有执行规范块来表示。(颜色在UML中没有意义-它们在此图中存在是为了让您谈论特定块,它们不显示对象是否活动)。
我会采取稍微正式一些的方法,并说执行不应该显示在它所在的位置,而应该在接收到返回消息后开始表示lifeline1继续-就像调用另一个对象中的方法的方法直到调用返回才接收控制流程。
然而,通常会将等待返回消息的对象显示为具有执行规范,因为它在某种程度上仍在控制操作顺序。
(不幸的是,UML太庞大、太模糊了,几乎任何例子都可以用不同的方式阅读。由于我使用UML生成可执行模型以检查死锁流程使用pi-演算,我倾向于比解释给共同开发人员的人更严格地解释。)
† Object Management Group维护UML标准,而不是“天哪,它太大了”,尽管这也适用。

谢谢,我在以下链接中发表了评论,因为它有点长: http://www.mediafire.com/?cm3q8w8m1r5rxne - user2019510
1
@user2019510,这种格式不太适合来回交流,但是针对你提到的两个问题 - 通常情况下,序列图是由外部参与者发送消息或一个对象处于活动状态开始的,但如果只显示一些交互,则可以省略此步骤。至于“任何人想出的例子都可以以不同的方式阅读”如何发生 - UML规范在严格性和自洽性方面较低,因此不同的用户会有不同的解释。它没有说明如何转移控制影响执行规范。 - Pete Kirkham
1
@user2019510,UML规范指出:“通常,起始发生和结束发生将表示OccurrenceSpecifications,例如接收OccurrenceSpecification(消息)和回复消息的发送OccurrenceSpecification。”它并没有说明发送同步消息并等待返回是否意味着对象停止执行 - 大多数情况下,当对象“在堆栈”上等待开始执行时,它仍然显示为正在执行,但这在非过程化代码中是没有意义的。 - Pete Kirkham
嗨@Pete Kirkham,我了解你的观点,但这不是我所读到的关于"同步调用"的定义: “与操作相关联的同步调用具有发送和接收消息。消息从源生命线发送到目标生命线。源生命线被阻止执行其他操作,直到它收到来自目标生命线的响应。” 此定义来自网址: http://pic.dhe.ibm.com/infocenter/rsarthlp/v8/index.jsp?topic=/com.ibm.xtools.sequence.doc/topics/cmsg_v.html - user2019510
1
UML所强制执行的所有语义都在以“通常”开头的引用中。在更正式的环境中,我倾向于同意您的观点,但是通常采用将阻塞操作显示为执行直到返回的约定,并且根据UML来说并不是不正确的。通常,不同的团队或公司会就UML语义达成自己的澄清协议,而规范则模糊不清。如果您正在上课学习这个问题,请采纳老师给您的建议。 - Pete Kirkham
显示剩余4条评论

0

快速建议

将序列图视为二维流程图(活动图),就像棋盘一样。

冗长乏味的扩展答案

想象一个棋盘,其中每个方格或单元格都是您移动棋子的位置。序列图也是如此。

在序列图中,有列,其中包含类的实例(演员、表、边界、任何对象),以及行,其中执行操作。

想象一下,您有一个正在执行操作的图形,就像流程图一样,每次执行操作或“消息”时,该图形都会移动到下一个方格或单元格或块。

棋盘上的某些“单元格”位于同一列(对象生命周期)。

有时,我会使用带有分区的线条来绘制序列图,以帮助我记住每个分区都是执行操作的单元格或位置。

.......................................................
.........+--------------+............+--------------+..
.........| * : FooClass |............| * : BarClass |..
.........+------+-------+............+------+-------+..
................|...........................|..........
................|...........................|..........
............+---+---+...................+---+---+......
.....start..|   |   |......enter()......|   |   |......
..(*)======>|   |   |==================>|   |   |---+..
............|   |   |...................|   |   |...|..
............+---+---+...................+---+---+...|..
............|   |   |.......return......|   |   |...|..
........+---|   |   |<------------------|   |   |<--+..
........|...|   |   |...................|   |   |......
........|...+---+---+...................+---+---+......
........|...|   |   |....PlayChess()....|   |   |......
........+-->|   |   |==================>|   |   |---+..
............|   |   |...................|   |   |...|..
............+---+---+...................+---+---+...|..
............|   |   |.......return......|   |   |...|..
........+---|   |   |<------------------|   |   |<--+..
........|...|   |   |...................|   |   |......
........|...+---+---+...................+---+---+......
........|...|   |   |..HaveRootBeer()...|   |   |......
........+-->|   |   |==================>|   |   |---+..
............|   |   |...................|   |   |...|..
............+---+---+...................+---+---+...|..
............|   |   |......return.......|   |   |...|..
........+---|   |   |<------------------|   |   |<--+..
........|...|   |   |...................|   |   |......
........|...+---+---+...................+---+---+......
........|...|   |   |...GetSandwich()...|   |   |......
........+-->|   |   |==================>|   |   |---+..
............|   |   |...................|   |   |...|..
............#"""+"""#...................+---+---+...|..
............!   |   !...GetFriesAlso()..|   |   |...|..
............!   |   !...............+---|   |   |<--+..
............!   |   !...............|...|   |   |......
............#"""+"""#...............|...+---+---+......
............!   |   !...............|...|   |   |......
............!   |   !...............+-->|   |   |---+..
............!   |   !...................|   |   |...|..
............#"""+"""#...................+---+---+...|..
....finish..|   |   |...................|   |   |...|..
...(O)<-----|   |   |<------------------|   |   |<--+..
............|   |   |...................|   |   |......
............+---+---+...................+---+---+......
................|...........................|..........
................|...........................|..........
................|...........................X..........
.......................................................

生命线表示特定对象执行操作或“消息”,请注意,在示例中,一些生命线具有不同的字符(“颜色”)以指示对象何时处于空闲或繁忙状态。

干杯。


谢谢您的帮助,但我仍然不知道我是否正确地读取了SD卡? - user2019510

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