Вопрос логической логики: могу ли я привести эти 4 оператора if в один логический оператор? - PullRequest
0 голосов
/ 23 августа 2011

У меня вопрос логической логики. У меня есть следующие операторы if, которые можно объединить в одно логическое выражение. Пожалуйста помоги. Я потратил слишком много времени на это, и мне действительно стыдно спрашивать моих коллег.

if (denyAll == true & allowOne == false) return false;
if (denyAll == true & allowOne == true) return true;
if (denyAll == false & allowOne == false) return false;
if (denyAll == false & allowOne == true) return true;
return true; //should never get here

Я уверен, что есть элегантное решение.

Спасибо

Ответы [ 7 ]

9 голосов
/ 23 августа 2011

Будет ли return allowOne; добиваться цели?

5 голосов
/ 23 августа 2011

Я думаю, что это просто:

return allowOne;

Значение denyAll, похоже, не имеет значения:

denyAll   allowOne   result
false     false      false
false     true       true
true      false      false
true      true       true
2 голосов
/ 23 августа 2011

В дополнение к другим ответам, несколько основных советов:

вы можете использовать if (allowOne) вместо if (allowOne == true) или if (!allowOne) вместо if (allowOne == false)

Кроме того, при условных операциях вы обычно должны использовать оператор && вместо &, поскольку это допускает короткое замыкание. Например, в выражении if (denyAll && !allowOne), если denyAll равно false, вычисление !allowOne не будет беспокоить, поскольку выражение уже имеет значение false.

Кроме того, если ваш метод возвращает bool, как здесь, то вы часто можете упростить выражение до самого оператора return. Например это:

if (!denyAll && allowOne)
   return true;
else
   return false;

упрощается до этого:

return (!denyAll && allowOne);
1 голос
/ 23 августа 2011

Похоже, значение, которое действительно имеет значение, это ваш "allowOne" bool (поскольку, похоже, значение значения denyAlls не имеет значения)Предполагая это, вы просто проверяете, имеет ли значение allowOne значение true.

1 голос
/ 23 августа 2011

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

0 голосов
/ 23 августа 2011

Вы могли бы использовать что-то вроде этого:

if (denyAll && !allowOne) 
    return false;
return denyAll || allowOne;

Тем не менее, вы должны рассмотреть что-то, что является более читабельным.

Обновление: как отметили некоторые другие (и то, что я не сделалвидно, что вы фактически игнорируете denyAll all, поэтому return allowOne; - это все, что вам нужно.

0 голосов
/ 23 августа 2011

Ну, насколько я вижу:

If allowOne = true then return true;
return false;

сделает это, параметр "Запретить все", похоже, не влияет на результат и не должен быть там.

...