【问题标题】:Can derived attributes be persisted and derivation disabled in Ecore and OCL?可以在 Ecore 和 OCL 中保留派生属性并禁用派生吗?
【发布时间】:2016-04-26 11:25:27
【问题描述】:

我想移植一种遗留数据格式,它由类似于 Eclipse 建模框架 (EMF) Ecore 的概念组成:具有不同数据类型和默认值的参数的元素。

定制工具让您可以通过精美的基于表格的 GUI 编辑此类模型实例。

此外,Parameters 的一个共同特点是可以添加 Derivation Rule,该规则指定 Parameter 值自动从其他参数计算。这似乎也类似于可以由 Java 代码或 OCLinEcore 实现的 Ecore 派生属性。

但是,传统格式的参数的自动派生是可选的。 IE。用户总是可以选择这样的派生参数并选择他或她想要手动输入值。因此,即使派生的参数值也不是瞬态的,而是始终保持不变,包括参数处于“自动”还是“手动”模式的状态。

在 Ecore(包括 OCLinEcore 之类的扩展)中是否有任何方法可以保留派生属性并在运行时选择性/临时启用/禁用派生?

解决方法可能是不使用 Ecore 的派生属性功能,而是在客户端代码中手动实现可选派生。但是,可选派生规则的声明将不是标准方式。有什么方法可以重用 OCLinEcore 或类似的东西?

【问题讨论】:

    标签: eclipse-emf emf eclipse-emf-ecore ocl ecore


    【解决方案1】:

    这是我在Xcore 中的操作方法:

    interface Identifier {
        id String uid
        boolean derive_enabled = "true"
        unsettable String uid_derived
    
        readonly String uid_generated get {  // this is the 'derived' parameter
            if (uid_derived == null || uid_derived.isEmpty) {
                uid_derived  = EcoreUtil.generateUUID().toString
            }
            if (derive_enabled) {
                uid = uid_derived
            }
            return uid
        }
    }
    

    您也可以在 Ecore/OCL-in-Ecore 中轻松实现它。

    我保留参数的派生值,但我总是可以通过更改布尔参数的值来手动更改它(如果我喜欢的话)。然后,我为我需要的任何类实现此接口,因此我在全局范围内拥有此功能。

    【讨论】:

    • 感谢这种方法。我对 Xcore 不太熟悉:'uid_generated' 是唯一的瞬态属性,而 'uid' 和 'uid_derived' 都将保持不变,这对吗? generateUUID 是否会为每次调用返回不同的值,因此您想在生成后存储一个值?所以我想当我的值可以确定性地生成时,我可以省略'_derived'持久属性。
    • 是的,uid_generated 是派生的,可以视为每次访问此类实例时调用的函数。 uiduid_derived 只是类的普通属性。是的,generateUUID() 函数每次调用都会为您提供新的 id,因此您可以省略 uid uid_derived 中的一个属性。只需安装 xcore(也许您已经在 Eclipse 中安装了它?)并尝试一下!将 xcore 转换为 ecore(然后转换为 oclinecore)非常容易。
    【解决方案2】:

    我不相信这是直接可能的。问题是您有两个可能的值:手动和派生,它们可能是相同的。如果派生不容易持久化。但是如果派生是持久的,你怎么知道哪个是主人。

    类似的问题出现在 EMF 属性视图中,可以很好地区分具有灰色/非灰色背景的计算值和显式值。例如是计算的或显式的 GenModel Edit Plugin Id。更糟糕的是空白属性默认文字未设置或显式空白。

    一旦您的元模型中有一个额外的主标志,它应该相对容易。在那之前,您可能有一个大多数时候都有效的解决方案,但其他时候可能会令人困惑。

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多