條款19 設計class 猶如設計type
在 C++ 中,就像其它物件導向程式語言,可以通過定義一個新的類來定義一個新的型別。作為一個C++開發者,你的大量時間就這樣花費在擴張你的型別系統。這意味著你不僅僅是一個類的設計者,而且是一個型別的設計者。過載函式和運算子,控制記憶體分配和回收,定義物件的初始化和終結過程——這些全在你的掌控之中。因此你應該在類設計中傾注大量心血,就如語言設計者在語言內建型別設計中所傾注的大量心血。
設計良好的類是有挑戰性的,因為設計良好的型別是有挑戰性的。良好的型別擁有簡單自然的語法,符合直覺的語義,以及一個或更多高效的實現。那麼,如何才能設計高效的類呢?首先,你必須理解你所面對的問題。實際上每一個類都需要你面對下面這些問題,其答案通常就導向你的設計規範:
· 新型別的物件應該如何建立和銷燬?如何做這些將影響到你的類的建構函式和解構函式,以及記憶體分配和回收函式(operator new,operator new[],operator delete,和 operator delete[])的設計,除非你不寫它們。
· 物件的初始化和物件的賦值應該有什麼不同?這個問題的答案決定了你的建構函式和賦值運算子的行為以及它們之間的不同。
· 值傳遞(passed by value)對於新型別的物件意味著什麼?拷貝建構函式定義了一個新型別的傳值如何實現。
· 新型別的合法值是什麼?通常,對於一個類的資料成員來說,僅有某些值的組合是合法的。那些數值集決定了你的類必須維護的約束條件。也決定了必須在成員函式內部進行的錯誤檢查,特別是建構函式,賦值運算子,以及"setter"函式。它可能也會影響函式丟擲的異常,以及(極少被使用的)函式異常明細(exceptionspecification)。
· 你的新型別需要配合某個繼承圖系中?如果你從已經存在的類繼承,你就受到那些類的設計約束,特別受到它們的函式是virtual還是non-virtual的影響。如果你希望允許其他類繼承你的類,將影響到你是否將函式宣告為virtual,特別是你的解構函式。
· 你的新型別允許哪種型別轉換?你的型別身處其它型別的海洋中,所以是否要在你的型別和其它型別之間有一些轉換?如果你希望允許 T1 型別的物件隱式轉型為 T2 型別的物件,你就要麼在T1類中寫一個型別轉換函式(如operator T2),要麼在 T2 類中寫一個non-explicit-one argument建構函式。如果你只允許顯示建構函式存在,就得寫出專門負責執行轉換的函式,且不得為型別轉換操作符或non-explicit-oneargument建構函式。
· 對於新型別哪些運算子和函式是合理的?這個問題的答案決定你為你的類宣告哪些函式。其中一些是成員函式,另一些不是。
· 哪些標準函式應該駁回?你需要將那些都宣告為 private。
· 你的新型別中哪些成員可以被訪問?這個問題的可以幫助你決定哪些成員是 public,哪些是 protected,以及哪些是 private。它也可以幫助你決定哪些類 和/或 函式應該是友元,以及一個類巢狀在另一個類內部是否有意義。
· 什麼是新型別的未宣告介面 "undeclaredinterface"?它對於效率,異常安全,以及資源使用(例如,多工鎖定和動態記憶體)提供哪種保證?你在這些領域提供的保證將為你的類的實現程式碼加上相應的約束條件。
· 你的新型別有多大程度的通用性?也許你並非真的要定義一個新的型別,也許你要定義一整個型別家族。如果是這樣,你就不該定義一個新的類,而應該定義一個新的類别範本。
· 一個新的型別真的是你所需要的嗎?是否你可以僅僅定義一個新的繼承類,以便讓你可以為一個已有的類增加一些功能,也許通過簡單地定義一個或更多非成員函式或模板能更好地達成你的目標。
· 類設計就是型別設計。定義高效的類是有挑戰性的。在C++中使用者自定義類生成的型別最好可以和內建型別一樣好。
相關文章
- 條款 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條經驗教訓程式設計師谷歌