Поговорите о некоторых привычках кодирования в Java, чтобы уменьшить, если еще

Java

предисловие

Некоторое время назад, когда я читал код, написанный другими, я обнаружил, что в теле появились некоторые бизнес-методы.if-elseСлучай многоуровневой вложенности операторов.Во-первых, лично я не сторонник написанияif-elseУтверждения, я должен сказать, много раз при написании некоторой логики используютif-elseСудя по всему, код по-прежнему выглядит очень интуитивно понятным, но при злоупотребленииif-else, формируя многоуровневую вложенность или формируя, в котором каждый случай также содержит много логики, в этот раз с точки зрения читабельности использоватьif-elseЭто небольшая потеря, и иногда вам может не понадобиться так многоif-else, или другие методы кодирования могут быть использованы для уменьшенияif-elseЭффект .

уменьшатьif-elseЕсть много способов использования, например, уровень шаблона проектированиярежим стратегииилиМодель цепочки ответственности, И здесь я поделюсь с вами некоторыми из относительно простых, которые люди часто используют в повседневном процессе кодирования.От уровня привычки кодированияспособ уменьшить ненужноеif-elseИспользование.Так как я только новичок, если что-то не так в письме, пожалуйста, покритикуйте и поправьте меня.

Некоторые способы кодирования для уменьшения if-else

Способ 1: Возврат заранее

Сначала покажите пример кода:

if (condition1) {
    if (condition2) {
        return getSomething();
    } else {
        return 0;
    }
} else {
    return 0;
}

Модифицированный код выглядит следующим образом:

//这里最好对这个flag所判断的逻辑补充注释进行描述
boolean flag = !condition1 || (condition1 && !condition2)
if(flag) {
	return 0;
}

if (condition1 && condition2) {
    return getSomething();
} 

Если есть логика, которая, как известно, возвращает фиксированное значение при определенных условиях, эту часть логики можно выделить как независимую.if-else block, и помещены в др.if-else blockперед , при выполнении конкретного условия, непосредственно заранееreturnФиксированное значение. Наиболее прямым эффектом этого метода является снижениеif-elseКоличество вложений в .


Способ 2: используйте тернарный оператор

Давайте сначала возьмем пример, вот пример бизнес-сценария:

Запросите список URL-адресов изображений комментария (если есть, список URL-адресов изображений комментариев сохраняется в таблице комментариев в формате строки массива JSON)

Код перед модификацией выглядит следующим образом:

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

String imgListStr = comment.getImgList();
if(StringUtils.isEmpty(imgListStr)) {
    return null;
}

return JSON.parseArray(imgListStr, String.class);

После модификации:

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

String imgListStr = comment.getImgList();
return StringUtils.isEmpty(imgListStr)) ?
    null : JSON.parseArray(imgListStr, String.class);

Способ 3: используйте утверждение Assert

В процессе написания бизнес-кода, если вам нужно судить о каких-то конкретных условиях, а когда условия не выполняются, вам нужно бросить исключение.Для этого сценария, помимо использования вышеприведенного примера тернарного оператора в примереifобразом, вы также можете использовать Spring Framework, чтобы предоставить намAssertкласс инструмента.

Наиболее часто используемые API:

  • isTrue(boolean expression , String message) :когдаexpressio == false, будет выброшено исключение, ненормальноеmessageвторой входной параметр;
  • void notNull(@Nullable Object object, String message) :то же, что и выше, когдаobject == null, будет выброшено исключение;
  • void notEmpty(@Nullable Collection<?> collection, String message) :Так же, как указано выше, когда объект коллекцииnullИли, когда элемент коллекции пуст, будет выдано исключение.
  • .....

Есть много других методов, можно прямо посмотреть на анализ исходного кода, конечно, по фактуisTrue()Достаточно, если вам нужно больше семантики, вы можете использовать соответствующий API.

Код до модификации:

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

Модифицированный код:

 Assert.isTrue(Objects.nonNull(comment),"评论不存在或已被删除");
 Assert.notNull(comment,"评论不存在或已被删除");

В настоящее время метод инструмента Assert может вызывать только одно исключение.java.lang.IllegalArgumentException, если вам нужно настроить выбрасываемое исключение, этот метод неприменим.


Способ 4: использовать необязательно

Необязательный — это новая функция java8, эквивалентная объекту.контейнер, в основном используется для объектаnullПроверка значения и последующие операции могут быть объединены в цепочку после проверки, например: генерация исключений,nullзаменить и т.п.

Среди них некоторые из методов, которые я лично использую:

  • static <T> Optional<T> ofNullable(T value) :Используйте Необязательно, чтобы обернуть объект;
  • T orElse(T other) :Объект в необязательном порядкеnullПри возвращается объект входного параметра.
  • T orElseGet(Supplier<? extends T> other) :Объект в необязательном порядкеnullвремя, возвращениеSupplierпредоставленная стоимость;
  • T orElseThrow(Supplier<? extends X> exceptionSupplier) :Объект в необязательном порядкеnullвремя, бросайsupplierПредоставленное пользовательское исключение

Образец кода:

Message message1 = Optional.ofNullable(getById(messageId))
    .orElseThrow(() -> new RuntimeException("消息不存在!"));

Message message2 = Optional.ofNullable(getById(messageId))
    .orElse(new Message());

Message message3 = Optional.ofNullable(getById(messageId))
    .orElseGet(Message::new);

Поскольку во многих сценариях мне часто приходится выполнять оценку нулевого значения, когда данные запроса завершаются из базы данных, результат запроса необходимо использовать для оценки нулевого значения.Поскольку в моей компании используется структура уровня сохраняемости, mybatis, в отличие от Spirng Boot 2.x Версия JPA по умолчанию, такая как метод уровня DAO, поддерживает возвращаемое значение Необязательно, поэтому, если вам нужно использовать Необязательный здесь, вы можете только вручную использовать первый метод, указанный выше, для переноса результата запроса.

Конечно, IDEA фактически предоставила нам горячую клавишу для этого метода упаковки, как показано на следующем рисунке:

Animation.gif

Эпилог

некоторое снижение личностиif-elseОбмен привычками кодирования здесь.Среди этих методов я лично считаю, что первый имеет наиболее очевидный эффект.вернуться пораньше, Во многих случаях ранний возврат также может снизить сложность фрагмента кода.

Конечно, если вам нужно использовать многоif-elseПри управлении логикой хорошей привычкой является указывать комментарий в каждом условии.