Подтвердить что ты не робот

Помогите рефакторингу этой функции С#

Я написал функции, которые выглядят так:

bool IsDry(bool isRaining, bool isWithUmbrella) {
    if (isRaining) {
        if (isWithUmbrella)
            return true;
        else
            return false;
    }
    else
        return true;
}

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

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

Спасибо за помощь, ребята! =)

4b9b3361

Ответ 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;

Обратите внимание, что предопределенный ^ в С# является эксклюзивным или оператором даже для интегральных типов (т.е. это не оператор экспоненциальности). Предопределенные && и || являются условные логические операторы, которые выполняют оценку "короткого замыкания".

См. также

Ответ 2

bool IsDry(bool isRaining, bool isWithUmbrella) 
{
    return (!isRaining || isWithUmbrella);
}

Ответ 3

bool IsDry(bool isRaining, bool isWithUmbrella)
{
    return !isRaining || isWithUmbrella;
}

Ответ 4

Здесь таблица истинности:

isRaining    isWithUmbrella    isWet    isDry 
true         true              false    true
true         false             true     false
false        true              false    true
false        false             false    true

Какой-то один ответ может быть:

var isWet = isRaining && !isWithUmbrella;
return !isWet;

Ответ 5

Подход, который я обычно делаю, - это последовательная утонченность. например сначала устраните внутреннее if-else:

bool IsDry(bool isRaining, bool isWithUmbrella) {
    if (isRaining)
        return isWithUmbrella;
    else
        return true;
}

то свернуть if if

bool IsDry(bool isRaining, bool isWithUmbrella) {
    return isRaining ? isWithUmbrella : true;
}

Ответ 6

Как я могу реорганизовать этот

С модульными тестами.

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

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

И в качестве дополнительной выгоды вы можете держать тесты навсегда, как документацию о том, что на самом деле делает метод. Это особенно полезно, если вы выбираете умную реализацию, например, фантастические булевы выражения - если вы почесываете голову, пытаясь следовать потоку, вы можете просто посмотреть на тесты и посмотреть: "О, я вижу, если я Передайте это и это, я получаю это."

Ответ 7

bool IsDry(bool isRaining, bool isWithUmbrella) {
 return isRaining ? isWithUmbrella : true;
}

Ответ 8

Всего за шесть кликов ReSharper упростит ваш код в одну строку.

Первые три щелчка будут морфировать

 if (isWithUmbrella)
                    return true;
                else
                    return false;

в

return isWithUmbrella;

Следующие три клика изменяют

    if (isRaining)
    {
        return isWithUmbrella;
    }
    else
        return true;

в

    return !isRaining || isWithUmbrella;

и вуаля, все готово.

Ответ 9

1 удалите "else" из "else return...;", поэтому вы получаете:

if (isRaining) {
    if (isWithUmbrella)
        return true;
    return false;
}
return true;

С небольшой логической работой.

if (isRaining) {
//    return (isWithUmbrella) ?
//        true :
//        false;
    return isWithUmbrella;
}
return true;

Затем вы можете быстро поместить его в простой оператор возврата...

//return (isRaining) ? isWithUmbrella : true;
//return (!isRaining) ? true : isWithUmbrella;
return (!isRaining) || isWithUmbrella;

Ответ 10

Совершенно очевидно

bool IsNotRaining {return isWithUmbrella}

: -)