【发布时间】:2018-03-06 12:37:27
【问题描述】:
通过搜索发现,在UML中,聚合(假设使用得当)可以用来表示类中的属性。
(假设列可以独立)
那么,使用这样的例子,如果我想用 map 替换属性:Column[] 来表示列的名称,使用如下所示的关联类是否正确? (以防万一,我不愿意将Column类中的列名作为属性)
【问题讨论】:
标签: uml class-diagram
通过搜索发现,在UML中,聚合(假设使用得当)可以用来表示类中的属性。
(假设列可以独立)
那么,使用这样的例子,如果我想用 map 替换属性:Column[] 来表示列的名称,使用如下所示的关联类是否正确? (以防万一,我不愿意将Column类中的列名作为属性)
【问题讨论】:
标签: uml class-diagram
关联类与简单关联一起使用。它们具有 m-1-1-n 多重性。共享聚合(如您所使用的)没有定义的语义(我建议您不要使用它,除非您有特定于域并记录在案的用途)。最好将预期的多重性放在关联的任一侧。
关联类连接两个类,添加属性和/或操作。您的示例是“非常规的”,因为表/列具有不需要关联类的简单关系。一个普遍的例子是学生/讲座关系,您可以在其中放置一个关联类来记录考试结果、时间等。
【讨论】:
是的,我认为这是一种有效的建模方式,即您拥有某种可用于识别此Table 中的Column 的密钥字符串。
使用Map 是众多可能实现中的一种,因此它不是真正的等于。
使用关联类建模的优点是您的模型保持在更抽象的功能级别,并省略了实现细节。
顺便说一句。对于Table 和Column 之间的关联,我会使用composition 而不是aggregation,因为两者之间存在明显的强所有权关系和生命周期依赖性。两个。
【讨论】:
如果您想用 map 替换属性 Column[] 来表示列的名称,并且您不愿意将列名称作为属性放在 Column 类中并假设您想精确地遵循 UML specification 那么您'将产生如下所示的模型:
Map<Key, Value> 通常被理解为一个关联容器,其中包含具有唯一键的键值对Map.Entry<Key, Value>。容器由从Map<Key, Value> 到Map.Entry<Key, Value> 的定向聚合建模。
Map<Key, Value> 和Map.Entry<Key, Value> 是模板。 UML 规范第 7.3.3.1 条规定:
模板不能以与非模板元素相同的方式使用。模板元素只能用于生成绑定元素或作为另一个模板规范的一部分。
根据第 7.3.3.3 条:
TemplateBinding 是 TemplateableElement 和模板之间的关系,它指定 actual ParameterableElements 替换模板的 formal TemplateParameters。
因此,我们有两个绑定元素,它们与其模板具有 TemplateBinding(由 关键字标记)关系:
ColumnNames 本质上是 Map<String, Column> 的名称
ColumnName 本质上是 Map.Entry<String, Column 的名称
根据 UML 规范的第 11.5.1 条:
关联对一组表示类型化实例之间链接的元组进行分类。 AssociationClass 既是关联又是类。
ColumnName 是 AssociationClass,表示 String 和 Column 类的实例之间的链接。我们使用第 11.5.5 节中的符号,图 11.35 来表示。
最后,Table 和 ColumnNames 类之间的方向组合关联告诉我们Table 的每个实例都拥有一个ColumnNames 实例,即一组列名。
请注意,虽然ColumnNames 和ColumName 类通常通过实现对最终用户隐藏,但它们仍然存在。
我用BoUML来画图。
【讨论】: