Что лучше? Несколько операторов if или один if с несколькими условиями

для моей работы я должен разработать небольшое приложение Java, которое анализирует очень большие XML-файлы (~300k строк), чтобы выбрать очень конкретные данные (используя Pattern), поэтому я пытаюсь немного оптимизировать его. Мне было интересно, что было лучше между этими 2 фрагментами:

if(boolean_condition && matcher.find(string))
{
    ...
}

или

if(boolean_condition)
{
    if(matcher.find(string))
    {
        ...
    }
}

больше подробностей :

  • эти операторы if выполняются на каждой итерации внутри цикла (~20k итераций)
  • на boolean_condition is а boolean рассчитывается на каждой итерации с использованием внешней функции
  • если boolean установлено значение false, мне не нужно тестировать регулярное выражение для матчей

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

8 ответов


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

кроме того, вы используете короткого замыкания && оператора. Поэтому, если логическое значение false, оно даже не будет пытаться соответствовать!

и

if(boolean_condition && matcher.find(string))
{
    ...
}

- это путь!


следующие два метода:

public void oneIf(boolean a, boolean b)
{
    if (a && b)
    {   
    }
}

public void twoIfs(boolean a, boolean b)
{
    if (a)
    {
        if (b)
        {       
        }
    }
}

создайте точно такой же байтовый код для тела метода, чтобы не было никакой разницы в производительности, что означает, что это чисто стилистический вопрос, который вы используете (лично я предпочитаю первый стиль).


оба способа в порядке, и второе условие не будет проверено, если первое является ложным.

используйте тот, который делает код более читаемым и понятным. Только для двух условий первый способ более логичен и удобочитаем. Это может быть не так больше с 5 или 6 условиями, связанными с &&, || и !.


Java использует короткое замыкание для этих булевых операторов, поэтому оба варианта функционально идентичны. Следовательно, если boolean_condition имеет значение false, он не будет продолжать с

в конечном счете, это сводится к тому, что вам легче читать и отлаживать, но глубокая вложенность может стать громоздкой, если вы закончите с огромным количеством скобок в конце

один путь вы можете улучшить считываемость, если условие будет более длиной просто разделить его на несколько строк:

if(boolean_condition &&
   matcher.find(string))
{
    ...
}

единственный выбор в этот момент - поместить && и | / в конец предыдущей строки или в начало текущего.


первый. Я стараюсь избегать, если вложенность такая, я думаю, что это плохой стиль/уродливый код, и && будет короткое замыкание и только тест с matcher.найти (), если логическое значение равно true.


С точки зрения производительности, они одинаковые.

  • но даже если бы они не были

что почти наверняка доминирует во времени в этом коде, это matcher.find(string) потому что это вызов функции.


Если вы хотите быть совместимым правило гидролокатора squid:S1066 вы должны свернуть операторы if, чтобы избежать предупреждения, так как он гласит:

складные операторы " if " должны быть объединены


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

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

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