是否可以在 Ecore 和 OCL 中保留派生属性并禁用派生?

Can derived attributes be persisted and derivation disabled in Ecore and OCL?

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

定制工具让您可以通过基于 table 的奇特 GUI 编辑此类模型实例。

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

但是,传统格式参数的自动派生是可选的。 IE。用户总是可以 select 这样的派生参数和 select 他或她想要手动输入的值。因此,即使派生的参数值也不是瞬态的,而是始终存在的,包括参数处于 "auto" 或 "manual" 模式的状态。

在 Ecore(包括像 OCLinEcore 这样的扩展)中有什么方法可以在运行时持久化派生属性并 selectively/temporarily enable/disable 派生?

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

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

我坚持参数的派生值,但我总是可以通过更改布尔参数的值手动更改它(如果我愿意)。然后,我为我需要的任何 class 实现这个接口,所以我在全球范围内拥有这个功能。

我不相信这是直接可能的。问题是您有两个可能的值:manual 和 derived,它们可能是相同的。如果派生不持久化就容易了。但是derived是persisted怎么知道哪个是master

在 EMF 属性视图中出现了类似的问题,在该视图中最好区分具有 greyed/not-greyed 背景的计算值和显式值。例如是计算的或显式的 GenModel 编辑插件 ID。更糟糕的是空白 属性 默认文字未设置或明确为空白。

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