Uml 序列图:后台循环

Uml 序列图:后台循环,uml,infinite-loop,sequence-diagram,plantuml,Uml,Infinite Loop,Sequence Diagram,Plantuml,我在一个系统(B)上工作,该系统与另一个系统(C)进行通信,并在终端(a)的持续循环中显示计算值。(A) 要求(B)报告变量x。(B) 在不阻塞的情况下执行,以便(B)可以继续处理(C)。稍后,(A)要求(B)也报告变量y,该变量将由(B)以相同的方式提供服务 对于文档,我需要创建一个描述过程的UML序列图(使用plantuml)。我现在的问题是如何正确地建模。(B)和(C)之间的通信将继续,即使循环尚未完成。但是我如何正确地建模呢 下面是选项1,仅在循环中使用异步应答: @startuml A

我在一个系统(B)上工作,该系统与另一个系统(C)进行通信,并在终端(a)的持续循环中显示计算值。(A) 要求(B)报告变量
x
。(B) 在不阻塞的情况下执行,以便(B)可以继续处理(C)。稍后,(A)要求(B)也报告变量
y
,该变量将由(B)以相同的方式提供服务

对于文档,我需要创建一个描述过程的UML序列图(使用
plantuml
)。我现在的问题是如何正确地建模。(B)和(C)之间的通信将继续,即使循环尚未完成。但是我如何正确地建模呢

下面是选项1,仅在循环中使用异步应答:

@startuml
A ->> B: report x
loop
    B -->> A: x
end loop
B -> C: foo
C --> B: bar
A ->> B: report y
loop
    B -->> A: y
end loop
B -> C: qux
C --> B: baz
@enduml

选项2适用于在流程后期变为真的条件:

@startuml
A ->> B: report x
loop until reporting x ends
    B -->> A: x
end loop
B -> C: foo
C --> B: bar
A ->> B: report y
loop until reporting y ends
    B -->> A: y
end loop
B -> C: qux
C --> B: baz
B -->> A: end reporting x
B -->> A: end reporting y
@enduml


选项2更加明确。但是这两个选项中的任何一个都正确地表示了当前的流程吗?

它们可能都是正确的。SD显示流程的具体视图。由于时间是线性的(忘记这里的量子跃迁),并且你没有真正的并行过程,你将有一个对象在单一时间发送或接收消息,而没有任何并行。这取决于你所代表的序列。也许你需要不止一个序列来给出一个一半清晰的画面

要显示真正的并行进程,您需要两条时间线(例如,如果您有两个并行处理器和同一进程的两个分支并行运行)。如果需要,您可以添加时间约束,并显示某些事情(几乎)是并行的


我想添加一个状态图是一个好主意,该图显示了如何支持转换,以及何时何地以及等待多长时间。

高级视图是合适的。委托人对上下文切换等不感兴趣。我只是想确保x和y变量的报告是一个持续的过程,不会以“foo bar”和“qux baz”调用/响应结束。请三思。单个线程中的非阻塞操作将导致轮询。否则,如果使用中断,则会有第二个线程。这是一个设计问题。在SD中仅仅做一些“抽象绘图”不会有任何好处。如果涉众不感兴趣,可以使用广告将其保持在业务级别。实现将使用线程。我只是想知道我是否需要以不同的方式建模,或者我建模的循环是否会被理解为我想要的:循环将一直持续到结束(选项1)或者直到(B)明确停止循环(选项2)。好吧,你可以简单地添加一条注释来明确你的意图。只需说明图表在技术上是“不正确的”。但是,我会使用活动和/或状态图。如果你只有一把锤子,每个问题都是钉子。如果你有一个工具箱,你会发现事情会更聪明。是的,那会有用的。但是,你不应该把它作为一个标准的习惯;-)