gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:49:39 25 4
gpt4 key购买 nike

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

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

public void upload() {
}

public void download() {
}
}

我可以进行哪些自动重构来最大程度地减少需要执行的手动更改量?到目前为止我已经:

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

包装这些方法调用、适当更新其现有调用站点而不破坏我所有现有代码和测试的最佳方法是什么?

最佳答案

我想不出一种完全无痛的方法。我下面展示的方法仍然会导致一些编译错误,您需要在进入下一步之前修复这些错误。但我实际上认为这是很好的反馈,因为您会看到仍然需要修复的内容,并且会知道所有内容何时都已修复。

最简单的方法是首先修改父类以使用单个 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的所有结构。同样为了简单起见,您可以将示例构造函数设置为私有(private)以导致编译错误,从而帮助跟踪所有使用情况。

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

一旦一切都编译完毕,所有测试仍应通过。

希望有帮助。

关于java - 重构子类 - 如何组合实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20067669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com