Предложение C # switch для логической переменной - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть фрагмент кода, который проверяет, является ли логическая переменная истинной и основывается на условии, я выполняю операции соответственно:

bool result = true;
bool isTrue = false;
CheckIsTrue(ref isTrue);

if (result)
{
   if (isTrue)
   //Perform action
}

У меня есть необходимость выполнить другую операцию, еслидля переменной задано значение false:

 if (result)
 {
    if (isTrue)
    {
      //Perform action
    } 
    else if(actionType == 6)
    {
      //Perform action, isTrue = false.
    }
 }

В целях удобства чтения и обслуживания я решил изменить приведенное выше значение на:

 if (result)
 {
     switch (isTrue)
     {
       case true:
               //perform action on isTrue
           break;
              default:
                   switch (actionType)
                   {
                      case 6:
                         //Perform action on 6
                       break;
                          default:
                        //Perform default action        
                       break;
                   }
            break;
     } 
}

У меня вопрос: разумно ли использовать swicth.. case...на булевых переменных?Это лучший способ, который я рассмотрел, чтобы упростить мой код, однако я не уверен, насколько это правильно.

Ответы [ 6 ]

0 голосов
/ 23 декабря 2018

Спасибо всем за помощь!Я закончил тем, что сделал по ряду причин:

 if (result)
 {
    if (isTrue)
    {
      //Perform action
    } 
    else 
    {
       switch (actionType)
       {
          case 6:
              //Perform action on 6
                break;
                   default:
                      //no condition mathed - write to log     
                break;
       }
    }
 }

Я предпочел этот подход, и причины:

Первый - Если типactionType изменения переменных, все, что мне нужно сделать, это небольшое изменение в регистре, вместо того, чтобы иметь дело с этим в предложении else-if.

Второе , если добавляется еще одно условие, мне просто нужно добавить еще один случай, вместо того, чтобы строить большое вложенное предложение else-if за эти годы.

Третий - проще вести запись журнала, если не найдено ни одного случая, внутри случая по умолчанию.

Я рассмотрел все ответы в течение выходных и принял ответ @Sergey Berezovskiy, поскольку опубликованный им ответ и ссылка помогли мне прийти к окончательному выводу.

0 голосов
/ 20 декабря 2018

Только с одним уровнем отступа и собственными именами переменных:

if (!actionShouldBePerformed) // instead of result
   return;

if (defaultActionShouldBePerformed) // insted of isTrue
{
   //Perform action
   return;
}

if (actionType == ActionType.NameOfType) // instead of magic number 6
   // Perform another action   

Дополнительное чтение: Заменить вложенные условные выражения с защитными предложениями

0 голосов
/ 20 декабря 2018

Я думаю, что оператор switch не является хорошим выбором для логических переменных.Просто сравните эти коды:

if(boolVariable)
{
  //...
}
else
{
  //...
}

и его эквивалент

switch(boolVariable)
{
  case true:
    //...
    break;
  case false: // or default:
    //...
    break;
}

IMO if оператор более понятен и удобен для чтения:)

0 голосов
/ 20 декабря 2018

Я бы не использовал предложение switch для значений bool.Более читабельная форма вашего кода будет выглядеть так:

        if (!result)
            return;

        if (isTrue)
        {
            // do action
        }
        else if (actionType == 6)
        {
            // do something
        }
        else
        {
            // do the default action
        }

Но это не хороший пример кода ООП, я бы посоветовал вам прочитать о принципах SOLID.

0 голосов
/ 20 декабря 2018

Это не совсем неправильно, но я бы не стал считать последний блок кода более читабельным.Лично я бы придерживался if ... else, вот так:

if (result) {
  if (isTrue) {
    // perform action
    return;
  } else if (actionType == 6) {
    isTrue = false;
    // perform action
    return;
  }
  // perform default action
}
0 голосов
/ 20 декабря 2018

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

switch (result)
{
    case true when isTrue:
        //Here is the code when both result and isTrue are true
    break;
    case true when actionType == 6:
        //Here is the code when both result and actionType is 6
    break;
    default:
        //Here defaultaction
    break;
}
...