问题描述
我正在做一个小的 UML 项目,用户必须通过使用信用卡(他/她拥有)购买机票。 有3种类型的票:单次使用票、半日票和全日票,都是抽象票类的子类。
序列图必须代表购买其中一张票的行为,但是我正在努力实现它(我在这个项目中使用了 STARUML)。
解决方法
您已经为此使用了正确的元素:带有 alt-operator 的组合片段。
但是,有些事情不清楚:在您的操作数中,您有一个文本(例如“一次性使用”)。我想知道这是什么。如果是守卫,则需要放在方括号中。通常,守卫将使用生命线表示的某些类型的属性以及操作数中的第一条消息,在这种情况下为 Ticket
。它没有这样的属性,但我们可以将其解释为某些 TypeOf()
函数的结果。
接下来是,Ticket
泛化了 Single Use Ticket
,因此 Single Use Ticket
类型的每个对象也是 Ticket
。那么,为什么 Ticket
对象与 Single Use Ticket
对象通信?只有当 Ticket
与 Single Use Ticket
有关联时才有意义,而它没有。因此,四个 Ticket
生命线应该只有一个,所有 getCost
-消息将被定向到发送它们的同一生命线。
我理解,您想表达的是,getCost
的实现取决于票证的类型。但是,这仅在序列图中可见,当实现导致发送不同的消息时。这不是这里的情况。
同样奇怪的是,Ticket.buy
需要一个 Ticket
类型的参数。当您向 buy
对象发送 Ticket
消息时,它应该如何处理另一个 Ticket
对象?
图中的一个错误是,您的回复消息与同步消息不一致。回复消息必须返回到发送同步消息的生命线,因为“同步”意味着发送者正在等待回复。
您正在将找到的消息用于来自用户的消息。我更愿意使用图表框架中的消息,因为原则上你知道它们来自哪里,你只是选择不对其进行建模。
最后一个建议:生命线可以表示属性或参数。因此,您应该在生命线的头部显示参数或属性的名称,例如cc:Credit card
。如果省略名称,则类型前面的冒号会保留。