條款 19:設計 class 猶如設計 type
《Effective C++ 中文版 第三版》讀書筆記
** 條款 19:設計 class 猶如設計 type **
如何設計高效的 class呢?幾乎每一個 class 都要求你面對以下提問,而你的回答往往導致你的設計規範:
新 Type 的物件應該如何被建立和銷燬?
這會影響到你的 class 的建構函式和解構函式以及記憶體分配函式和釋放函式(operator new、operator new[]、operator delete 和 operator delete[])的設計,當然前提是你打算撰寫他們。物件的初始化和物件的賦值該有什麼樣的差別?
這個答案決定你的建構函式和賦值操作符的行為,以及其間的差異。很重要的是別混淆了“初始化”和“賦值”,因為它們對應於不同的函式呼叫。新 Type 的物件如果被 passed by value(以值傳遞),意味著什麼?
記住,copy 建構函式用來定義一個 type 的 pass-by-value 該如何實現。什麼是新 type 的“合法值”?
對 class 的成員變數而言,通常只有某些數值集是有效的。那些數值集決定了你的 class 必須維護的約束條件,也就決定了你的成員函式(特別是建構函式、賦值操作符和所謂 “setter” 函式)必須進行的錯誤檢查工作。他也影響函式丟擲的異常、以及(極少被使用的)函式異常明細列。你的新 type 需要配合某個繼承圖系(inheritance graph)嗎?
如果你是繼承自某些既有的 class,你就受到那些 class 的設計的束縛,特別是受到“它們的函式時 visual 和 non-visual”的影響(條款34和36)。如果你允許其它 class 繼承你的 class,那會影響你所宣告的函式——尤其是解構函式——是否為 visual(條款07)。你的新 type 需要什麼樣的轉換?
你的 type 生存於其他一海票 types 之間,因而彼此之間該有轉換嗎?如果你希望允許型別 T1 之物被隱式轉換為型別 T2 之物,就必須在 class T1 內寫一個型別轉換函式(operator T2)或在 class T2 內寫一個 non-explicit-one-argument(可被單一實參呼叫)的建構函式。如果你允許 explicit 建構函式存在,就得寫出專門負責執行轉換的函式,且不得為型別轉換操作符 (type conversion operator) 或 non-explicit-one-argument 建構函式(條款15)。什麼樣的操作符和函式對此新 type 而言是合理的?
這個問題的答案決定你將為你的 class 宣告那些函式。其中某些該是 member 函式,某些則否(條款23、24、46)。什麼樣的標準函式應該駁回?
那些正是你必須宣告為 private 者(條款06)。誰該取用新的 type 的成員?
這個提問可以幫助你決定那個成員為 public,那個為 protected,那個為 private。他也幫助你決定哪一個 class 和/或 function 應該是 friend,以及它們巢狀於另一個之內是否合理。什麼是新 type 的“未宣告介面”(undecleared interface)?
他對效率、異常安全性(條款29)以及資源運用(例如多工鎖定和動態記憶體)提供何種保證?你在這些方面提供的保證將為你的 class 實現程式碼加上相應的約束條件。你的新 type 有多麼的一般化?
或許你其實並非定義一個新 type,而是定義一整個 types 家族。果真如此你就不該定義一個新 class,而是定義一個新的 class template。你真的需要一個新 type 嗎?
如果只是定義新的 derived class 以便為既有的 class 新增機能,那麼說不定單純定義一或多個 non-member 函式或 template,更能夠達到目標。
這些問題不容易回答,所以定義出搞笑的 class 是一種挑戰,然而如果能夠設計出至少像 C++ 內建型別一樣好的使用者自定義類,一切汗水便都值得。
** 請記住: **
class 的設計就是 type 的設計,在定義一個新 type 之前,請確定你已經考慮過本條款覆蓋的所有討論主題。
相關文章
- 條款19 設計class 猶如設計type
- 編織如程式設計程式設計
- 現在程式設計 猶未晚矣程式設計
- 條款48:認識 template 超程式設計程式設計
- Guru of the Week 條款13:物件導向程式設計 (轉)物件程式設計
- OO幾條設計原則
- 程式設計師程式設計的 7 + 1 條小貼士程式設計師
- Type與Class
- C#程式設計利器之一:類(Class)C#程式設計
- 計科190405程式設計題解程式設計
- 程式設計如打仗:打一槍換一個地方程式設計
- 程式設計師不可不知的7款程式設計工具程式設計師
- Type Script 在流程設計器的落地實踐
- 遊戲設計的11條原則遊戲設計
- ABAP 程式語言中 Class(類)的設計原理剖析
- [譯文]過猶不及,別再在程式設計中高射炮打蚊子程式設計
- 提高程式設計師專案設計水平的11條建議程式設計師
- Houdini 19,電影特效設計特效
- 如何設計一款Java框架?Java框架
- 設計一款籃球經理類遊戲(三):球隊的設計遊戲
- 計算機程式設計的24條法規 (轉)計算機程式設計
- 叩開Apple設計獎項大門的7條設計建議APP
- Pygame - Python 遊戲程式設計入門 class1GAMPython遊戲程式設計
- Pygame - Python 遊戲程式設計入門 class2GAMPython遊戲程式設計
- 程式設計師的4條說法程式設計師
- iOS 逆向程式設計(入門條件)iOS程式設計
- shell程式設計之條件語句程式設計
- 程式設計師避坑指南36條程式設計師
- [譯] 設計研究的 9 條規則
- 無我程式設計的 10 條戒律程式設計
- 物件導向設計的 10 條戒律物件
- shell程式設計(五)條件判斷程式設計
- 設計溝通的七條經驗
- 58python 進度條設計Python
- 安卓設計師不容錯過的15款實用UI介面設計工具安卓UI
- 分享12款最佳的Bootstrap設計工具boot
- GoLang設計模式19 - 橋接模式Golang設計模式橋接
- 19歲程式設計師在谷歌學到的5條經驗教訓程式設計師谷歌