任何接口設(shè)計的一個準則:讓接口容易被正確使用,不容易被誤用。
理想上:如何客戶企圖使用某個接口缺沒有獲得他所預(yù)期的行為,這個代碼不該通過編譯;如果代碼通過了編譯,他的行為就該是客戶所想要的。
1. 導(dǎo)入外覆類型(wrapper types)
2. 讓types容易被正確使用,不容易被誤用。盡量領(lǐng)你的types行為與內(nèi)置types一致。
3. 設(shè)計class猶如設(shè)計type
新type的對象應(yīng)該如何被創(chuàng)建和銷毀?(自己設(shè)計operatornew,operatornew[],operator delete和operator delete[])
對象的初始化和對象的復(fù)制該有什么樣的差別?對應(yīng)于不同的函數(shù)調(diào)用
新type的對象如果被passed by value ,意味著什么
什么是新type的“合法值”?(??)
你的新type需要配合某個繼承圖系嗎?
你的心type需要什么樣的轉(zhuǎn)換
什么樣的操作符合函數(shù)對此新type而言是合理的
什么樣的標準函數(shù)應(yīng)該駁回
誰該取用新type的成員
什么是新type的未聲明接口
你的新type有多么一般化
你真的需要一個新type嗎
一、寧以pass-by-reference-to-const 替換 pass-by-value
1.tbw效率高,沒有任何構(gòu)造函數(shù)或析構(gòu)函數(shù)被調(diào)用,因為沒有任何新對象被創(chuàng)建。
2. by refrenece方式傳遞參數(shù)還可以避免對象slicing 問題
二、必須返回對象時,別妄想返回其reference
所有用上static對象的設(shè)計,會造成多線程安全性的懷疑。
三、將成員變量聲明為private:
1. 可以實現(xiàn)出“不準訪問”、“只讀訪問”、“讀寫訪問”、“惟寫訪問”
2. 封裝:它使我們能夠改變事物而只影響有限客戶。
將成員變量隱藏在函數(shù)接口的背后,可以為“所有可能的實現(xiàn)”提供彈性。如:tb變量被讀或被寫時通知其他對象、可以驗證class的約束條件以及函數(shù)的前提和事后轉(zhuǎn)帖;以及在多線程環(huán)境執(zhí)行同步控制。。。。等。
四、寧以non-member、non-friend替換member函數(shù)
- namespace WebBrowserStuff{
- class WebBrowser{...};
- void clearBrowser(WebBrowser& wb);
- }
五、若所有參數(shù)皆需要類型轉(zhuǎn)換,請為此采用non-member函數(shù)
- class Rational {
- ...
- }
-
- const Rational operator*(const Rational& lhs,const Rational& rhs)
- {
- return Rational( lhs.numerator()* rhs.numerator()
- ,lhs.denominator()*rhs.denominator() );
- }
-
- Rational oneFourth(1,4);
- Rational result;
- result = oneFourth * 2;
- result = 2*oneFourth;
六、考慮寫出一個不拋異常的swap函數(shù)