Каков наилучший способ устранения многих условий if-else? - PullRequest
0 голосов
/ 11 мая 2019

Мы сохраняем объект в базе данных, но прежде, чем есть несколько условий, которые необходимо проверить, я использую 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 ]

2 голосов
/ 11 мая 2019

Вы можете использовать несколько ранних возвратов / бросков.Делает код немного более читабельным.

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

}
1 голос
/ 11 мая 2019

Лучший способ устранить множество условий 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.
}
0 голосов
/ 12 мая 2019

Вы можете получить вдохновение от 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(), если необходимо.

0 голосов
/ 11 мая 2019

Я бы предложил разделить его на несколько методов. Не уверен, что я получил то, что тебе нужно, но это может быть что-то вроде

    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();
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...