类图中的序列图

问题描述

我正在做一个小的 UML 项目,用户必须通过使用信用卡(他/她拥有)购买机票。 有3种类型的票:单次使用票、半日票和全日票,都是抽象票类的子类。

序列图必须代表购买其中一张票的行为,但是我正在努力实现它(我在这个项目中使用了 STARUML)。

enter image description here

这就是我要实现的方式

enter image description here

解决方法

您已经为此使用了正确的元素:带有 alt-operator 的组合片段

但是,有些事情不清楚:在您的操作数中,您有一个文本(例如“一次性使用”)。我想知道这是什么。如果是守卫,则需要放在方括号中。通常,守卫将使用生命线表示的某些类型的属性以及操作数中的第一条消息,在这种情况下为 Ticket。它没有这样的属性,但我们可以将其解释为某些 TypeOf() 函数的结果。

接下来是,Ticket 泛化了 Single Use Ticket,因此 Single Use Ticket 类型的每个对象也是 Ticket。那么,为什么 Ticket 对象与 Single Use Ticket 对象通信?只有当 TicketSingle Use Ticket 有关联时才有意义,而它没有。因此,四个 Ticket 生命线应该只有一个,所有 getCost-消息将被定向到发送它们的同一生命线。

我理解,您想表达的是,getCost 的实现取决于票证的类型。但是,这仅在序列图中可见,当实现导致发送不同的消息时。这不是这里的情况。

同样奇怪的是,Ticket.buy 需要一个 Ticket 类型的参数。当您向 buy 对象发送 Ticket 消息时,它应该如何处理另一个 Ticket 对象?

图中的一个错误是,您的回复消息与同步消息不一致。回复消息必须返回到发送同步消息的生命线,因为“​​同步”意味着发送者正在等待回复。

您正在将找到的消息用于来自用户的消息。我更愿意使用图表框架中的消息,因为原则上你知道它们来自哪里,你只是选择不对其进行建模。

最后一个建议:生命线可以表示属性或参数。因此,您应该在生命线的头部显示参数或属性的名称,例如cc:Credit card。如果省略名称,则类型前面的冒号会保留。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...