通过搜索,我发现在UML中,聚合(假设它被正确使用)可用于表示类中的属性。
(假设专栏可以独立)
然后,使用这样的例子,如果我想用map替换属性:Column []来表示列的名称,那么使用如下所示的关联类是否正确? (如果我不愿意将Column类中的列名作为属性)
答案 0 :(得分:1)
关联类与简单关联一起使用。它们具有m-1-1-n多重性。共享聚合(如您所用)没有定义的语义(我建议不要使用它,除非您有特定于域的文档用途)。将预期的多重性放在关联的任何一侧更好。
关联类连接两个类,添加属性和/或操作。您的示例是“非常规的”,因为表/列具有简单的关系,不需要关联类。一个典型的例子是学生/讲座关系,您可以在其中放置一个关联课程来记录考试成绩,时间等。
答案 1 :(得分:0)
是的,我认为这是一种有效的建模方式,您可以使用某种关键字符串来识别此Table
的{{1}}。
如果有许多可能的实现,使用Map
就是一个,所以它不是真正的等于。
使用关联类进行建模的优势在于您的模型保持在更抽象的功能级别,并省略了实现细节。
顺便说一句。对于Table
和Column
之间的关联,我会使用组合而不是聚合,因为存在明显强烈的所有权关系和生活 - 两者之间的循环依赖。
答案 2 :(得分:0)
如果您要用地图替换属性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条规定:
不能以与相同类型的非模板元素相同的方式使用模板。模板元素只能用于生成 bound 元素,或作为其他模板规范的一部分。
根据第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既是Association也是Class。
ColumnName
是AssociationClass,表示String
和Column
类的实例之间的链接。我们使用图11.35中的11.5.5节表示法。
最后,Table
和ColumnNames
类之间的方向组成关联告诉我们Table
的每个实例都拥有ColumnNames
的实例,即一组列名。 / p>
请注意,尽管ColumnNames
和ColumName
类通常由实现对最终用户隐藏,但它们仍然存在。
我用BoUML绘制了图。