【问题标题】:UML association class - clarifyingUML 关联类 - 澄清
【发布时间】:2012-03-27 18:45:36
【问题描述】:

我正在阅读 Martin Fowler 的“UML 提炼”,在阅读有关关联类的内容时,我得到了以下引用:

使用关联类来抵消 额外的符号你必须

还记得吗?关联类增加了一个额外的约束,在那个 只能有一个实例

任意两个参与对象之间的关联类。

然后有一个例子,但我想确保我做对了,例如我得到了:

 ---------            ---------
|         |*        *|         |
| CLASS A |----------| CLASS B |
|         |     |    |         |
 ---------      |     ---------
                |
          ______|______
         |             |
         |             |
         |  CLASS C    |
         |             |
         |_____________|

那么,对于每一对不同的对(A 的实例,B 的实例),只存在一个 C 类的实例。

因此,如果我采用 A1,A2,B1,B2 实例,那么对于 (A1,B1) (A1,B2) (A2,B1) (A2,B2) 我将获得 4 个 C 实例,仅此而已,仅此而已?

【问题讨论】:

    标签: uml associations


    【解决方案1】:

    UML 中的关联表示(具有)逻辑意义(UML 不是数据库建模工具!)。关联描述可能的逻辑事实。例如。两个人 A 和 B 可以结婚,我们可以把它画成联想,它代表的意思就像“我们知道 A 和 B 之间存在逻辑联系”。如果我们知道那是什么,我们就将阶级关联[结婚证]作为物化的事实。

    【讨论】:

      【解决方案2】:

      来自 UML 2.5 规范:

      请注意,当 AssociationClass 的一个或多个末端有 isUnique=false,可能有多个实例关联 结束类的同一组实例。

      先生。福勒可能弄错了事实。没有额外的限制,只有存储附加属性值的能力。

      当 isUnique=false 时,额外的属性允许模拟在不同日期多次访问同一位医生,或在不同日期多次购买相同产品。

      【讨论】:

      • 他们在哪个页面上这么说的?在页。 239,他们说“当关联的一个或多个端点具有 isUnique=false 时,可能有多个链接关联同一组实例。”请注意,他们在 UML 1.x 中没有这种关联结束的多集语义,Martin Fowler 的旧声明提到了这一点。所以,他并没有弄错事实(请更正你关于他的句子),但是 OMG 修改了语义。
      • 谁能告诉我Martin Fowler 的UML Distilled 第三版是否对UML 2.x 提出了同样的主张?请注意,我确实说过“可能”。
      • 您的答案令人困惑,因为您没有解释,默认情况下(当关联端是唯一的时),存在此约束,并且仅当至少一个关联端被注释为非-unique,没有这样的限制。
      • 注解是可选的,所以当没有注解时不能假设默认约束有效。这可能是规范中的一个缺陷。
      • 我不知道这句话的出处,但在我从omg.org/spec/UML/2.5/PDF 下载的 2015 年 3 月的 2.5 规范中,我在第 199 页的 §11.5.3 中找到了这个注释——注意。即使 AssociationClass 的所有端都具有 isUnique=true,也可能有多个实例关联端 Classes 的同一组实例。 -- 此声明没有解释的余地​​:UML 提炼中的声明已过时。
      【解决方案3】:

      你的推理是正确的:如果一个关联类没有一个或两个关联结尾都用{nonunique} 注释,那么它意味着相同对象之间只能有一个链接的约束(正如 Martin Fowler 所解释的)。

      但请注意,非唯一关联结束选项仅在 UML 2(2005 年)中添加,Martin Fowler 的书(自 2003 年起)参考了 UML 1.x。

      一些例子可能会有所帮助。例如,PersonPieceOfLand 之间的关联 LandPurchase 可以建模为 UML 关联类(具有默认的唯一关联端),因为一个人和一块土地之间只能有一个购买链接。 PersonProduct 之间的关联ProductPurchase 只有在Product 侧的关联端被注释为{nonunique} 时才能建模为关联类,因为同一个人之间可以有多个购买链接和相同的产品(作为一种类型)。例如,我可以购买不止一辆特斯拉 Model S 汽车(如果我有钱的话)。

      类似地,在PersonDoctor之间的Appointment的情况下,由于同一个人可以与同一位医生进行多次预约,因此Doctor一侧的关联端必须注释为{nonunique}

      【讨论】:

      • 说“Person 和 Product 之间的二进制关联 ProductPurchase 不能建模为 UML '关联类'”是不正确的。请参阅我引用 UML 规范的答案。
      • 感谢您指出这一点。我已经修改了我的答案。现在是正确的。
      • 唯一性指示符在 BNF 中是可选的。因此,如果没有明确的 {unique} 或 {nonunique} 标记,就不能说这意味着同一对象之间只能有一个链接。
      • 说得更清楚一点,不是终点是否被注解,而是终点元属性的设置方式。
      • 在视觉模型中,您无需设置元属性,而是添加注释。 isUnique 元属性的默认值为true,因此,如果图表中的关联端没有{unique} 注释,则isUniquetrue
      【解决方案4】:

      这是正确的,无意在这里混合概念,但它类似于数据库中的表,其中:

      A 1-* C
      B 1-* C
      

      C 可以看作是打破 A 和 B 之间的多对多关系的结果。

      对于 B 上的每一行只能存在 1 并且只有 1 行 C 并且该特定行(在 C 上)只能与 A 上的 1 行相关。 因此,对于 A 和 B 上的每一对唯一行,C 上只能存在 1 行或不存在,因为 * 表示 0 或更多。

      【讨论】:

      • 我认为您还没有理解表示 A 和 B 之间的二进制关联的“关联类”C 与与 A 和 B 关联的类 C 之间的 UML 区别。
      • 这个答案关于可能的行数是不正确的。请参阅我引用 UML 规范的答案。
      猜你喜欢
      • 2016-06-27
      • 2017-04-18
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多