有几种方法可以建模
- 限制关联
这是一个最简单和最明显的解决方案。将描述逻辑的约束放在大括号中的注释符号中{}
,并将其链接到关联。约束可以有任何形式,例如自然语言或像 OCL 这样的正式语言 注意,在这种情况下,约束的多重性范围从 1 到每个枚举值的所有可能值的可实现最大值。
缺点是信息是纯文本的,可能难以理解。
- 创建子类(Jim L. 在他的回答中早先提出的解决方案)
子类可以重新定义一个属性,例如改变多重性。在父级别上,该类将具有最大可实现最大值的多重性,而每个“特定年份”子类将具有该年的多重性匹配要求。无论如何,您还需要为每个子类建模一个约束,定义哪些枚举值可用于该特定子类。
此解决方案的缺点是,当您有可能从一年更改为另一年时,这不是简单的属性更改,而是将一个子类型对象完全替换为另一个具有不同子类作为类型的对象。
- 多重性作为变量
这个想法是您处理可能值和相关多重性之间的映射逻辑,并且在关联时,您使用该映射的属性而不是特定数字来表示多重性。
这种方法构建了一堆可能的详细解决方案,但我将它们组合在一起,因为它们都遵循相同的方法,只是在如何处理多重性值方面略有不同。我将仅提供一个详细的解决方案示例(如果有人问,请遵循更多)
这里的解决方案之一是使用数据类型而不是枚举。数据类型在其结构中将有一个名称(仍然可以使用枚举作为基础)和两个值(较低和较高的多重性值)。然后你的属性 1 将属于该数据类型,并且你的多重性将引用属性 1 及其特定属性。例如,您的日期类型可能包含属性名称、 minM 和 maxM ,然后在属性上您将拥有 multiplicity minM..maxM
。
当然,您需要添加约束以确保{0<=minM<=maxM}
数据类型上的约束,并且最好在文档中的某处为数据类型指定一组可能的值,例如表格。
该解决方案的一个缺点是特定值与其多重性限制之间的关系不直接在图表上。然而,这与解决方案的更强灵活性相平衡。
- 多重性作为一个公式
如果在例如年份和可以写成公式的相关元素的数量之间存在简单的逻辑,那么这样的公式也可以在多重性中使用。如果您将枚举拆分为两个单独的数字属性,这尤其有用(嘿,您有一个类,选择时您仍然可以使用枚举,只需将其映射到类中!)。我将在我的示例中做出这个假设。
假设您有两个属性而不是attribute1:yearNo 和yearType。此外,假设在第一年,您的 1 类对象中可以有 1 或 2 个 2 类对象,在第二年,您可以有 3 或 4 个,依此类推。一般来说,你在第 n 年有 2n-1 到 2n 个元素,所以你的多重性将是2*yearType-1..2*yearType
这种方法的一个缺点是只有在后面有公式的情况下才有可能。
补充说明:
- 我相信解决方案 4 中提到的属性 1 拆分是一个很好的解决方案,无论您选择哪种解决方案。
- 泛化没有多重性。这种类型的关系表明子类的对象与超类的对象具有相同的类型。在我看来,你不应该在这里使用这种类型的关系。很可能您正在考虑共享/复合聚合而不是泛化(但它有一个不同的箭头 - 菱形,而不是三角形。当然它可以很安全地替换为关联。
- 不要使用与 Enumeration 的关联(通常与数据类型关联)。如果将属性作为文本属性放入类中,请通过依赖项将其与类型链接(带空心箭头的虚线)。对于枚举(一般的数据类型),这是唯一的关系。对于作为属性类型的普通类,您可以使用(以图形方式显示的)关联(使用角色名称使其完全可替换)交换内联属性。