我希望移植遗留数据格式,其中包含类似于Eclipse Modeling Framework(EMF)Ecore:带参数的元素的概念,这些元素具有不同的数据类型和默认值。
定制工具允许您通过基于表格的精美GUI编辑此类模型实例。
此外,参数的一个共同特征是可以添加派生规则,它指定从其他参数自动计算参数值。这似乎与Ecore派生的属性类似,可以通过Java代码或OCLinEcore实现。
但是,传统格式的参数的自动派生是可选的。即用户总是可以选择这样的派生参数并选择他或她想要手动输入值。因此,即使派生的参数值也不是瞬态的,但总是保持不变,包括参数处于“自动”或“手动”模式的状态。
Ecore(包括像OCLinEcore这样的扩展)是否有任何方法可以持久保存派生属性并在运行时选择性/临时启用/禁用派生?
解决方法可能不是使用Ecore的派生属性功能,而是手动实现客户端代码中的可选派生。但是,可选派生规则的声明将不是标准方式。有没有办法重用OCLinEcore或类似的?
答案 0 :(得分: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中轻松实现它。
我持久保存参数的派生值,但我总是可以通过更改布尔参数的值手动更改它(如果我喜欢)。然后,我为我需要的任何类实现了这个接口,所以我在全球范围内拥有这个功能。
答案 1 :(得分:0)
我不相信它是直接可能的。问题是你有两个可能的值:manual和derived,它们可能是相同的。如果派生不容易持久化。但如果导出是持久的,你怎么知道哪个是主人。
在EMF属性视图中出现了类似的问题,在这里可以区分具有灰色/不灰色背景的计算值和显式值。例如是计算或显式的GenModel编辑插件ID。更糟糕的是一个空白的属性default-literal unset或显式空白。
在元模型中有一个额外的主标志后,它应该相对容易。在那之前,你可能有一个大多数时候都能运行的解决方案,但其他时候可能会让人感到困惑。