如何重构两种非常相似的方法

时间:2017-03-29 07:00:32

标签: java refactoring

我有以下课程:

public interface IBaseInterface {
    String baseMethod();
}

public class BaseClass implements IBaseInterface{

    @Override
    public String baseMethod() {
        return "baseInterface";
    }

    public String otherBaseMethod(){
        return "otherBaseMethod";
    }

}

public class ClassA implements IBaseInterface{

    @Override
    public String baseMethod() {
        return "ClassA";
    }

    public String getAttribiuteA(){
        return "A";
    }

}

public class ClassB implements IBaseInterface {

    @Override
    public String baseMethod() {
        return "ClassB";
    }

    public String getAttribiuteB(){
        return "B";
    }

}

现在我有两个非常相似的方法:

private String getBaseMethod(){

    /** Do something */

    if(/**    */){
        BaseClass base = new BaseClass();
        return base.baseMethod();
    }else if (/**    */){
        ClassA a = new ClassA();
        return a.baseMethod();
    } else {
        ClassB b = new ClassB();
        return b.baseMethod();
    }
}

private String getOtherMethod(){

    /** Do something */

    if(/**    */){
        BaseClass base = new BaseClass();
        if(/**    */){
            return base.baseMethod();
        } else{
            return base.otherBaseMethod()
        }
    } else if(/**    */){
        ClassA a = new ClassA();
        return a.getAttribiuteA()
    } else{
        ClassB b = new ClassB();
        return b.getAttribiuteB();
    }
}

这两种方法非常相似。在if-Clause中是相同的条件。我们可以让这两种方法更好吗?更“抽象”?

我不能在课程中进行任何更改,只能在方法中进行。

1 个答案:

答案 0 :(得分:0)

我认为这里要问的是使用'多态性'

因为所有三个类,BaseClass,ClassA和ClassB都实现了interfcae IBaseInterface,所以你可以像下面的例子那样做:

 IBaseInterface i1 = new BaseClass();
 IBaseInterface i2 = new ClassA();
 IbaseInterface i3 = new ClassB();

正如您在此时已经注意到的那样,您也可以使用List来保存您的课程。

 List<IBaseInterface> interfaces = new ArrayList<>();
 interfaces.add(i1);
 ....

等等

因为IBaseInterface有方法baseMethod(),所以现在你可以简单地遍历列表并为每个IBaseInterface对象调用baseMethod()方法。

看看'多形态行为'