溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++說(shuō)明后置條件有什么優(yōu)點(diǎn)

發(fā)布時(shí)間:2021-11-25 16:26:27 來(lái)源:億速云 閱讀:150 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“C++說(shuō)明后置條件有什么優(yōu)點(diǎn)”,在日常操作中,相信很多人在C++說(shuō)明后置條件有什么優(yōu)點(diǎn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C++說(shuō)明后置條件有什么優(yōu)點(diǎn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

I.7: State postconditions (說(shuō)明后置條件)

Reason(原因)

To detect misunderstandings about the result and possibly catch erroneous implementations.

一方面可以檢查對(duì)于結(jié)果的錯(cuò)誤理解,另一方面可以捕捉易錯(cuò)實(shí)現(xiàn)。

Example, bad(反面示例)

Consider:(考慮)

int area(int height, int width) { return height * width; }  // bad

這里我們(魯莽地)遺漏了定義前置條件,因此沒(méi)有明確高度和寬度必須為正值這件事。我們也沒(méi)有定義后置條件,因此當(dāng)面積大于最大整數(shù)的時(shí)候算法存在錯(cuò)誤這件事也不容易被察覺(jué)。這里會(huì)發(fā)生溢出錯(cuò)誤??紤]使用:


int area(int height, int width){    auto res = height * width;    Ensures(res > 0);    return res;}

譯者注:和Expects表示前置條件相對(duì),Ensures用于表現(xiàn)后置條件。這符合現(xiàn)代C++的發(fā)展思路:提倡表達(dá)目的而不是做法。

Example, bad(反面示例)

Consider a famous security bug:(考慮一個(gè)著名的安全性bug)

void f()    // problematic{    char buffer[MAX];    // ...    memset(buffer, 0, sizeof(buffer));}

There was no postcondition stating that the buffer should be cleared and the optimizer eliminated the apparently redundant memset() call:

不存在后置條件表明buffer應(yīng)該被清空,因此優(yōu)化程序會(huì)消除明顯多余的memset調(diào)用。


void f()    // better{    char buffer[MAX];    // ...    memset(buffer, 0, sizeof(buffer));    Ensures(buffer[0] == 0);}

譯者注:這個(gè)例子比上一個(gè)稍好,但是Ensures的內(nèi)容更像是專(zhuān)門(mén)防止優(yōu)化的,似乎并沒(méi)有反映本來(lái)的想法。

Note(注意)

后置條件經(jīng)常在描述函數(shù)目的的注釋中被非正式表達(dá)。使用Ensures()可以讓后置條件更系統(tǒng),直觀和便于檢查。

Note(注意)

當(dāng)后置條件和某些不會(huì)直接反映到返回值的結(jié)果時(shí)顯得尤為重要,例如數(shù)據(jù)結(jié)構(gòu)被使用過(guò)的狀態(tài)等。

譯者注:調(diào)用者的可能更加注意有沒(méi)有,而忽略狀態(tài)等細(xì)節(jié)。

Example(示例)

Consider a function that manipulates a Record, using a mutex to avoid race conditions:

考慮一個(gè)操作記錄的函數(shù),它使用mutex防止競(jìng)爭(zhēng)條件。

mutex m;
void manipulate(Record& r)    // don't{    m.lock();    // ... no m.unlock() ...}

這里我們“忘記了”說(shuō)明mutex應(yīng)該被釋放這件事,因此我們不知道保證釋放mutex失敗這件事是bug還是功能。說(shuō)明后置條件可以明確這件事:

void manipulate(Record& r)    // postcondition: m is unlocked upon exit{    m.lock();    // ... no m.unlock() ...}

有bug這件事已經(jīng)很明顯了(但還只是人類(lèi)可讀的注釋?zhuān)8靡恍┑倪x擇是:使用RAII來(lái)保證后置條件(“鎖必須被釋放”)會(huì)被強(qiáng)制釋放。

void manipulate(Record& r)    // best{    lock_guard<mutex> _ {m};    // ...}

譯者注:lock_guard是C++11開(kāi)始的新特性,其實(shí)就是簡(jiǎn)單的RAII封裝,在構(gòu)造函數(shù)中進(jìn)行加鎖,析構(gòu)函數(shù)中進(jìn)行解鎖。這樣做的好處是保證函數(shù)退出時(shí),鎖一定被釋放。

Note(注意)

理想情況下,后置條件在接口或聲明時(shí)說(shuō)明,這樣用戶(hù)就可以簡(jiǎn)單地看到它們。只有和用戶(hù)相關(guān)的后置條件才可以在接口中描述。只和內(nèi)部狀態(tài)有關(guān)的后置條件屬于定義和實(shí)現(xiàn)。

Enforcement(實(shí)施建議)

(非強(qiáng)制)這是一條哲學(xué)層面的準(zhǔn)則,通常沒(méi)有辦法直接檢查。在很多工具鏈中會(huì)存在領(lǐng)域限定的檢查器(例如鎖保持檢查器)。

到此,關(guān)于“C++說(shuō)明后置條件有什么優(yōu)點(diǎn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI