您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++說明后置條件有什么優點”,在日常操作中,相信很多人在C++說明后置條件有什么優點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++說明后置條件有什么優點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
To detect misunderstandings about the result and possibly catch erroneous implementations.
一方面可以檢查對于結果的錯誤理解,另一方面可以捕捉易錯實現。
Example, bad(反面示例)
Consider:(考慮)
int area(int height, int width) { return height * width; } // bad
這里我們(魯莽地)遺漏了定義前置條件,因此沒有明確高度和寬度必須為正值這件事。我們也沒有定義后置條件,因此當面積大于最大整數的時候算法存在錯誤這件事也不容易被察覺。這里會發生溢出錯誤。考慮使用:
int area(int height, int width){ auto res = height * width; Ensures(res > 0); return res;}
譯者注:和Expects表示前置條件相對,Ensures用于表現后置條件。這符合現代C++的發展思路:提倡表達目的而不是做法。
Consider a famous security bug:(考慮一個著名的安全性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應該被清空,因此優化程序會消除明顯多余的memset調用。
void f() // better{ char buffer[MAX]; // ... memset(buffer, 0, sizeof(buffer)); Ensures(buffer[0] == 0);}
譯者注:這個例子比上一個稍好,但是Ensures的內容更像是專門防止優化的,似乎并沒有反映本來的想法。
后置條件經常在描述函數目的的注釋中被非正式表達。使用Ensures()可以讓后置條件更系統,直觀和便于檢查。
當后置條件和某些不會直接反映到返回值的結果時顯得尤為重要,例如數據結構被使用過的狀態等。
譯者注:調用者的可能更加注意有沒有,而忽略狀態等細節。
Example(示例)
Consider a function that manipulates a Record
, using a mutex
to avoid race conditions:
考慮一個操作記錄的函數,它使用mutex防止競爭條件。
mutex m;
void manipulate(Record& r) // don't
{
m.lock();
// ... no m.unlock() ...
}
這里我們“忘記了”說明mutex應該被釋放這件事,因此我們不知道保證釋放mutex失敗這件事是bug還是功能。說明后置條件可以明確這件事:
void manipulate(Record& r) // postcondition: m is unlocked upon exit{ m.lock(); // ... no m.unlock() ...}
有bug這件事已經很明顯了(但還只是人類可讀的注釋)。更好一些的選擇是:使用RAII來保證后置條件(“鎖必須被釋放”)會被強制釋放。
void manipulate(Record& r) // best{ lock_guard<mutex> _ {m}; // ...}
譯者注:lock_guard是C++11開始的新特性,其實就是簡單的RAII封裝,在構造函數中進行加鎖,析構函數中進行解鎖。這樣做的好處是保證函數退出時,鎖一定被釋放。
Note(注意)
理想情況下,后置條件在接口或聲明時說明,這樣用戶就可以簡單地看到它們。只有和用戶相關的后置條件才可以在接口中描述。只和內部狀態有關的后置條件屬于定義和實現。
Enforcement(實施建議)
(非強制)這是一條哲學層面的準則,通常沒有辦法直接檢查。在很多工具鏈中會存在領域限定的檢查器(例如鎖保持檢查器)。
到此,關于“C++說明后置條件有什么優點”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。