Posted on 2011-11-20 10:56
C小加 閱讀(1269)
評(píng)論(0) 編輯 收藏 引用
實(shí)體:變量、類、函數(shù)、名稱空間、模板和庫。
只給一個(gè)實(shí)體賦予一個(gè)定義良好的職責(zé)。隨著實(shí)體變大,其職責(zé)范圍自然也會(huì)擴(kuò)大,但不應(yīng)該發(fā)散。
如果一個(gè)實(shí)體有幾個(gè)不同的目的,則給使用帶來的難度往往會(huì)激增,因?yàn)檫@種實(shí)體除了會(huì)增加理解難度、復(fù)雜性和各部分中的錯(cuò)誤外,還會(huì)導(dǎo)致其他問題。這種實(shí)體不僅更大,而且更難以使用和維護(hù)。此外,這種實(shí)體經(jīng)常會(huì)為自身的一些特定用途提供有問題的接口,因?yàn)楦鱾€(gè)功能領(lǐng)域之間的部分重疊,會(huì)影響干凈利落地實(shí)現(xiàn)每個(gè)功能所需的洞察力。
具有多個(gè)不同職責(zé)的實(shí)體通常都是難于設(shè)計(jì)和實(shí)現(xiàn)的。“多個(gè)職責(zé)”經(jīng)常意味著“多重性格”----可能的行為和狀態(tài)的各種組合方式。應(yīng)該選擇目的單一的函數(shù),小而且目的單一的類,和邊界清晰的緊湊模塊。
應(yīng)該用較小的底層抽象構(gòu)建更高層次的抽象。要避免將幾個(gè)底層抽象集合成一個(gè)較大的低層次抽象聚合體。用幾個(gè)簡單的行為來實(shí)現(xiàn)一個(gè)復(fù)雜的行為,比反其道而行之更加容易。
在標(biāo)準(zhǔn)C語言中,realloc是一個(gè)臭名昭著的不良設(shè)計(jì)。這個(gè)函數(shù)承擔(dān)了太多的任務(wù):如果傳入的指針參數(shù)為NULL就分配內(nèi)存空間,如果傳入的大小參數(shù)為0就釋放內(nèi)存空間,如果可行則就地重新分配,如果不行則移到其他地方分配。這個(gè)函數(shù)不易于擴(kuò)展,普遍認(rèn)為它是一個(gè)目光短淺的失敗設(shè)計(jì)。
在標(biāo)準(zhǔn)C++語言中,std::basic_string是另一個(gè)臭名昭著的不良設(shè)計(jì)----巨大的類的設(shè)計(jì)。在一個(gè)臃腫的類中添加了太多“多多益善”的功能,而這只是為了試圖成為容器但卻沒有做到,在用迭代還是索引上猶豫不決,還毫無道理地重復(fù)了許多標(biāo)準(zhǔn)算法,而為擴(kuò)展所留的寬裕度又很小。