我在UML中有2个类,现在需要为这个部分创建一个约束 - attribute1:String在class1中,而attribute2:int在class2中,类之间的连接是泛化 - 可以更改为关联。
我需要以某种方式写这个
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。 这是课程图片
或
答案 0 :(得分:1)
我认为你需要用Class2
下的显式子类替换枚举。然后,每个类可以重新定义attribute2
的多重性。虽然您可以在OCL中对枚举表达这一点,但很少有人会理解它。
答案 1 :(得分:1)
有几种方法来模拟
这是一个最简单,最明显的解决方案。将描述逻辑的约束放在大括号{}
中的注释符号中,并将其链接到关联。约束可以具有任何形式,例如自然语言或OCL等形式语言
请注意,在这种情况下,约束的多重性范围从1到每个枚举值的所有可能值的可实现最大值。
缺点是信息纯属文本,可能难以理解。
子类可以重新定义属性,例如改变多样性。在父级别上,类具有最大可实现最大值的多重性,而每个“特定年份”子类将具有该年的多重性匹配要求。 无论如何,您还需要为每个子类建模一个约束,以定义哪个枚举值可用于该特定子类。
这个解决方案的缺点是,当你有可能从一年改为另一年时,它不是一个简单的属性改变,而是一个子类型对象的整体替换为另一个具有不同子类的子对象。类型。
这个想法是你处理可能值和相关多重性之间的映射逻辑,并且在关联时,你使用该映射的属性而不是特定数字来表示多重性。
这种方法构建了一堆可能的详细解决方案,但我将它们组合在一起,因为它们都遵循相同的方法,只是在如何处理多重性值方面略有不同。我将只提供一个详细的解决方案示例(如果有人问,请更多关注)
这里的解决方案之一是使用数据类型而不是枚举。数据类型在其结构中将具有名称(仍可以使用枚举作为基础)和两个值(较低和较高的多重性值)。然后你的attribute1将是该数据类型,你的多重性将引用attribute1及其特定属性。
您的日期类型可能包含属性名称,minM和maxM,然后在属性上,您将具有多重性minM..maxM
。
当然,您需要添加约束以确保数据类型为{0<=minM<=maxM}
,并且最好在文档中的某处为数据类型指定一组可能的值,例如:一张桌子。
该解决方案的缺点是特定值与其多重性限制之间的关系不直接在图上。然而,通过更强大的解决方案灵活性来平衡这一点。
如果在...之间存在简单的逻辑年份和可以写成公式的相关元素的数量这样的公式也可以用于多重性。如果将枚举分成两个单独的数字属性(嘿,你有一个类,在选择时你仍然可以使用枚举,只需将它映射到类中!),这一点尤其有用。我将在我的例子中做出这个假设。
假设您使用两个属性而不是attribute1:yearNo和yearType。此外,我们可以说,在第一年,你可以在你的1级对象中拥有1或2个class2对象,第二年你有3或4个,依此类推。一般来说,你有第n年2n-1到2n元素,所以你的多样性将是2*yearType-1..2*yearType
这种方法的一个缺点是只有在后面有一个公式时才有可能。
补充说明: