Что лучше? Несколько операторов if, или один, если с несколькими условиями
Для моей работы я должен разработать небольшое приложение Java, которое анализирует очень большие XML файлы (строки ~ 300 тыс.) для выбора очень конкретных данных (с помощью Pattern
), поэтому я немного оптимизирую его. Мне было интересно, что было лучше между этими двумя фрагментами:
if(boolean_condition && matcher.find(string))
{
...
}
ИЛИ
if(boolean_condition)
{
if(matcher.find(string))
{
...
}
}
Дополнительные замечания:
- Эти операторы if выполняются на каждой итерации внутри цикла (~ 20k итераций)
-
boolean_condition
- это boolean
, вычисленный на каждой итерации с использованием внешней функции
- Если для параметра
boolean
установлено значение false
, мне не нужно проверять регулярное выражение для совпадений
Спасибо за помощь
Ответы
Ответ 1
Одно золотое правило, которое я придерживаюсь, - Избегайте вложенности, насколько я могу. Но если это связано с тем, что мое одиночное условие слишком сложное, я не против его развёртывания.
Кроме того, вы используете оператор короткого замыкания &&
. Поэтому, если логическое значение false, оно даже не будет пытаться выполнить сопоставление.
Итак,
if(boolean_condition && matcher.find(string))
{
...
}
- это путь!
Ответ 2
Следующие два метода:
public void oneIf(boolean a, boolean b)
{
if (a && b)
{
}
}
public void twoIfs(boolean a, boolean b)
{
if (a)
{
if (b)
{
}
}
}
создайте тот же самый байт-код для тела метода, поэтому не будет никакой разницы в производительности, означающей, что это чисто стилистический вопрос, который вы используете (лично я предпочитаю первый стиль).
Ответ 3
Оба способа в порядке, а второе условие не будет проверено, если первый из них является ложным.
Используйте тот, который делает код более понятным и понятным. Для двух условий первый путь более логичен и читабельен. Возможно, это не так, если 5 или 6 условий связаны с &&
, ||
и !
.
Ответ 4
Java использует короткое замыкание для этих логических операторов, поэтому оба варианта функционально идентичны. Поэтому, если boolean_condition
является ложным, оно не будет продолжаться до соответствия
В конечном счете, это сводится к тому, что вам легче читать и отлаживать, но глубокая вложенность может стать громоздкой, если в итоге вы получите огромное количество фигурных скобок в конце
Один из способов улучшить читаемость, если условие станет длиннее, - это просто разбить его на несколько строк:
if(boolean_condition &&
matcher.find(string))
{
...
}
Единственный выбор в этот момент - установить /amp; & и || в конце предыдущей строки или в начале текущего.
Ответ 5
Первый. Я стараюсь избегать, если такая вложенность, я думаю, что это плохой стиль/уродливый код и && будет shortcircuit и только тест с matcher.find(), если логическое значение true.
Ответ 6
В плане производительности они одинаковы.
то, что почти наверняка доминирует во времени в этом коде, matcher.find(string)
, потому что это вызов функции.
Ответ 7
Если вам нравится быть совместимым с Squar: Squad: S1066, вы должны свернуть, если инструкции избегать предупреждения, поскольку он указывает:
Сложные "if" утверждения должны быть объединены
Ответ 8
Я имею тенденцию видеть слишком много && и || объединившись в логический суп и часто являются источником тонких ошибок.
Слишком просто добавить еще один && или || к тому, что вы считаете правильным местом и нарушаете существующую логику.
Из-за этого, как общего правила, я стараюсь не использовать любой из них, чтобы избежать соблазна добавить больше с изменением требований.