【问题标题】:OCL constraint on a UML profile in Rational Software Architect 8Rational Software Architect 8 中 UML 配置文件的 OCL 约束
【发布时间】:2011-05-26 19:57:10
【问题描述】:

我是 Rational Software Architect 8 和 OCL 的新手。我定义了一个包含两个原型的配置文件,一个应用于类,另一个应用于关联。详情请看图。

现在,我想使用 OCL 表达一个约束:如果一个类具有 构造型,那么我希望连接到该类的所有关联都具有 RPAssignment 构造型。值得注意的是,使用 Permission 构造型的类将没有属性或操作。

我创建了一个小示例来测试我的 OCL 约束。这是由 RSA 生成的图表以及相应 xmi 文件的相关位。

    <packageImport xmi:id="_dNGWEwhgEeCzvt5Jj9Wjpg">

  <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>

</packageImport>

<packagedElement xmi:type="uml:Class" xmi:id="_sUoV4AhgEeCzvt5Jj9Wjpg" name="ProfileClass"/>

<packagedElement xmi:type="uml:Class" xmi:id="_LkpUwAkoEeCs_vLJf1t9eg" name="Perm1">

  <ownedAttribute xmi:id="_PjkJ8Qk_EeCD2J3jYOsnVw" name="clas" visibility="private" type="_OWO0IAk_EeCD2J3jYOsnVw" association="_PjbAAAk_EeCD2J3jYOsnVw">

    <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_PjkJ8wk_EeCD2J3jYOsnVw" value="1"/>

    <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_PjkJ8gk_EeCD2J3jYOsnVw" value="1"/>

  </ownedAttribute>

</packagedElement>

<packagedElement xmi:type="uml:Class" xmi:id="_OWO0IAk_EeCD2J3jYOsnVw" name="class1">

  <ownedAttribute xmi:id="_PjbAAQk_EeCD2J3jYOsnVw" name="perm1" visibility="private" type="_LkpUwAkoEeCs_vLJf1t9eg" association="_PjbAAAk_EeCD2J3jYOsnVw">

    <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_PjkJ8Ak_EeCD2J3jYOsnVw" value="1"/>

    <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_PjbAAgk_EeCD2J3jYOsnVw" value="1"/>

  </ownedAttribute>

</packagedElement>

<packagedElement xmi:type="uml:Association" xmi:id="_PjbAAAk_EeCD2J3jYOsnVw" name="gets" memberEnd="_PjbAAQk_EeCD2J3jYOsnVw _PjkJ8Qk_EeCD2J3jYOsnVw"/>

在我看来,关联结束,当它被标记为可导航时,是一个属性,就像一个属性。我在 Permission 刻板印象类(和一些变体)上尝试了以下约束,但它似乎无法正常工作。您可能已经注意到,在我创建的示例中,关联没有所需的构造型,因此验证应该失败。但是,它成功了。

self.base_Class.getAllAttributes()->forAll(att:Property | att.association.getAppliedStereotype('testProfile::RPAssignment') <> null)

我在这里错过了一些琐碎的事情吗?

【问题讨论】:

  • 可导航性无关紧要。在 OCL 中,所有关联都可以双向导航,而不管导航性声明如何。在使用隐式角色名称和消除歧义方面,您可能需要很聪明,但是 OCL 中提供了完全的导航功能;不过,您的工具可能不支持所有的暗角。
  • 使用 getAllAttributes() 和 getAppliedStereotypes() 不是 OCL。它们是 Eclipse UML 项目的专有 Java API,可在 Eclipse OCL 表达式中访问,以解决对原型导航规范不足的支持不足的问题。如果您使用 Papyrus,则可以使用基于 Pivot 的 OCL,它为 OCL 规范中的许多问题提供原型解决方案。

标签: uml ocl


【解决方案1】:

您不能添加约束来创建构造型。您只能手动创建关联的刻板印象。约束应该用于另一个上下文,而不是用于创建原型。 这是我参加这次讨论的一分钱。

【讨论】:

  • 我不想在这里创建一个刻板印象。我想创建一个 OCL 查询,该查询将检查与上下文类关联的所有类是否都使用«Permission» 进行原型化。
【解决方案2】:

您引用了不是合法的原型名称的 原型。我将使用 XXX 作为合法名称。

以下内容可能在 Papyrus 中有效。然而,它依赖于我对 UML 规范中关于原型导航的非常有限的提示的推断。在这个意义上,OCL 规范根本没有提到刻板印象。

上下文 XXX inv: base_Class.allAttributes()->forAll(association null 暗示着 association.extension_RPAssignment->notEmpty())

对于简单属性,NB 关联为 null,导航该 null 将导致无效的评估。

如果您的 extension_RPAssignment 最多为 1,则可以使用 null 而不是 ->notEmpty()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多