重构为子类 - 如何组合实例方法?

时间:2013-11-19 09:26:04

标签: java eclipse inheritance refactoring

我正在重构一些代码来使用多态而不是条件。我想用一个名为“transferData”的单个重写方法替换下面的两个方法,然后有两个子类 - 一个“Uploader”和一个带有“transferData”的“Downloader”作为调用方法。

public class Example {
    int direction;
    public Example(int direction) {
        this.direction = direction;
    }

    public void upload() {        
    }

    public void download() {        
    }
}

我可以采取哪些自动重构来最大限度地减少我需要执行的手动更改量?到目前为止,我有:

  • 介绍了一种工厂方法(使用Eclipse的自动重构工具)
  • 创建了“Downloader”子类并重写了构造函数。

包装这些方法调用的最佳方法是什么,在不破坏所有现有代码和测试的情况下适当更新现有的调用站点?

1 个答案:

答案 0 :(得分:1)

我想不出一种完全无痛的方法。我在下面显示的方式仍然会导致一些编译错误,在您进入下一步之前需要修复。但我实际上认为这是很好的反馈,因为你会看到仍然需要修复的东西,并知道什么时候一切都已修复。

最简单的方法是首先修改父类以使用单个transferData()方法,然后再使用子类来拆分逻辑。

第1步:

public class Example {
    int direction;
    public Example(int direction) {
        this.direction = direction;
    }

    public void transferData(){
        if(direction>0){
            upload();
        }else{
             download();
        }

    }

    public void upload() {        
    }

    public void download() {        
    }
}

第2步:让upload()download()不再公开。更改客户端调用以改为使用transferData()。

我想不出任何内置的eclipse自动化工具来解决这个问题。我猜你可以在步骤1中做一个重命名方法来改变其中一个,但这仍然会导致其他方法的编译错误被改变。好的一面是,当客户端调用一个不可见的方法时会导致编译错误,因此在修复它们之后会有一点点痛苦,一旦所有编译完成后应该继续进行下一步。 (假设您没有使用反射进行一些调用)

public class Example {
   ...
   private void upload() {        

   }

   private void download() {

   }
}

步骤3:用Factory替换Example的所有结构。同样为了简单起见,您可以将Example构造函数设为私有,以导致编译错误,以帮助跟踪所有用途。

步骤4:修改工厂以返回子类。

一旦编译好,所有测试都应该通过。

希望有所帮助。