用约束定义属性的多重性

Defining multiplicity of attribute with constraint

我在 UML 中有 2 个 类,现在需要为这部分创建一个约束 - attribute1:String 在 class1 中,attribute2:int 在 class2 中,[=29 之间的连接=]是泛化——可以改成关联。

我需要写这个

if attribute1 contains 'First year', then attribute2 have multiplicity [1..2], else if attribute1 contains 'Second year', then attribute2 have multiplicity [3..4], and so on.

我知道 attribute1 可以采用的所有值都定义为枚举(12 个值,但如果需要条件则只有 4 个,因为每 3 个在开始时都有相同的文本部分)。 如果它很重要,我将在企业架构师中创建 UML。 这是类

的照片

我认为您需要用 Class2 下的显式子 class 替换枚举。然后每个 class 可以重新定义 attribute2 的多重性。虽然您可以在 OCL 中表达关于枚举的这一点,但很少有人会理解它。

有几种建模方法

  1. 限制关联

这是最简单、最明显的解决方案。将描述逻辑的约束放在大括号 {} 和 link 中的注释符号中。约束可以有任何形式,例如自然语言或形式语言,如 OCL 请注意,在这种情况下,约束的多重性范围为 1 到每个枚举值的所有可能值的可实现最大值。

缺点是信息是纯文本的,可能难以理解。

  1. 创建子classes(Jim L. 在他的回答中早先提出的解决方案)

Subclass 可以重新定义一个属性,例如改变多重性。在父级别上,class 将具有可实现的最大值的多重性,而每个 "year specific" 子 class 将具有当年的多重性匹配要求。 您还需要为每个 subclasses 建模一个约束,定义哪些枚举值可用于该特定 subclass.

此解决方案的缺点是,当您有可能从一年更改为另一年时,这将不是简单的属性更改,而是将一个子类型对象完全替换为另一个具有不同子类型的对象class 作为一种类型。

  1. 作为变量的多重性

这个想法是你处理可能值和相关多重性之间的映射逻辑,并且在关联时你使用该映射的属性而不是特定数字来表示多重性。

这种方法构建了一堆可能的详细解决方案,但我将它们组合在一起,因为它们都遵循相同的方法,只是在如何处理多重值方面略有不同。我将仅给出一个详细的解决方案示例(如果有人问,我将提供更多示例)

这里的解决方案之一是使用数据类型而不是枚举。数据类型在其结构中将有一个名称(仍然可以使用枚举作为基础)和两个值(较低和较高的多重值)。然后您的 attribute1 将属于该数据类型,并且您的多重性将引用 attribute1 及其特定属性。 例如,您的日期类型可能包含属性名称、minM 和 maxM,然后在属性上您将具有多重性 minM..maxM.

当然,您需要添加约束以确保 {0<=minM<=maxM} 数据类型,并且最好在文档中的某处为数据类型指定一组可能的值,例如table.

该解决方案的一个缺点是特定值与其多重性限制之间的关系没有直接显示在图表上。然而,这与解决方案的更强灵活性相平衡。

  1. 作为公式的多重性

如果之间有一个简单的逻辑,例如。年份和相关元素的数量可以写成一个公式这样的公式也可以用在多重性中。如果您将枚举拆分为两个单独的数字属性,这将特别有用(嘿,您有一个 class,选择时您仍然可以使用枚举,只需将其映射到 class 内!)。我将在我的例子中做出这个假设。

假设您有两个属性而不是 attribute1:yearNo 和 yearType。此外,可以说在第一年你可以在你的 class1 对象中有 1 或 2 个 class2 对象,在第二年你有 3 或 4,依此类推。一般来说,你在第 n 年有 2n-1 到 2n 个元素,所以你的多重性将是 2*yearType-1..2*yearType

这种方法的一个缺点是只有背后有公式才可能。

补充说明:

  • 我相信解决方案 4 中提到的拆分属性 1 是一个很好的解决方案,无论您选择哪种解决方案。
  • 泛化没有多重性。这种类型的关系表明 subclass 的对象与超类型的对象处于同一类型。我认为你不应该在这里使用这种类型的关系。很可能您正在考虑 shared/composite 聚合而不是泛化(但它有一个不同的箭头 - 菱形,而不是三角形。当然,它可以很安全地替换为关联。
  • 不要使用与枚举的关联(通常与数据类型关联)。如果您将属性作为文本属性放在 class 中,link 它通过依赖项(带空心箭头的虚线)具有类型。对于枚举(一般数据类型),这是唯一的关系。对于作为属性类型的普通 classes,您可以将内联属性与(图形显示的)关联(使用角色名称以使其完全可替换)交换。