Что лучше ?Несколько операторов if или один if с несколькими условиями - PullRequest
38 голосов
/ 10 марта 2011

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

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

OR

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

Больше точности:

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

Спасибо за вашу помощь

Ответы [ 8 ]

52 голосов
/ 10 марта 2011

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

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

Итак,

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

это путь!

19 голосов
/ 10 марта 2011

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

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

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

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

4 голосов
/ 10 марта 2011

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

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

2 голосов
/ 10 марта 2011

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

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

Один способ улучшить читаемость, если условие станет длиннее, - это просто разбить его на несколько строк:

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

Единственный выбор при этомДело в том, нужно ли ставить && и ||в конце предыдущей строки или начале текущей.

1 голос
/ 27 марта 2017

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

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

1 голос
/ 30 ноября 2016

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

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

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

1 голос
/ 10 марта 2011

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

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

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

1 голос
/ 10 марта 2011

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

...