这个类图代表什么?反射关联的类图使用实线和箭头,但这里被空心菱形所取代。它与递归有关吗?这个类图将生成什么?最好能给一个例子。此外,这种递归关系应该是一对多的,如果要存储在数据库中,如何建立表格。
Unit
实例可以与多个其他 Unit
实例关联:
空心的聚合钻石只是一种“建模安慰剂”:它不会改变图表的含义,只是暗示这种关联表示某种分组。
反身关联意味着将一个类与其自身相关联。与递归没有直接关系,正如此SO答案所解释的那样。
然而,递归算法是探索这种关联的好选择(例如,查找所有间接与特定实例相关的Unit
实例)。在数据库环境中,“递归关联”一词有时代替“反身关联”,因为使用递归连接来实现它们。
1
应该更改为 0..1
,因为 1
表示恰好为 1,这将意味着在向上导航时有无尽的循环。Unit
实例可以是某些分支的起点,并且可能会共享公共分支(无稽之谈:最多只有一个父级)。
让我们添加一些角色来更好地谈论聚合的结束:
代码生成将取决于工具和目标语言。但是,具有聚合的模型和具有简单关联的模型很可能会生成完全相同的代码,例如:
class Unit { // Java
private String id;
private Unit[] child; // java objects are sharable by default
private Unit parent; // unless we make it non navigable in that direction
...
}
ID (PK) | Parent (FK, nullable)
----------------------------------
w |
u |
u1 | u
u2 | u
u3 | u
u21 | u2
u31 | u3
u32 | u3
v |
v2 | v
UML 2.5 的第110页针对这种关系阐述:
shared - 表示该属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。
简而言之:它的意思取决于你定义时的含义。
关于历史的注释
在UML 1.5中,只有聚合。然后在2.0中引入了共享聚合。在UML 2.0的第80页上:
表示该属性具有共享聚合。
并且更进一步地说:
共享聚合的精确语义因应用领域和建模者而异。
显然,后一句话还没有传达给普通人,你会发现各种解释它的含义。
幸运的是,在UML 2.5中,这两个句子被合并成一个段落。即在我著名的第110页。