предисловие
Некоторое время назад, когда я читал код, написанный другими, я обнаружил, что в теле появились некоторые бизнес-методы.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 фактически предоставила нам горячую клавишу для этого метода упаковки, как показано на следующем рисунке:
Эпилог
некоторое снижение личностиif-else
Обмен привычками кодирования здесь.Среди этих методов я лично считаю, что первый имеет наиболее очевидный эффект.вернуться пораньше, Во многих случаях ранний возврат также может снизить сложность фрагмента кода.
Конечно, если вам нужно использовать многоif-else
При управлении логикой хорошей привычкой является указывать комментарий в каждом условии.