每個類包含約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和樹屬性,它都顯得很醜陋。我不確定是否有任何設計模式或解決方案。請幫助我重構類,以便我可以刪除重複的代碼。
如果功能相同爲什麼*不會*基類是一個合理的解決方案? –
@DaveNewton因爲剩下的20個不同的方法,如不同的MethodFromA和differentMethodFromB也需要使用字段menuProvider和樹,我必須從基類中提供getter方法。每次我召喚一個來自基地的吸氣者時,我也必須施展一次,這在我看來很醜陋。 – Alex
然後應該有一個接口來規範'MenuProvider'的功能。 –