嗨,我们目前正在使用MagicDraw 17.0。我们遇到了以下问题。我们想验证对象图中的对象是否有任何连接的对象。OCL 2.0约束条件
例如,如果对象“man”有另一个对象“地址”的链接。自动取款机。我们正在尝试这个
self.address->isEmpty()
其中address是adressobject在连接两个对象的关联中的角色,约束放在man上。不工作。
嗨,我们目前正在使用MagicDraw 17.0。我们遇到了以下问题。我们想验证对象图中的对象是否有任何连接的对象。OCL 2.0约束条件
例如,如果对象“man”有另一个对象“地址”的链接。自动取款机。我们正在尝试这个
self.address->isEmpty()
其中address是adressobject在连接两个对象的关联中的角色,约束放在man上。不工作。
尝试oclIsUndefined()
(见OCL规范2.3.1第16页)
这不是直接回答你的问题,但希望会提供关于你问的问题更深入的了解:
如果对象(比如Man的一个实例)没有与另一个对象(比如说Address的实例)的链接(比如说地址),遍历self.address
并且自己是一个人,对于自我来说,根本就没有定义! (请注意,地址是参考,地址是类型)。
看起来oclIsUndefined()
的操作可以用于这个目的(就像gefei提到的那样),所以大概self.address -> oclIsUndefined()
会适合你!
第16页的OCL规范的说:
...有用于测试一个明确的操作如果 表达式的值是不确定的。 oclIsUndefined()是OclAny 上的一个操作,如果其参数为null或invalid,则返回True,否则返回False 。
但还有另一种观点:
self.address
代表的集合。所以isEmpty
函数应该返回true,如果它是空的! (这是你可能会想到来使用self.address->isEmpty
的方式)关于IsEmpty函数的OCL规范的
第175页说:
的isEmpty():布尔
是自空集?
post: result = (self->size() = 0)
注:空值>的isEmpty()返回“真”在凭借 的隐式转换,从零到袋{}
但是,正如你所提到的isEmpty不是为你工作!
我要离开这到OCL专家评论区别?但可能第一种方法会有所帮助!
希望这会有所帮助!
我试着按照你的建议,但是当我在'self'或'OclAny'上调用它时,总会出现“'NXO不可执行的”错误。你能举一个完整的例子吗?这些规范并没有很清楚地说明“oclIsUndefined()”的用法。我知道“OclAny是AnyType的唯一实例”,并且您将传递属性('self.address')作为'oclIsUndefined()'的唯一参数。你在哪个实体上调用该操作? – observer 2013-01-29 13:28:49