Логика Java и с IF - PullRequest
       3

Логика Java и с IF

0 голосов
/ 26 февраля 2011

Я хочу выполнить 4 оператора «если», если это можно сформулировать так;Я хочу проверить четыре значения, прежде чем что-то случится.Я поставил:

if (a==1 && b==2 && c==3 && d==4) {
 foo;
}

Является ли сложение логических И, как этот, предпочтительным методом или четыре отдельных оператора IF, одно внутри другого, предпочтительнее?Логический метод ANDs кажется мне гораздо более эффективным, но есть ли причина / время / место, когда их не следует складывать таким образом?Или это всегда предпочтительный метод?

Ответы [ 8 ]

5 голосов
/ 26 февраля 2011

семантически

if (a == 1 && b == 2 && c == 3 && d == 4) {
    foo;
}

полностью эквивалентно

if (a == 1)
    if (b == 2)
        if (c == 3)
            if (d == 4)
                foo;

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


Единственная причина его разделения - если вам нужны отдельные операторы else:

if (a == 1) {
    if (b == 2) {
        ....
    } else {
        // a == 1, but b != 2
    }
} else {
    // a != 1
}
3 голосов
/ 26 февраля 2011

Наиболее читаемый способ является предпочтительным. В этом конкретном абстрактном примере один if определенно более читабелен. Вот пример, когда предпочтительнее использовать несколько if s:

if (someObject != null) {
  if (someObject.getType() == SomeClass.SomeType) {
    // do something
  }
  // maybe more code working with someObject here, much later
}

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

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

3 голосов
/ 26 февраля 2011

, в зависимости от того, что более читабельно и понятно.

следующий код

if(A)
    if(B)
        do something;
// no else

может быть более понятным, чем if(A & B), в зависимости от проблемы.

3 голосов
/ 26 февраля 2011

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

2 голосов
/ 26 февраля 2011

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

boolean condition = (a==1 && b==2 && c==3 && d==4);

if(condition)
{
    foo;
}
1 голос
/ 26 февраля 2011

В вашем примере лучшим решением будет именно то, что вы сделали.Вложение большого количества if s - это запах кода.Не обращайте внимания на скорость, она наверняка останется прежней, JIT позаботится о такой тривиальной оптимизации.Заботьтесь о удобочитаемости.

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

1 голос
/ 26 февраля 2011

Оператор условного оператора * & 1001 * (&&)"вычисляет свой правый операнд, только если значение его левого операнда равно true." Если вероятность true или false известна заранее, может быть некоторое преимущество в изменении порядка предикатов.

0 голосов
/ 26 февраля 2011

Ну, все зависит от конкретной ситуации. Объединение их всех в одно условие дает желаемый результат, но может оказаться неэффективным, если это будет проверено внутри цикла или любого другого блока кода, который выполняется действительно много. Хорошо разделить такое условие на подусловия (несколько операторов if), если это будет выполняться много, а вероятности того, что a, b, c и d имеют требуемое значение, не равны. Или если некоторые условия стоят дороже, чем другие (возможно, вызовы некоторых функций.

Например, если вероятность того, что a не будет равно 1, очень велика, разумно было бы сформулировать это так:

if(a == 1)
   if(...)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...