【问题标题】:How refactor two methods which are very similar如何重构两个非常相似的方法
【发布时间】:2017-03-29 07:00:31
【问题描述】:

我有以下课程:

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 子句中是相同的条件。我们可以使这两种方法更好吗?更“抽象”?

我不能对我的类进行任何更改,只能对方法进行更改。

【问题讨论】:

  • 这两种方法的目的是什么?你为什么首先拥有它们?

标签: java refactoring


【解决方案1】:

我假设这里要求的是使用“多态性”

因为 BaseClass、ClassA 和 ClassB 这三个类都实现了接口 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() 方法。

看看“多态行为”

【讨论】:

  • 好的,但是如何调用方法 getAttribiuteA() 和 getAttribiuteB() ?这些方法只存在于ClassA和ClassB中,所以polymorphic不起作用...
  • 如果你需要调用这些方法,你需要强制转换它。没有更简单的方法可以做到这一点。例如,您可以使用“实例”来检查对象是否是哪个类。 (i2 instanceof ClassA) 将返回 true,因为 i2 是 ClassA 的实例(或对象)。然后,您可以通过 ((ClassA) i2).getAttributeA() 调用 getAttributeA()。您将 i2 转换为 ClassA 并调用其方法“getAttributeA()”。必须使用“instanceof”,因为 IBaseInterface 变量中的对象可以是任何实现 IBaseInterface 接口的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多