最單純的Duplicated Code就是[同一個class內(nèi)的兩個函數(shù)含有相同表達式(express)]。這時候你需要做的就是采用Extract Method(110)提煉出重復(fù)的代碼,然后讓這兩個地點都調(diào)用被提煉出來的那一段代碼。
另一種常見情況就是[兩個互為兄弟(sibling)的subclass內(nèi)含相同表達式]。要避免這種情況,只需對兩個classes都使用Extract Method(110),然后再對被提煉出來的代碼使用Pull Up Method(332),將它推入superclass內(nèi)。如果代碼之間是類似,并非完全相同,那么就得運用Extract Method(110)將相似部分和差異部分割開,構(gòu)成單獨一個函數(shù)。然后你可能發(fā)現(xiàn)或許可以運用Form Template Method(345)獲得一個Template Method設(shè)計模式。如果有些函數(shù)以不同的算法做相同的事,你可以擇定其中較清晰的一個,并使用Substitute Algorithm(139)將其他函數(shù)的算法替換掉。
如果兩個毫不相關(guān)的classes內(nèi)出現(xiàn)Duplicated Code,你應(yīng)該考慮對其中一個使用Extract Class(149), 將重復(fù)代碼提煉到一個獨立class中,然后在另一個class內(nèi)使用這個新class。但是,重復(fù)代碼所在的函數(shù)也可能的確只應(yīng)該屬于某個class, 另一個class只能調(diào)用它,抑或這個函數(shù)可能屬于第三個class,而另兩個classes應(yīng)該引用這第三個class。你必須決定這個函數(shù)放在哪個最 合適,并確保它被安置后就不會再在其他任何地方出現(xiàn)。
另一種常見情況就是[兩個互為兄弟(sibling)的subclass內(nèi)含相同表達式]。要避免這種情況,只需對兩個classes都使用Extract Method(110),然后再對被提煉出來的代碼使用Pull Up Method(332),將它推入superclass內(nèi)。如果代碼之間是類似,并非完全相同,那么就得運用Extract Method(110)將相似部分和差異部分割開,構(gòu)成單獨一個函數(shù)。然后你可能發(fā)現(xiàn)或許可以運用Form Template Method(345)獲得一個Template Method設(shè)計模式。如果有些函數(shù)以不同的算法做相同的事,你可以擇定其中較清晰的一個,并使用Substitute Algorithm(139)將其他函數(shù)的算法替換掉。
如果兩個毫不相關(guān)的classes內(nèi)出現(xiàn)Duplicated Code,你應(yīng)該考慮對其中一個使用Extract Class(149), 將重復(fù)代碼提煉到一個獨立class中,然后在另一個class內(nèi)使用這個新class。但是,重復(fù)代碼所在的函數(shù)也可能的確只應(yīng)該屬于某個class, 另一個class只能調(diào)用它,抑或這個函數(shù)可能屬于第三個class,而另兩個classes應(yīng)該引用這第三個class。你必須決定這個函數(shù)放在哪個最 合適,并確保它被安置后就不會再在其他任何地方出現(xiàn)。