消除许多if-else条件的最佳方法是什么?

时间:2019-05-11 14:44:42

标签: java if-statement design-patterns

我们正在将对象持久存储在数据库中,但是在需要检查少数条件之前,我正在使用if-else来执行这些操作,这是消除if-else语句的最佳方法。我们还在每个语句中设置一个映射的响应对象。

此外,将来我们必须在创建或更新之前检查其他条件。

Callable<Response> callableObj = () -> {
    if(isNew){
    if(checkCreatePermission()){
       if(checkDuplicate()) {
          return foundObejct();
       } else {
           persistNewObject();
       }
    } else {
        throw new Exception();
    }
} else {
    if(checkUpdatePermission()){
        udapteObject();
    } else {
        throw new Exception();
    }

}
};


4 个答案:

答案 0 :(得分:2)

您可以使用一些早期的回报/投掷。使代码更具可读性。

if(isNew){
    if(!checkCreatePermission()){
        throw new Exception();
    }
    if (checkDuplicate()) {
       return foundObejct();
    }
    persistNewObject();
} else {
    if(!checkUpdatePermission()){
        throw new Exception();
    }
    udapteObject();

}

答案 1 :(得分:1)

  

消除许多if-else条件的最佳方法...

一种更好的代码的方法是反转if条件,然后将条件代码分解为单独的方法。

下面的代码在功能上与您编写的代码等效。

public ... originalMethod() {
    if(isNew) handleNewObject();
    else handleExistingObject();
}

private ... handleExistingObject() {
    if (!checkUpdatePermission()) throw new Exception();
    updateObject();
}

private ... handleNewObject() {
    if (!checkCreatePermission()) throw new Exception();
    if (checkDuplicate()) return foundObject();
    persistNewObject();
    //... other steps.
}

答案 2 :(得分:0)

我建议将其分解为几种方法。不知道我是否能得到您所需的东西,但是可能是

    createOrUpdate() {
        if(isNew()){
            create();
        } else {
            update();
        }
    }

    create() {
        if(checkCreatePermission()){
            if(checkDuplicate()) {
                return foundObejct();
            } else {
                persistNewObject();
            }
        } else {
            throw new Exception();
        }
    }

    update() {
        if(checkCreatePermission()){
            udapteObject();
        } else {
            throw new Exception();
        }
    }

答案 3 :(得分:0)

您可以从CoR design pattern中获得启发。在下面的代码中,我假设要运行Callable,请调用其apply()方法:

Callable<Response> cError = () -> { throw new Exception(); };

Callable<Response> cUpdateObject = () ->
    !isNew && checkUpdatePermission() ? updateObject() : cError.apply();

Callable<Response> cPersistNewObject = () ->
    isNew && checkCreatePermission() && !checkDuplicate() ? persistNewObject() : cUpdateObject.apply();

Callable<Response> callableObj = () ->
    isNew && checkCreatePermission() && checkDuplicate() ? foundObject() : cPersistNewObject.apply();

通过这种方法,很容易看到导致每个响应的条件。

P / S:您可以在必要时将对checkCreatePermission()checkUpdatePermission()checkDuplicate()的呼叫缓存。