如果想利用單一class做太多事情,其內(nèi)往往就會(huì)出現(xiàn)太多instance變量。一旦如此,Duplicated Code也就是接踵而至了。
你可以運(yùn)用Extract Class(149)將數(shù)個(gè)變量一起提煉
至新class內(nèi)。提煉時(shí)應(yīng)該選擇class內(nèi)彼此相關(guān)的變量,將它們放在一起。例如“depositAmount”和
“depositCurrency”可能應(yīng)該隸屬同一個(gè)class。通常如果class內(nèi)的數(shù)個(gè)變量有著相同的前綴或字尾,這就意味有機(jī)會(huì)把它們提煉到某
個(gè)組件內(nèi)。如果這個(gè)組件適合作為一個(gè)subclass,你會(huì)發(fā)現(xiàn)Extract Subclass(330)往往比較簡(jiǎn)單。
有時(shí)候class并非在所有時(shí)刻都使用所有instance變量。果真如此,你或許可以多次使用Extract Class(149)或Extract Subclass(330)。
和[太多instance變量]一樣,class內(nèi)如果有太多代碼,也是[代碼重復(fù)、混亂、死亡]的絕佳滋生地點(diǎn)。最簡(jiǎn)單的解決方案(還記得嗎,我們喜歡
簡(jiǎn)單的解決)是把贅余的東西消弭于class內(nèi)部。如果有五個(gè)[百行函數(shù)],它們之中很多代碼都相同,那么或許你可以把它們變成五個(gè)[十行函數(shù)]和十個(gè)提
煉出來的[雙行函數(shù)]。
和[擁有太多instance變量]一樣,一個(gè)class如果擁有太多代碼,往往也適合使用Extract Class(149)和Extract Subclass(330)。這里有個(gè)有用技巧:先確定客戶端如何使用它們,然后運(yùn)用Extract Interface(341)為每一種使用方法提煉出一個(gè)接口。這或許可以幫助你看清楚如何分解這個(gè)class。
如果你的Large Class是個(gè)GUI class,你可能需要把數(shù)據(jù)和行為移到一個(gè)獨(dú)立的領(lǐng)域?qū)ο螅╠omain object)去。你可能需要兩邊各保留一些重復(fù)數(shù)據(jù),并令這些數(shù)據(jù)同步(sync.)。Duplicated Observed Data(189)告訴你該怎么做。這種情況下,特別是如果你使用舊式Abstract Windows Toolkit(AWT)組件,你可以采用這種方式去掉GUI class并代以Swing組件。