4

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

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

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

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

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

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

4

2 回答 2

4

这是我在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 中轻松实现它。

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

于 2016-02-24T09:42:41.197 回答
0

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

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

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

于 2018-05-07T11:23:50.433 回答