Альтернатива hashmap для оператора if if else в Java - PullRequest
0 голосов
/ 03 мая 2020

Может ли кто-нибудь помочь мне с альтернативой операторам if if else для потока управления? Или посоветуете хорошую статью?

Из того, что я видел, некоторые используют отображение или перечисления. Проблема у меня в том, что у меня есть несколько условий, т.е. if (условие1 && условие2 && условие3) ... и мне нужно сделать это для нескольких перестановок, и все 3 переменные должны быть проверены.

Пожалуйста, кто-то может Направьте меня в правильном направлении?

else if (String.Utils.isNotEmpty(payload.getKeyChange2TokenNumber()) && String.Utils.isEmpty(payload.getKeyChange1TokenNumber()) && String.Utils.isEmpty(payload.getKeyChange3TokenNumber()){
 String.format(return value dependant on outcome of validation)
}

Так что нет, если тогда операторы else, как я могу реализовать хэш-карту, чтобы определить, что следует возвращать вместо операторов if тогда else, возвращающих

Спасибо вы.

1 Ответ

0 голосов
/ 03 мая 2020

Итак, многие заканчивают тем, что стараются избегать использования выражений if, потому что считают, что «должен быть более простой и более чистый способ сделать это». Как бы то ни было, по сути, код - это просто набор операторов if на базовом уровне c.

Так что я бы не слишком беспокоился об их использовании, потому что, пытаясь использовать HashMaps или что-то еще, вы можете просто использовать ядерную бомбу, чтобы убить комара.

Следует иметь в виду, что вам не нужны вложенные операторы if / else, это становится трудно проверить.

Например, вы упоминаете, что должны это сделать. проверять переменные несколько раз. Так что не так с проверкой, что они не пусты в начале потока. Если они есть, выйдите или вернитесь с соответствующим результатом. Тогда вам больше не нужно делать проверки.

Кроме того, полезно использовать короткие функции, описывающие то, что вы пытаетесь сделать.

Вместо:

else if (String.Utils.isNotEmpty(payload.getKeyChange2TokenNumber())
    && String.Utils.isEmpty(payload.getKeyChange1TokenNumber())
    && String.Utils.isEmpty(payload.getKeyChange3TokenNumber()) {
    String.format(return value dependant on outcome of validation)
    }

Попробуйте:

 if (notEmpty(payload.getKeyChange2TokenNumber())
        && notEmpty(payload.getKeyChange1TokenNumber())
        && notEmpty(payload.getKeyChange3TokenNumber())) {
    String.format(return value dependant on outcome of validation)
}


private boolean notEmpty(String string) {
    return StringUtils.isNotEmpty(string);
}

Кроме того, если вышеупомянутая проверка действительно связана с ответом, связанным с доменом, используйте ее вместо этого. Например, предположим, что getKeyChange1TokenNumber, getKeyChange2TokenNumber, getKeyChange3TokenNumber все проверены, чтобы определить, предоставлены ли номера токенов обязательного изменения ключа, и вы не сможете продолжить, если это не так. Ваш код будет выглядеть так:

public void main() {
    if (mandatoryKeyChangeTokensNotProvided(payload)) {
        return "Mandatory Key Change Tokens not provided";
    }
    ...
}

private boolean mandatoryKeyChangeTokensNotProvided(Payload payload) {
    return isEmpty(payload.getKeyChange2TokenNumber())
            && isEmpty(payload.getKeyChange1TokenNumber())
            && isEmpty(payload.getKeyChange3TokenNumber());
        }
private boolean isEmpty(String string) {
    return StringUtils.isEmpty(string);
}

Попробуйте использовать язык домена в своем коде, чтобы он был более понятным для разработчика. Поэтому разработчик, читающий это, прочитает метод mandatoryKeyChangeTokensProvided и узнает, что он делает. Если они хотят знать, как он это делает, просто войдите в метод go и увидите, что выполнение пустой строки проверяет его. Надеюсь, это поможет вам.

Есть несколько способов сделать это, но все зависит от вашего домена. Например, вы говорите, что это проверка? Что плохого в том, что у вас есть класс Validator, который выполняет все эти проверки для вас? Но помните принцип KISS. Старайтесь не усложнять вещи.

...