有没有一种很好的方法来重构使用重复条件语句的方法?

时间:2019-10-23 20:30:57

标签: java

我有两种类似的方法,它们具有重复的条件和重复的else块。我想重构它以共享相同的逻辑和其他块,但调用不同的方法。我该怎么办?

public void entryPoint1(...)
{
    if(nullCheckStuff) {}
        method1(stuff);
        method2(stuff);
    } else {
        //log error
    }
}

public void entryPoint2(...)
{
    if(nullCheckStuff) {
        method2(stuff);
    } else {
        //log error
    }
}

3 个答案:

答案 0 :(得分:3)

如果您使用Java 8或更高版本,则可能的解决方案是使用lambda。 您可以使用通用逻辑定义内部函数,该逻辑以Runnable作为参数:

private void commonLogic(Runnable action)
{
    if(nullCheckStuff) {
        action.run();
    } else {
        //log error
    }
}

然后您的原始功能看起来就像:

public void entryPoint1()
{
    commonLogic(() -> { method1(); method2()});
}

public void entryPoint2()
{
   commonLogic(() -> method2());
}

您可能还需要向commonLogic()函数添加更多参数,以传递nullCheckStuff表达式和错误处理块所需的数据。

答案 1 :(得分:0)

因此您的代码如下:

public void entryPoint1(...)
    {
        if(nullCheckStuff) {}
            method1(stuff);
            method2(stuff);
        } else {
            //log error
        }
    }

public void entryPoint2(...)
    {
        if(nullCheckStuff) {
            method2(stuff);
        } else {
            //log error
        }
    }

您必须取出if块并将其放在另一个函数中,假设checkNullStuff()

public bool checkNullStuff(<object, string, whatever> condition, int entrypoint) {
    bool everythingOk = true;
    //checks if null
    if(condition) {
      return !everythingOk;
     }
    //executes common methods
     method1(stuff);
    //if not empty check what to do

    switch(entrypoint) {
      case 1:
         method2(stuff);
        break;
      case 2:
        method3(stuff);
        break;
      default:

        everythingOk = false;
    }
    return everythingOk;
}

为什么我使用开关而不是if呢,如果您的入口点增加并且需要执行更常用的方法 和入口点功能:

public void entryPoint1(...)
{
    // here we check if went wrong, otherwise the functions were executed
    if(!checkNullStuff(nullCheckStuff, 1)) {}
       // code for when nullCheckStuff was not what we exepected
    } 
}

答案 2 :(得分:0)

如果您的方法还没有太多参数,则可以采用这种方式进行重构:

public void commonEntryPoint(..., boolean m1Condition) {
    if(nullCheckStuff) {
        if (m1Condition) {
            method1(stuff);
        }
        method2(stuff);
    } else {
        //log error
    }
}

干杯!