Java 如何重构一个包含许多if结构的大函数?

Java 如何重构一个包含许多if结构的大函数?,java,if-statement,refactoring,dry,Java,If Statement,Refactoring,Dry,我们将应用程序A作为主应用程序。现在我们从应用程序B开始构建,它使用应用程序a功能的一个子集 应用程序A保持原样,而应用程序B仅使用A的一个子集 因此,我希望重构函数时不使用或使用尽可能少的重复,并且具有最大的可读性 所以函数看起来像这样(实际上更长,这是一个摘录): 你会怎么做?我会开发一个单元测试,验证现有的函数实现是否有效 然后开始增量更改代码,并在每次更改后运行测试。 在不了解代码结构的情况下,很难给出正式的推荐。但通常会尝试找到重复的代码片段,编写用参数实现此逻辑的方法,并将重复的片段

我们将应用程序A作为主应用程序。现在我们从应用程序B开始构建,它使用应用程序a功能的一个子集

应用程序A保持原样,而应用程序B仅使用A的一个子集

因此,我希望重构函数时不使用或使用尽可能少的重复,并且具有最大的可读性

所以函数看起来像这样(实际上更长,这是一个摘录):


你会怎么做?

我会开发一个单元测试,验证现有的函数实现是否有效

然后开始增量更改代码,并在每次更改后运行测试。 在不了解代码结构的情况下,很难给出正式的推荐。但通常会尝试找到重复的代码片段,编写用参数实现此逻辑的方法,并将重复的片段替换为新方法。等等等等


祝你好运

如果我是你,我会做一份关于这门课的报道。(例如或)这样Eclipse可以将覆盖线显示为绿色,这有助于您识别案例。有了这种帮助,分隔绿线并将它们拉入方法中就容易多了。

可以通过在单独的方法中提取一些逻辑来提高可读性。这是一种重构方法

Data prepareData() {
  if (this.bothId==1 || this.appAid=2 ) {
    handleCase1();  // <- you'll find better names for the methods      
  } else if (bothIsRelevant()) {
    handleCase2();
  }
}

private void handleCase1() {
  if(this.data==null) {
    appAdoSmth(); 
  }
  boolean merge=false; 
  if (this.data==null) { 
    merge=appAanalyze(data); 
  }
  bothPrepare(merge); 
}

private handleCase2() {
  if(appArelevant()) { 
    data=appAprepare(); 
  } else {
    data=prepareBoth(); 
  }     
  bothUpdateSomeValue();
}
数据准备数据(){
if(this.bothId==1 | | this.appAid=2){

handleCase1();//其他答案解决了如何重构代码的一般问题。他们提供了很好的建议,但我认为这不是你要问的

我想你是在问你问题中可能的代码重构

很难给出一个普遍适用,甚至是特别适用的答案(示例代码不是您真正的代码,要理解它的实际“含义”有点困难)

  • AndreasD给出了一种方法:将大型复杂嵌套的
    if
    分解为单独的方法

  • 另一种方法是使用Stragey设计模式。将每个应用程序特有的代码划分为策略类。例如:

    interface Strategy {
        Data prepareData();
    }
    
    class GeneralStrategy implements Strategy {
        Data prepareData() {
            // do general preparation
        }
    }
    
    class App1Strategy extends GeneralStrategy {
        Data prepareData() {
            // do app1-specific preparation
            super.prepareData();
            // do more app1-specific preparation
        }
    }
    

依此类推。

使用Eclipse。它有一个重构方法的选项。它会自动生成包含参数的新方法。但你必须考虑应该重构多少代码。我正在考虑使用一个带有函数prepareData()的抽象类。在prepareData()中对于那个抽象类,我用抽象函数替换所有特定于App的东西,并在扩展类中实现它们。换句话说,在一种情况下,这些函数将是空的,因为App B中没有发生任何事情。我的代码的主要问题是if(){…}if(){…}if(){…}if(){…}第一个if可以或不可以影响第二个if,第二个if也可以影响第三个if。这是一个丑陋的代码,不是我自己写的。但是:不是所有的东西都可以很好地重构“但是:不是所有的东西都可以很好地重构”-这是正确的。DRY有时是一个无法实现的理想。问题是:这不会简化功能。例如,对于appB,我将调用所有我在appB中从未使用过的东西。因此,我认为必须维护appB的人将不得不查看所有内容,尽管我知道我从未在appB中使用AppPrepare。
interface Strategy {
    Data prepareData();
}

class GeneralStrategy implements Strategy {
    Data prepareData() {
        // do general preparation
    }
}

class App1Strategy extends GeneralStrategy {
    Data prepareData() {
        // do app1-specific preparation
        super.prepareData();
        // do more app1-specific preparation
    }
}