Java 如何重构一个包含许多if结构的大函数?
我们将应用程序A作为主应用程序。现在我们从应用程序B开始构建,它使用应用程序a功能的一个子集 应用程序A保持原样,而应用程序B仅使用A的一个子集 因此,我希望重构函数时不使用或使用尽可能少的重复,并且具有最大的可读性 所以函数看起来像这样(实际上更长,这是一个摘录):Java 如何重构一个包含许多if结构的大函数?,java,if-statement,refactoring,dry,Java,If Statement,Refactoring,Dry,我们将应用程序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
}
}