2016-03-08 28 views
0

每個類包含約30個方法,其中幾乎一半是相同或非常相似。很快我要添加一個與這兩個班級處於相同狀況的第三班。我覺得維護或改變它是一團糟。我如何重構以避免重複的代碼?如何用許多類似的方法重構兩個複雜的類?

下面是一個簡化版本:

public class A extends ContentPanel{ 
    private AMenuProvider menuProvider; 
    private ADefinitionTree tree; 

    public void sameMethod1(){ 
      ... 
      menuProvider.do(); 
      tree.doSomething(); 
      ... 
    } 

    public void sameMethod2(){ 
      ... 
      menuProvider.do(); 
      tree.doSomething(); 
      ... 
    } 

    public void differentMethodFromA(){ 
      ... // uses menuProvider and tree 
    } 


    ... 
    // 10 similar methods and 20 different methods 
} 

public class B extends ContentPanel{ 
    private BMenuProvider menuProvider; 
    private BDefinitionTree tree; 

    public void sameMethod1(){ 
      ... 
      menuProvider.do(); 
      tree.doSomething(); 
      ... 
    } 

    public void sameMethod2(){ 
      ... 
      menuProvider.do(); 
      tree.doSomething(); 
      ... 
    } 

    public void differentMethodFromB(){ 
      ... // uses menuProvider and tree 
    } 

    ... 
    // 10 similar methods and 20 different methods 

} 

注:BMenuProvider VS AMenuProvider和ADefinitionTree VS BDefinitionTree可能是非常不同的實現,但它們提供了許多相同的方法。他們每個人都有一些獨特的方法,而另一個沒有。

我想過創建一個抽象類並對其進行擴展,但無論在哪裏放置menuProvider和樹屬性,它都顯得很醜陋。我不確定是否有任何設計模式或解決方案。請幫助我重構類,以便我可以刪除重複的代碼。

+1

如果功能相同爲什麼*不會*基類是一個合理的解決方案? –

+0

@DaveNewton因爲剩下的20個不同的方法,如不同的MethodFromA和differentMethodFromB也需要使用字段menuProvider和樹,我必須從基類中提供getter方法。每次我召喚一個來自基地的吸氣者時,我也必須施展一次,這在我看來很醜陋。 – Alex

+0

然後應該有一個接口來規範'MenuProvider'的功能。 –

回答

0

S.O.L.I.D"S"

的單一職責原則規定,每個模塊或 類應該有過的由軟件提供的功能 單個部分的責任,這個責任應該由完全 封裝班上。所有的服務應該與這個責任範圍很窄地對齊 。

"I"

界面偏析原理(ISP)規定,任何客戶端應 被迫依賴於它不使用方法[1] ISP將 接口分成更小更具體的接口,因此客戶只需知道 對其感興趣的方法。這種縮小的接口也被稱爲角色 接口。[2] ISP旨在保持系統解耦,因此更容易重構,更改和重新部署。

"D"

A.高層模塊不應該依賴於低級別的模塊。 都應該依賴於抽象。 B.抽象不應取決於 的細節。細節應該取決於抽象。

您違反了(至少)OO的這三條神聖規則。 AB應取決於抽象(接口)。同樣的方法應該抽象爲一個接口,不同的接口方法。 S.O.L.I.D比設計模式更重要。設計模式基於SOLID。先學習一下,你就不會再有像這樣的問題了。

0

基本上有兩種重用代碼的方法(當代碼跨兩個或多個類複製時)。

  • 繼承:如果所有參與類(共享重複的代碼)在邏輯上被放入其中,「被」的關係之後不是創建一個基類層次結構,拉在基類中的常用方法,並自定義子類方法。 (如果跨子類的方法實現有變化,請考慮使用模板方法模式。)

  • 組成:如果參與類不遵循「is-a」關係,因此不能放入層次結構中,請創建類並把所有可重用的方法放在那裏。在任何想要通過構圖重用方法的地方使用該類。

相關問題