2016-01-20 59 views
3

我想移植一個遺留數據格式,它包含與Eclipse Modeling Framework(EMF)Ecore類似的概念:包含具有不同數據類型和默認值的參數的元素。Ecore和OCL中派生的屬性可以被持久化並且派生被禁用嗎?

一個定製的工具可讓您通過一個奇特的基於表格的GUI編輯這些模型實例。

此外,參數的一個共同特徵是可以添加推導規則,該參數指定自動從其他參數計算參數值。這似乎也類似於Ecore派生的屬性,可以通過Java代碼或OCLinEcore實現。

但是,傳統格式中參數的自動派生是可選的。即用戶可以始終選擇這樣的派生參數並選擇他或她想要手動輸入值。因此,即使導出的參數值也不是瞬態的,但始終保持不變,包括參數處於「自動」模式還是「手動」模式。

在Ecore中是否有任何方式(包括像OCLinEcore這樣的擴展)來持久化派生屬性並在運行時選擇性地/暫時地啓用/禁用派生?

解決方法可能不是使用Ecore的派生屬性功能,而是手動在客戶端代碼中實現可選的派生。但是,可選派生規則的聲明不是標準方式。任何方式重用OCLinEcore或類似?

回答

2

這裏是我怎麼做,在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/oclinecore爲好。 我堅持參數的派生值,但如果我喜歡通過更改布爾參數的值,我總是可以手動更改它。然後,我爲任何我需要的類「實現」這個接口,所以我在全局中擁有這個特性。

+0

感謝您採用這種方法。我對Xcore並不太熟悉:'uid_generated'是唯一的瞬態屬性,而'uid'和'uid_derived'會被持久化嗎? generateUUID是否會爲每次調用返回不同的值,因此您想要在生成後存儲一個值?所以我猜想當我的值可以確定性地產生時,我可以省略'_derived'持久屬性。 – Hauke

+0

是的,'uid_generated'被派生出來,並且可以被視爲每次訪問此類的實例時調用的函數。 'uid'和'uid_derived'只是這個類的普通屬性。是的,'generateUUID()'函數每次調用都會爲您提供新的ID,因此您可以省略'uid'' uid_derived'之外的一個屬性。只需安裝xcore(也許你已經在Eclipse中安裝了它)並嘗試它!將xcore轉換爲ecore(以及後來的oclinecore)非常簡單。 – Piotr