使用约束

时间:2016-10-23 11:40:02

标签: constraints uml ocl

我在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。 这是课程图片

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

有几种方法来模拟

  1. 对关联设置约束
  2. 这是一个最简单,最明显的解决方案。将描述逻辑的约束放在大括号{}中的注释符号中,并将其链接到关联。约束可以具有任何形式,例如自然语言或OCL等形式语言 请注意,在这种情况下,约束的多重性范围从1到每个枚举值的所有可能值的可实现最大值。

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

    1. 创建子类(Jim L.在他的回答中提出的解决方案)
    2. 子类可以重新定义属性,例如改变多样性。在父级别上,类具有最大可实现最大值的多重性,而每个“特定年份”子类将具有该年的多重性匹配要求。 无论如何,您还需要为每个子类建模一个约束,以定义哪个枚举值可用于该特定子类。

      这个解决方案的缺点是,当你有可能从一年改为另一年时,它不是一个简单的属性改变,而是一个子类型对象的整体替换为另一个具有不同子类的子对象。类型。

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

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

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

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

        该解决方案的缺点是特定值与其多重性限制之间的关系不直接在图上。然而,通过更强大的解决方案灵活性来平衡这一点。

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

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

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

          补充说明:

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