【问题标题】:Can two compositions own the same object?两个组合可以拥有同一个对象吗?
【发布时间】:2019-07-10 15:14:34
【问题描述】:

我正在尝试为在线拍卖系统制作类图,但遇到了这个问题。出价属于拍卖和买方(如果我错了,请纠正我)。那么我可以说用户由出价和拍卖由出价组成还是违反 UML 规则?我很困惑

【问题讨论】:

    标签: oop uml composition object-oriented-analysis


    【解决方案1】:

    您了解过 UML 中的关联类吗?它们代表从其他两个类之间的关系创建的对象,正是您要映射的对象。有很多详细描述关联类的内容(例如Correct use of an association class

    这样您就不会在阅读图表时感到困惑(顺便说一句,您做得正确),您会很清楚存在实体 Bid,该实体仅与买方和拍卖相关联。

    【讨论】:

      【解决方案2】:

      一般

      术语组合是模棱两可的,这解释了你的困惑:

      • 在 OOP 中,object composition 表示在另一个对象中使用一个对象。
      • 在 UML 中,composition 是一种特殊的关联,表示部分-整体关系,整体对部分具有独占所有权。

      所以在 UML 意义上,不可能有一个对象是两个不同组合的一部分,因为所有权将不再是独占的。但是您可以在多个aggregations 中使用该对象,它们是允许共享所有权的整体关系。

      在 OOP 的意义上,在多个组合中使用(或使用)相同的对象是没有问题的。对象组合对应一个navigable UML association

      在你的实际案例中

      情况很简单:一个Bid 有一个Buyer,一个Buyer 可能有几个Bids,一个Auction 有几个Bids。您可以使用简单的关联对其进行建模:

      您也可以在这里使用聚合,因为有人可能会争辩说Auction 和相应的Bids 之间存在整体关系(我个人不会这样认为):

      但是,您不应该在另一边看到聚合,因为 BuyerBid 之间没有真正的整体关系:Buyer 不是“由多个 Bids 组成”。

      补充说明

      您也可以在这里使用关联类。但这不是必需的。而且语义会有所不同:这意味着BuyerAuction 之间存在Bid 关联:

      • 从技术上讲,您仍然需要三个课程。
      • 但重点不同:BidBuyerAuction 的附属品,不能单独存在(例如,如果买家消失了)

      【讨论】:

      • 我认为“在拍卖中每个买家最多一次出价”的说法对于关联类来说是不正确的。如果我在买方和拍卖之间有 []--[] 关联,那是否允许在一个 Action 中对每个买方进行多次出价?
      • @GeertBellekens 有适当的课程,你可以。但是对于关联类,我不认为,因为语义上的原因,关联没有身份,只是为了给链接提供属性。但值得在 UML 标准中进行交叉检查。如果您发现任何相反的证据,我准备调整我的补充评论。
      • 参见第 199 页的注释:NOTE。即使 AssociationClass 的所有端都具有 isUnique=true,也可能有多个实例关联端 Classes 的同一组实例。
      • @GeertBellekens 感谢您提供如此丰富的信息!我已经相应地调整了措辞
      • @Geert:您指出 AssociationClass 不再定义唯一链接是正确的。事实上,它在 UML 2.5 中失去了它的独特性。我认为这是一个错误,因为这是它唯一的显着特征。它使 AssociationClasses 过时了,因为它们现在总是可以替换为中间类。
      猜你喜欢
      • 2016-10-29
      • 2012-01-16
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多