Ответ 1
Похоже, что бизнес-правило, которое вы пытаетесь применить, следующее:
P IMPLIES Q
Это логически эквивалентно:
(NOT P) OR Q
Таким образом, вы можете просто написать:
bool IsDry(bool isRaining, bool isWithUmbrella) {
return !isRaining || isWithUmbrella;
}
Вкл. (не) негативное мышление
В зависимости от предиката, также может быть проще сначала подумать с точки зрения его отрицания.
NOT (P IMPLIES Q)
Подставим теперь тождество:
NOT ((NOT P) OR Q)
Теперь мы можем применить Закон DeMorgan:
P AND (NOT Q)
Так как это отрицание, мы должны отрицать это, чтобы вернуться к положительному. Двойное отрицание может показаться запутанным сначала, но, вернувшись к примеру, мы имеем:
bool IsDry(bool isRaining, bool isWithUmbrella) {
bool isWet = (isRaining && !isWithUmbrella);
return !isWet;
}
Дополнительные советы
Вот несколько примеров обычного ретрансляции выражения boolean
:
BEFORE | AFTER
________________________________________|________________________________________
|
if (condition == true) ... | if (condition) ...
________________________________________|________________________________________
|
if (condition == false) ... | if (!condition) ...
________________________________________|________________________________________
|
if (condition) { | return condition;
return true; |
} else { |
return false; |
} |
________________________________________|________________________________________
|
if (condition1) { | return (condition1 && condition2
if (condition2) { | && condition3);
if (condition3) { |
return true; |
} else { |
return false; |
} |
} else { |
return false; |
} |
} else { |
return false; |
} |
________________________________________|________________________________________
|
return (condition1 && !condition2) || | return condition1 != condition2;
(condition2 && !condition1); | // or condition1 ^ condition2;
Обратите внимание, что предопределенный ^
в С# является эксклюзивным или оператором даже для интегральных типов (т.е. это не оператор экспоненциальности). Предопределенные &&
и ||
являются условные логические операторы, которые выполняют оценку "короткого замыкания".