契約式程式設計

2021-06-18 01:49:47 字數 1571 閱讀 6459

契約是減少大型專案成本的突破性技術。契約由先驗條件、後驗條件、錯誤和不變數等概念組成。契約可以而加到 c++ 中而無需對語言加以改造,但是卻十分笨拙且不一致。

在語言內部支援契約的目的是:

給契約乙個一致的觀感

提供工具支援

使編譯器能夠根據從契約中收集的資訊生成更好的**

易於管理並強制實行契約

處理契約繼承

斷言。 斷言在**內插入乙個可檢查的表示式,這個表示式在正常情況下必須為真:

assert(expression);
c 程式設計師會有似曾相識的感覺。但是與 c 不同的是,函式體內的assert會丟擲assertexception,這個異常可以**獲並處理。如果**必須處理其他**對其的誤用,如果**必須是失敗可證的,捕獲契約違規就很有用,它同樣也是除錯的有力工具。契約先驗條件指出語句執行的先驗條件條件。最典型的用法可能要數驗證函式引數的有效性了。契約後驗條件驗證語句的結果。最典型的用法要數驗證函式返回值得合法性以及它的任何***。語法結構為:
in

out (result)

body

按照定義,如果契約先驗條件被違反,則過程體(body)將受到錯誤的引數。這將丟擲乙個 inexception 異常。如果契約後驗條件被違反,則意味著過程體中有乙個 bug ,將丟擲乙個 outexception 異常。

inout子句都可以被省略。如果過程體帶有有out子句 ,變數result將被宣告並被賦給函式的返回值。例如,我們實現乙個求平方根的函式:

long square_root(long x)

inout (result)

body

in 和 out 中的斷言叫做

契約。其中可以出現任何 d 的語句或者表示式,但是必須要保證這些語句沒有***,並且最終發行版中的**不依賴於這些**的作用。在構建發行版的程式時,這些**將不會包括在其中。

如果函式返回 void,即沒有結果,那麼 out 字句中自然也沒有 result 的宣告。在這種情況下,使用:

void func()

outbody

在 out 語句中,

result 被初始化並設為函式的返回值。

編譯器可以設計為每個 in 和 inout 引數都在in中被引用,並且每個 out 和 inout 引數都在out中被引用。

in-out 語句也可以被用在函式內部,例如,可以用來檢查迴圈的結果:

in

outbody

這個特性目前尚未實現。如果派生類的函式重寫了父類中的乙個函式,那麼它只須滿足基類函式的一條

in 契約。重寫函式

放鬆 了契約。

反過來,所有的 out 契約都必須滿足,所以重寫函式 收緊 了 out 契約。

類的不變數用來指定類中總是為真(除了在執行成員函式時)的特性。它們在

類 中介紹。.

契約式程式設計與防禦式程式設計

事情的來由還要從幾十幾億年前的一次星球大 說起,sorry,背錯台詞了,是從幾天前討論介面返回資料和幾個月前討論課件本地資料結構說起,簡單的說,就是碰到約定好的內容出現異常,是我們在程式中內部作相容處理,還是丟擲去。打個比方,我們要解析一段json,約定這個json的格式,只能是正常格式,或者是空,...

契約式程式設計與防禦式程式設計

事情的來由還要從幾十幾億年前的一次星球大 說起,sorry,背錯台詞了,是從幾天前討論介面返回資料和幾個月前討論課件本地資料結構說起,簡單的說,就是碰到約定好的內容出現異常,是我們在程式中內部作相容處理,還是丟擲去。打個比方,我們要解析一段json,約定這個json的格式,只能是正常格式,或者是空,...

Design by Contract(契約式設計)

design by contract 是bertrand meyer 總結的一項設計技巧 design by contract 的核心是斷言 assertion 所謂 斷言 是指永遠為真的布林型語句,如果不為真,則程式必然存在錯誤。通常情況下,檢查斷言的時機,應該侷限於除錯 debug 階段,而不是...