MetaModelEngine 約束和驗證

2021-09-22 03:39:11 字數 2705 閱讀 8793

在前一篇metamodelenginebolg中介紹了介面表示驗證在我們開發中經常遇到,例如在強型別語言中,當我們敲錯乙個關鍵字,或者語法寫錯,當編譯時就會報出錯誤。約束也很常見,例如主流的程式設計規範都建議使用斷言(seertion),這樣在除錯時它就會對呼叫方法的合法引數值施加顯示約束(如不允許傳入空字串等)。程式語言這樣,對於建模語言呢?

建模中的情況其實也是類似的,它也有必須遵守的語法,例如表示門的類,其寬度和高度必須是浮點型別;我們還可以使用表示式或者指令碼來支援使用者自定義的約束。用語言來表述的模型約束的例子有很多,例如可以是:

約束一般被認為是不變式,也就是說在模型的整個生命期中它的值都是真,或者在設計時(如**生成、儲存)或執行時(如計入借方銀行賬戶)作為一些操作的先決條件或後續條件。在模型中常見的一種約束就是重數:

除了上面說的重數外,為了額外增加一些規則,metaedit+支援幾種預定義規則,它允許我們在relationship、role、port和object之間組合起來定義一些約束,定義介面如下:

約束可以在以下幾種情況中使用:

連線約束:例如,乙個物件在某個特定角色中最多只能出現的次數

物件次數:例如,乙個物件型別在乙個圖形中最能有特定數量的例項

埠約束:例如,在乙個繫結中,乙個特定型別的所有埠必須有同樣的特定屬性

屬性唯一:例如,圖中乙個特定型別的所有物件的特定屬性必須有乙個唯一值

乙個連線約束是定義在object之上的,它限制每個例項可以有之多n次於指定的role或relationship關聯。例如下面限制start物件職能有乙個from角色。當我在start和b物件之間建立關係時,由於start和t有關聯已經存在乙個from角色,所以彈出連線約束錯誤框架

次數限制限制物件例項在乙個圖形**現的次數。乙個典型的示例是在狀態圖中的start狀態,當我拖放第二個start狀態時彈出物件次數限制錯誤

埠約束限制繫結埠屬性值約束,例如signal必須從「out」埠流向「in」。

唯一性約束可以定義乙個物件在乙個圖中所有物件型別的某個屬性不重複,例如alarm的名稱name在乙個圖中不重複,當我加入另乙個alarm物件,並也取名為a時彈出屬性不唯一錯誤

驗證類別指的是在驗證環節,一般可以有以下幾種,這些具體細則還需要在設計時仔細考慮:

裝載模型

開啟儲存

各種選單操作

自定義類別

view source

print?

1[ruleon(typeof(generalization),"color: #0000ff"> firetime=timetofire.toplevelcommit)]internalsealedclasscyclicinheritanceaddrule: addrule

對於視覺化設計器而言,約束可以分為以下兩類:

硬約束:在任何時期都不能違反的強制約束,如乙個形狀元素的寬度必須為有效地數字,這個寬度設定在輸入數字時就要進行及時的驗證

軟約束:使用者在有些時期可以違反,而在另一種情況下又不能違反的約束,例如,模型中所有的元素都要有唯一的名字在更改名稱時不檢查,而在儲存時再驗證;還有比如建立多個屬性時,最後才檢驗屬性名稱是否重複的約束

採用硬約束可以保證使用者不會犯錯誤,所以在任何情況下把約束表達成硬約束。但是實際建模場景中,硬約束會帶來兩個實際應用中的問題:

大多數約束的計算量都不小,所以實時的大量計算驗證可能會帶來效能問題

使用者並不需要在任何時候都一直需要正確的模型。有時我知道模型是錯誤的,但我有其他急的事情要處理,我這時候就希望能儲存錯誤的模型,只是不提交執行而已。

單獨使用硬約束不會帶來最佳的使用者體驗,因為硬約束只是不讓使用者進行任何違反規則的操作,而不是引導使用者進行正確的操作。對重數的一種處理方式就是:將重數的最大值作為硬約束,而把最小值作為軟約束

MetaModelEngine 介面表示

在讀書筆記 visual studio dsl工具特定領域開發指南中介紹過圖形dsl有幾個重要內容必須要定義 域模型 域類和關係 約束 符號 生成 序列化和工具整合。在metamodelengine 域模型定義metamodelengine支援幾何形狀 隔間形狀和泳道三種形狀,具體樣式各自圖形所示 ...

MetaModelEngine 元模型引擎開發思路

本文已挪至 在dsm 使用metaedit 編寫family tree modeling language 中介紹了metaedit 的乙個家族樹模型語言 的元模型引擎metamodelengine的應用思路。我在軟體產品線工程方法 四個主要方法原則 提到產品線帶來的幾個好處 減少成本,快速上市,減...

MetaModelEngine 域模型定義

每乙個dsl的核心都是乙個域模型,它定義了這一語言所代表的各種概念,以及這些概念的屬性和它們之間的關係,在建立dsl每乙個元素時都是使用域模型來描述。域模型還為語言的其他方面的建立提供了基礎 圖形符號 工具箱 資源管理器 屬性視窗 驗證 序列化和部署 生成等的定義。在metamodelengine ...