包含(“有一個(gè)....”的關(guān)系):標(biāo)志一個(gè)類含有一個(gè)基本數(shù)據(jù)元素或?qū)ο蟆?br>(1)通過(guò)包含來(lái)實(shí)現(xiàn)“有一個(gè)/has a”的關(guān)系:比如一個(gè)雇員“有一個(gè)”姓名,“有一個(gè)”電話號(hào)碼。
(2)在萬(wàn)不得已時(shí),通過(guò)private繼承來(lái)實(shí)現(xiàn)“有一個(gè)”的關(guān)系:這么做的主要原因是讓外層的包含類能夠訪問(wèn)內(nèi)層被包含類的protected成員函數(shù)和數(shù)據(jù)成員。但是這樣會(huì)從一定程度上破壞封裝性。
(3)警惕又超過(guò)約7個(gè)數(shù)據(jù)成員的類:研究表明,人們?cè)谧銎渌虑槭心苡涀〉碾x散項(xiàng)目的個(gè)數(shù)是7+-2,如果一個(gè)類包含超過(guò)約7個(gè)數(shù)據(jù)成員,請(qǐng)考慮要不要分解為幾個(gè)更小的類。如果數(shù)據(jù)成員都是整形或者字符串這種簡(jiǎn)單數(shù)據(jù)類型,你可以按照7+-2的上限來(lái)考慮,反之,如果數(shù)據(jù)成員都是復(fù)雜對(duì)象的話,就應(yīng)按7+-2的下限來(lái)考慮。
繼承(“是一個(gè)...”的關(guān)系):繼承是說(shuō)一個(gè)類是另一個(gè)類的一種特化。
(1)用public繼承來(lái)實(shí)現(xiàn)“是一個(gè)....”的關(guān)系:決定用繼承一個(gè)現(xiàn)有類的方式創(chuàng)建一個(gè)新類事,表明這個(gè)新的類是現(xiàn)有類一個(gè)更為特殊的版本,基類既對(duì)派生類將會(huì)做什么設(shè)定了預(yù)期,也對(duì)派生類能怎么運(yùn)作提出了限制。如果派生類不準(zhǔn)備完全遵守由基類定義的同一個(gè)接口的契約,繼承就是不正確的實(shí)現(xiàn)技術(shù)了。
(2)要么使用繼承并進(jìn)行詳細(xì)說(shuō)明,要么就不要用它。
(3)遵循Liskov替換原則:派生類必須能通過(guò)基類的接口而被使用,切使用者無(wú)需了解兩者之間的差異。換句話說(shuō),對(duì)于基類中定義的所有子程序,用在它的任何派生類中時(shí)的含義都應(yīng)該是相同的。
(4)確保只繼承需要繼承的部分:派生類可以繼承成員函數(shù)的接口和/或?qū)崿F(xiàn)。
(5)不要“覆蓋”一個(gè)不可覆蓋的成員函數(shù)。
(6)把公用的接口、數(shù)據(jù)及操作放到繼承樹(shù)中盡可能高的位置:如果發(fā)現(xiàn)把一個(gè)子程序移到更到的層次后會(huì)破壞該層對(duì)象的抽象性,就停手。
(7)只有一個(gè)實(shí)例的類是值得懷疑的:Singleton模式是特殊的。
(8)派生后覆蓋了某個(gè)子程序,擔(dān)在其中沒(méi)做任何操作,這種情況也值得懷疑。舉例:假設(shè)你有一個(gè)Cat類,他有一個(gè)Scratch(抓)成員函數(shù),可是最終你發(fā)現(xiàn)有些貓的爪尖沒(méi)了,不能抓了,你可能想從Cat類派生一個(gè)叫ScratchlessCat(不能抓的貓)的類,然后覆蓋Scratch方法讓它什么都不做。這種方法是不可取的,修正這一問(wèn)題的位置不在派生類,而是在最初的Cat類中,應(yīng)該創(chuàng)建一個(gè)Claw(爪子)類并讓Cat類包含它,問(wèn)題的根源在于做了所有貓能抓的假設(shè)。
(9)避免讓繼承體系過(guò)深:《Object-Oritented Design Hwuristics》作者Arthur Riel建議把繼承層次限制在最多6層之內(nèi),Arthur是基于“神奇數(shù)字7+-2”這一理論得出這一建議的,但是依經(jīng)驗(yàn)而言,大多數(shù)人在腦中同時(shí)應(yīng)付超過(guò)2到3層繼承時(shí)就有麻煩了,用7+-2來(lái)限制一個(gè) 基類的派生類總數(shù)——而不是繼承層次的層數(shù)——可能更為合適。
(10)盡量使用多態(tài),避免大量的類型檢查:頻繁重復(fù)出現(xiàn)的case語(yǔ)句有時(shí)是在暗示,采用繼承可能是種更好的設(shè)計(jì)選擇。
(11)讓所有數(shù)據(jù)都是private(而非protected):如果派生類真的需要訪問(wèn)基類的屬性,就應(yīng)該提供protected訪問(wèn)器函數(shù)。
posted on 2007-09-28 09:21
探丫頭 閱讀(1136)
評(píng)論(2) 編輯 收藏 引用 所屬分類:
《代碼大全》讀書(shū)筆記