【问题标题】:OCL 2.0 ConstraintsOCL 2.0 约束
【发布时间】:2012-07-17 13:22:53
【问题描述】:

您好,我们目前正在使用 MagicDraw 17.0。我们遇到了以下问题。我们想验证对象图中的对象是否有任何连接的对象。

例如,如果一个对象“man”具有到另一个对象“address”的链接。自动取款机。我们正在尝试这个

self.address->isEmpty() 

其中地址是地址对象在连接两个对象的关联中的角色,并且约束放在人身上。没用。

【问题讨论】:

    标签: constraints ocl object-diagram magic-draw


    【解决方案1】:

    这不是您的问题的直接答案,但希望能提供有关您所问问题的更多见解:

    如果一个对象(比如 Man 的实例)没有链接(比如地址)到另一个对象(比如 Address 的实例),遍历 self.address 并且 self 是一个 Man,对于 self 来说完全是未定义的! (注意地址是引用,地址是类型)。

    看来oclIsUndefined() 操作可以用于此目的(正如格非所说),所以self.address -> oclIsUndefined() 可能对你有用!

    OCL 规范的第 16 页说:

    ...有一个明确的操作来测试一个值是否 表达式未定义。 oclIsUndefined() 是对 OclAny 的操作 如果其参数为空或无效,则结果为 True 和 False 否则。

    但是还有另外一个视角:

    self.address 代表一个集合。所以isEmpty函数如果为空应该返回true! (这可能是您使用self.address->isEmpty 的方式)

    OCL 规范中关于 isEmpty 函数的第 175 页说:

    isEmpty() : 布尔值

    self 是空集合吗?

      post: result = (self->size() = 0 ) 
    

    注意:null->isEmpty() 返回 'true' 是因为 从 null 到 Bag 的隐式转换{}

    但正如你所说,isEmpty 不适合你!

    我要把这个留给 OCL 专家来评论差异?但可能第一种方法会有所帮助!

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      尝试oclIsUndefined()(参见 OCL 规范 2.3.1 第 16 页)

      【讨论】:

      • 我尝试按照您的建议进行操作,但在 selfOclAny 上调用它时总是以“NXO non-executable”错误告终。你能举一个完整的例子吗?规范没有非常清楚地说明oclIsUndefined() 的使用。我知道“OclAny 是 AnyType 的唯一实例”,并且您会将属性 (self.address) 作为 oclIsUndefined() 的唯一参数传递。您在哪个实体上调用该操作?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2011-05-26
      • 2020-09-26
      相关资源
      最近更新 更多