【问题标题】:using Quick Sequence Diagram Editor for sequence diagrams对序列图使用快速序列图编辑器
【发布时间】:2010-12-23 10:24:57
【问题描述】:

有人有Quick Sequence Diagram Editor 的经验吗?即时显示+文本源代码+Java实现的组合对我来说很有吸引力,但我不太清楚如何让语法做我想要的,文档也不是很清楚。这是一个人为的例子:

al:Actor
bill:Actor
atm:ATM[a]
bank:Bank[a]

al:atm.give me $10
atm:al has $3=bank.check al's account balance
al:atm.what time is it
atm:al.it's now
atm:al.stop bugging me
atm:al.you only have $3
atm:bill.and don't you open your mouth
bill:atm.who asked you?
bill:atm.give me $20
al:atm.hey, I'm not finished!
atm:bill has $765=bank.check bill's account balance
atm:yes I'm sure, bill has $765=bank.hmm are you sure?
atm:bill.here's $20, now go away
atm:great, he's a cool dude=bank.I just gave Bill $20
al:atm.what about my $10?
atm:al.read my lips: you only have $3

这是 QSDE 在单线程模式下的结果:

在多线程模式下:

我想我不清楚是什么开始/结束了这些竖线。我有一个单线程的情况,但是涉及到状态,并且所有的消息都是异步的。我想这意味着我应该使用一个外部对象来表示该状态及其生命周期。我想要的是一个时间线来表示消息序列

  1. al:atm.给我 10 美元
  2. atm:bank.check al 的账户余额
  3. bank:atm.al 有 3 美元
  4. atm:al.你只有 3 美元

和另一个时间线来表示消息序列

  1. bill:atm.给我 20 美元
  2. atm:bank.check bill 的账户余额
  3. bank:atm.bill 有 765 美元
  4. atm:bank.hmm 你确定吗?
  5. bank:atm.yes 我确定,账单有 765 美元
  6. atm:bill.这是 20 美元,现在走开
  7. atm:bank.I just give Bill $20
  8. bank:atm.great,他是个很酷的家伙

其他“俏皮话”代表我现在不关心的其他杂项信息。

有没有办法通过 QSDE 做到这一点?

【问题讨论】:

  • 谢谢,不知道QSDE,我比那些所见即所得的编辑器更喜欢它...

标签: sequence-diagram


【解决方案1】:

当一个新线程启动时(并且来自用户的消息总是启动一个新线程)它不会停止,直到它被显式停止或直到图表结束。例如。 atm:stop 终止 atm 线程

这里是第一次尝试 (一切都在多线程模式下):

al:Actor
bill:Actor
atm:ATM[a]
bank:Bank[a]

al:atm.give me $10
atm:al has $3=bank.check al's account balance
atm:al.you only have $3
atm:stop

bill:atm.give me $20
atm:bill has $765=bank.check bill's account balance
atm:yes I'm sure, bill has $765=bank.hmm are you sure?
atm:bill.here's $20, now go away
atm:great, he's a cool dude=bank.I just gave Bill $20

另一个带有异步消息的版本

(可以说消息应该是异步的,因为它们是通过网络传输的。无论如何现在所有箭头看起来都一样)

">" 在消息开头启动一个新线程(所有来自用户和进程的消息默认启动一个新线程。)

结尾的“&”表示调用立即返回,不显示新线程。您可以使用它来模拟向现有线程发送消息。 (默认情况下,所有发送给用户和进程的消息总是立即返回。)

al:Actor
bill:Actor
atm:ATM[a]
bank:Bank[a]

al:atm.give me $10
atm:>bank.check al's account balance
bank:>atm.al has $3&
bank:stop
atm:al.you only have $3
atm:stop

bill:atm.give me $20
atm:>bank.check bill's account balance
bank:>atm.bill has $765&
bank:stop

atm:>bank.hmm are you sure?
bank:>atm.yes I'm sure, bill has $765&
bank:stop

atm:bill.here's $20, now go away
atm:>bank.I just gave Bill $20
bank:>atm.great, he's a cool dude&
bank:stop

所有俏皮话的完整示例

从示例中不清楚 ATM 中的线程何时应该停止。 ATM 似乎更像是一个用户或进程,而不是一个对象。所以这个例子不一定有意义

al:Actor
bill:Actor
atm:ATM[a]
bank:Bank[a]

al:atm[a].give me $10
atm:al has $3=bank.check al's account balance

al:atm.what time is it
atm:al.it's now
atm:stop

atm:al.stop bugging me
atm:al.you only have $3

atm:bill.and don't you open your mouth
bill:atm.who asked you?&
atm:stop

bill:atm.give me $20
al:atm.hey, I'm not finished!&
atm:bill has $765=bank.check bill's account balance
atm:yes I'm sure, bill has $765=bank.hmm are you sure?
atm:bill.here's $20, now go away
atm:great, he's a cool dude=bank.I just gave Bill $20
atm:_
atm:stop

al:atm.what about my $10?
atm:al.read my lips: you only have $3

【讨论】:

  • 您可能想建议将此添加到官方文档中。干得好,为我解决了一些问题。
【解决方案2】:

艾尔和比尔是人类。一个人怎么可能成为单线程情况的一部分?与程序相反,人类在另一个程序返回之前不会静止不动。它们可以触发计算活动并接收来自计算机的信号,但它们不会进入线程的堆栈。

文档清楚地说明(引用自多线程帮助):

“新生成的线程可以通过其相应生命线的颜色与旧线程区分开来。”

“作为一项规则,参与者向对象发送的消息(动态)会产生一个新线程。”

这就是你的竖条的来源。

如果你想要单线程或双线程的情况,你应该使用对象,而不是演员。

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 2023-03-15
    • 2021-10-25
    • 1970-01-01
    • 2020-02-01
    • 2021-09-18
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多