【发布时间】: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 规范中的许多问题提供原型解决方案。