天天看點

《C++程式設計風格(修訂版)》——2.4 類不變性

本節書摘來自異步社群出版社《c++程式設計風格(修訂版)》一書中的第2章,第2.4節,作者:【美】tom cargill,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++程式設計風格(修訂版)

對于每個類,我們都可以寫出一組類不變性(class invariant)條件,在類的每個對象的生 存期内,這些條件都應該是成立的。例如,如果 len 是用來表示字元串的長度,那麼 string 類的 一個不變性條件就是

《C++程式設計風格(修訂版)》——2.4 類不變性

類不變性與循環不變性是相似的。循環不變性在循環的起始階段就開始起作用,并且在循 環的每次疊代中都将保持這個不變性。是以,循環不變性将一直持續到循環結束。同理,在每個 對象的生存期之内也需要保持類不變性。我們首先在構造函數中建立起類不變性,然後在其他成 員函數中維持這個不變性,這樣就在對象的整個生存期内都保持了類不變性。

用一緻的方式來定義對象的狀态——這需要識别出類不變性。

在其他一些程式設計語言中,例如 eiffel,提供了顯式的語言機制來表示和檢查類不變性。然而, 在 c++ 中并沒有提供正式的語言機制來支援類不變性,而是由程式員來決定如何實作類不變性。

從這一點來說,類不變性就更加類似于循環不變性。如果一個 c++ 程式員在頭腦中始終記着循 環不變性,那麼他在編寫循環時就有兩種選擇。在編寫完循環之後,可以将不變性作為循環代碼 的注釋,或者将不變性作為一個斷言整合到代碼中(通過在标準頭檔案 assert.h 中定義的 assert 宏, 我們可以很容易地在代碼中增加斷言)。将不變性作為類的注釋和将不變性作為循環的注釋是一 樣簡單的,然而将類不變性作為斷言整合到類的代碼中則要更困難一些。在類的源代碼中,需要 增加類不變性斷言的地方可能不止一個。由于在每個成員函數中都需要保持類不變性,是以,在 每個可以改變對象狀态的成員函數中都需要對斷言進行測試。其中一種方法就是将所有的類不變 性斷言集中到一個特殊的成員函數中,并在其他成員函數的開始部分或者結束部分(也可以在這 兩個部分)調用這個特殊的成員函數。不過,很少有 c++ 程式員會去做這種麻煩的工作,相對而言, 将類不變性作為注釋是更為普遍的做法。

在程式清單 2.2 中給出了一個 string 類,在這個 string 類中 len 的值和 strlen(s) 的傳回值保持 一緻。在類的聲明中有一條注釋語句,用來說明 len 的類不變性。類的每個成員函數都将遵循這 個不變性。

程式清單 2.2 string 類中的 len 是一緻的

《C++程式設計風格(修訂版)》——2.4 類不變性

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀