2012-02-23 74 views
2

我今天和一位教授討論了OCL。他認爲不變量,後置條件和前置條件在規定的功能範圍內是允許的。OCL - 需要澄清不變量?

我的軟件開發人員讓我想要相信OCL將允許將一般約束放在模型上。像這個模型中的Person類的所有對象都有男性的性別約束,或者所有類車的對象都有四個車輪似乎不可思議有用,並且使用對我的模型的聲明式範例感覺是對的。

我認爲它像物理世界一樣。如果我們將螺母擰在螺栓上,則允許螺母以一種方式安裝。這些都是物理限制,無論我們如何將螺母擰在螺栓上而採取的行動,都不能被違反,或者我們已經以基本方式使我們的模型失效。

他的觀點是,在OCL中我們只能在提供上下文的函數中定義約束條件(前後條件/不變量)。

有人可以幫我解決這個問題嗎?

回答

2

不知道我是否真的明白函數的上下文是什麼意思。但是,OCL不僅僅是不變量/前/後條件。

從OMG OCL 2.3.1規範[1] 7.2.1 何處使用OCL

OCL可用於多種不同的目的的:

  • 作爲查詢語言,
  • 在類模型指定的類和類型不變,
  • 指定類型不變的刻板印象,
  • 描述的操作和方法前置和後置條件,
  • 描述逆天,
  • 指定信息和行動目標(套),
  • 指定的操作限制,
  • 指定UML模型上任何表達式的屬性的派生規則。

所以,換句話說,你是對的,你可以在你所描述的模型類上有一個約束(不確定你的意思是一般意義)。

[1] http://www.omg.org/spec/OCL/2.3.1

2

你絕對可以在類定義的約束,如你所說。儘管如此,你需要澄清你的意思,因爲你(和你的教授)可能誤解了對方。

OCL有一個名爲context的關鍵字,它基本上可以指任何UML分類器(類型,類,接口,關聯,數據類型,...)。

你提到的例子實際上是OCL,以解決最簡單,通過簡單的表現形式,例如:

背景的人INV: 自我。年齡< = 120

上下文人INV: self.countChildren()< = 20

0

如前所述,一個約束,可以放在任何UML命名空間。然而,不變量的語義只是爲類定義的。在包上定義的不變量是未指定的,這是不幸的,因爲它要求將通用事實(在allInstances())上的定義與某些類的每個實例相關聯,潛在地導致在幼稚OCL工具中進行冗餘重新評估。期待在未來的OCL中包含包不變量。