Подтвердить что ты не робот

Что лучше? Несколько операторов 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, мне не нужно проверять регулярное выражение для совпадений

Спасибо за помощь

4b9b3361

Ответ 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

Я имею тенденцию видеть слишком много && и || объединившись в логический суп и часто являются источником тонких ошибок.

Слишком просто добавить еще один && или || к тому, что вы считаете правильным местом и нарушаете существующую логику.

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