Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RationalSoftwareArchitect8中UML概要文件上的OCL约束_Uml_Ocl - Fatal编程技术网

RationalSoftwareArchitect8中UML概要文件上的OCL约束

RationalSoftwareArchitect8中UML概要文件上的OCL约束,uml,ocl,Uml,Ocl,我是RationalSoftwareArchitect8和OCL的新手。我定义了一个由两个原型组成的概要文件,一个应用于类,另一个应用于关联。有关更多详细信息,请参见图 现在,我想用OCL表达一个约束:如果一个类有这个原型,那么我希望所有连接到这个类的关联都有这个RPAssignment原型。值得注意的是,带有权限的原型类将没有属性或操作 我创建了一个小示例来测试我的OCL约束。这是由RSA生成的图表以及相应xmi文件的相关位 <packageImport xmi:id="_dN

我是RationalSoftwareArchitect8和OCL的新手。我定义了一个由两个原型组成的概要文件,一个应用于类,另一个应用于关联。有关更多详细信息,请参见图

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

我创建了一个小示例来测试我的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)
self.base_Class.getAllAttributes()->forAll(att:Property | att.association.getAppliedStoreType('testProfile::RPAssignment')null)

我是否遗漏了一些琐碎的东西?

您不能添加约束来创建原型。您只能在关联上手动创建原型。这些约束应该用于另一个上下文中,而不是用于创建原型。 这是我参加这次讨论的钱

您引用的原型不是合法的原型名称。为了一个合法的名字,我将使用XXX

像下面这样的东西可能在纸莎草纸中起作用。然而,它依赖于我对UML规范中关于原型导航的非常有限的提示的推断。OCL规范在这个意义上根本没有提到原型

上下文XXX inv:base\u Class.allAttributes()->forAll(association null表示association.extension\u RPAssignment->notEmpty())

对于简单属性,NB关联为null,导航null将导致无效计算


如果您的扩展分配最多是一个,那么可以使用null而不是->notEmpty()。

我不想在这里创建原型。我想创建一个OCL查询,该查询将检查与上下文类关联的所有类是否都是使用
«Permission»
构造的。可导航性是无关的。无论适航性声明如何,所有关联在OCL中都是双向可导航的。在使用隐式角色名称和消除歧义方面,您可能需要很聪明,但OCL中有完全的导航能力;但是,您的工具可能不支持所有的暗角。getAllAttributes()和GetAppliedStoreOtypes()的使用不是OCL。它们是EclipseUML项目的专有JavaAPI,可在EclipseOCL表达式中访问,以解决原型导航规范不充分的问题。如果您使用Papyrus,您可以使用基于Pivot的OCL,它为OCL规范中的许多问题提供了原型解决方案。