函數(shù)的參數(shù)盡量以對象為準,幾個隸屬于同一個對象的參數(shù)可以用一個對象替代。這樣可以防止過長的參數(shù)列表,而且后期的增加參數(shù),只需要修改很少的幾處就可以了。
發(fā)散式變化:(一個類受多種變化的影響)
針對某一外面變化的所有相應修改,都應該只發(fā)生在單一類中,而這個新類中的所以內(nèi)容都應該反應此變化。
找出某種特定原因而造成的所有變化,然后提煉到新的一個類中
散彈式變化:(一個變化引起多個類的修改)
如果要在很多地方添加很少的代碼,可以把這些代碼統(tǒng)一封裝到一個類來提供,可能會造成少量的發(fā)散式問題,但是你可以很輕易的解決。(搬移函數(shù)、搬移字段、將類內(nèi)聯(lián)化)
多狀態(tài)的選擇執(zhí)行:
把選擇的部分提煉到一個獨立的函數(shù)中,再用搬移函數(shù)將它搬移到需要多態(tài)性的那個類里。
提煉函數(shù):提煉函數(shù)出來,很多局部變量的話可以根據(jù)參數(shù)給傳進去,如果需要把結(jié)果給出來的話可以讓函數(shù)有返回值。如果返回值需要多個,那傳進去的參數(shù)就可以傳地址,這樣可以修改里面的值。不支持出值的話,那就通過多個函數(shù)來返回(110)。如果函數(shù)特別復雜,光是通過提煉函數(shù)做不到的話,可以提煉類,在一個類里面把它分解成很多個函數(shù),用類里面的變量來實現(xiàn)。(135)
以查詢?nèi)〈R時變量:用一個臨時變量保存一個表達式的運算結(jié)果,但是很多地方會用到,為了這個臨時變量我們可能讓這個函數(shù)做很多事情,這樣可能會讓函數(shù)很長。將這個表達式提煉到一個函數(shù)中。其他使用的地方都用這個函數(shù)。此后,新函數(shù)就可以被其他函數(shù)使用。(120)
引入解釋性變量:if的括號里面很多個并列條件的時候,我們可以把每個并列條件都拿出來用一個臨時變量存放結(jié)果,這個臨時變量就可以看得出來這個條件是在做什么。拆出來的單獨表達式可以再提煉函數(shù)的。(124)
搬移函數(shù):如果這個函數(shù)的使用主要是跟另外一個類進行溝通,那么我們可以考慮把它搬移到那個類里面去。我們可以通過代理模式來實現(xiàn)。如果這個函數(shù)有些操作必須在本類完成,那么我可以把這個函數(shù)再分解。(142)
隱藏中間人:通過對委托對象的功能就行封裝轉(zhuǎn)發(fā)讓外面不知道里面的實現(xiàn)。(157)
移除中間人:由于需要對委托對象很多操作,需要大量的封裝轉(zhuǎn)發(fā)變得很臃腫且多余,那么我們應該移除封裝轉(zhuǎn)發(fā)。(160)
這兩者需要根據(jù)實際情況來區(qū)別對待,不同時期的選擇會是不同的。
以對象取代數(shù)據(jù)值:當最初只需要傳入一個值的時候,我們可以提前考慮下這個值是否還含有其他屬性。如果可能含有其他值的話,我們就以對象取代值,這樣方便以后的擴展。
簡化條件表達式:當if嵌套的時候,我們可以把if分解成多個平級的if判斷,并且用return來控制結(jié)束。如果上層的if里面有許多判斷,那么我們可以反轉(zhuǎn)判斷條件,讓不符合的直接return??偟乃悸肪褪窍茸宨f執(zhí)行簡單的邏輯,不斷的分解,最后是把復雜的嵌套判斷分解成為平級的。
用委托取代繼承:當我們只需要使用超類很少的一部分功能的時候,我們選擇用委托,避免繼承過來過多的函數(shù)。
用繼承取代委托:當我們需要寫很多委托來使用超類的功能的時候,我們選擇用繼承,避免了過多無用的代碼。