Вопрос

Это связано с главой из красивый код.И в этой главе я читал о вложенных ifs.

Автор говорил о глубоко вложенных ifs как автор ошибок и менее читабельный.И он говорил о замене вложенных ifы с case заявления и таблицы принятия решений.

Кто-нибудь может проиллюстрировать, как удалить вложенные ifы с case (select case) и таблицы принятия решений ?

Это было полезно?

Решение

Ну, это не прямой ответ на ваш вопрос, так как вы специально спрашиваете о выражениях switch / case, но вот такой же вопрос.

Инвертировать оператор «if» для сокращения вложенности

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

Другие советы

Один пример, который я всегда пытаюсь сделать, это заменить сильно вложенные if, если это так (на самом деле этот пример не слишком плох, но я видел их на глубине 8 или 9 уровней в дикой природе):

if (i == 1) {
    // action 1
} else {
    if (i == 2) {
        // action 2
    } else {
        if (i == 3) {
            // action 3
        } else {
            // action 4
        }
    }
}

с этим:

switch (i) {
    case 1:
        // action 1
        break;
    case 2:
        // action 2
        break;
    case 3:
        // action 3
        break;
    default:
        // action 4
        break;
}

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

Таблицы решений, я считаю, просто устанавливают флаги, указывающие, какие действия необходимо предпринять позже. «Позднее» раздел - это простая последовательность действий на основе этих флагов. Я могу ошибаться (это будет не первый или последний раз: -).

Примером может быть (фаза установки флага может быть сложной, если она такова, потому что ее действия очень просты):

switch (i) {
    case 1:
        outmsg = "no paper";
        genmsg = true;
        mailmsg = true;
        phonemsg = false;
        break;
    case 2:
        outmsg = "no ink";
        genmsg = true;
        mailmsg = true;
        phonemsg = false;
        break;
    default:
        outmsg = "unknown problem";
        genmsg = true;
        mailmsg = true;
        phonemsg = true;
        break;
}

if (genmsg)
    // Send message to screen.
if (mailmsg)
    // Send message to operators email address.
if (phonemsg)
    // Hassle operators mobile phone.

Как насчет цепочек "если"?

Заменить

if (condition1)
{
    do1
}   
else
{
    if (condition2)
    {
        do2
    }
    else (condition3)
    {
        do3;

    }
}

с

if (condition1) {
   do1;
} else if (condition2) {
   do2;
} else if (condition3) {
   do3;
}

Это очень похоже на инструкцию switch для сложных условий.

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

Если код был:

if (condition1)
{
    do1
}   
else
{
    if (condition2)
    {
        do2
    }
    else (condition3)
    {
        do3;

    }
}

Можно написать так:

bool cond1=condition1;
bool cond2=condition2;
bool cond3=condition3;

if (cond1) {do1;}
if (!cond1 and cond2) {do2;}
if (!cond1 and cond3) {do2;}

Таблицы решений см. в моем ответе на этот вопрос или, что еще лучше, прочитайте главу 18 в Code Complete 2 . р>

Вы можете просто разорвать, например, когда часть проверки не удалась.

function validate(){
  if(b=="" || b==null){
      alert("Please enter your city");
      return false;
  }

  if(a=="" || a==null){
      alert("Please enter your address");
      return false;
  }
  return true;
}

Таблицы решений - это место, где вы храните условную логику в структуре данных, а не в самом коде .

Итак, вместо этого (на примере @ Pax):

if (i == 1) {
    // action 1
} else {
    if (i == 2) {
        // action 2
    } else {
        if (i == 3) {
            // action 3
        } else {
            // action 4
        }
    }
}

вы делаете что-то вроде этого:

void action1()
{
    // action 1
}

void action2()
{
    // action 2
}

void action3()
{
    // action 3
}

void action4()
{
    // action 4
}

#define NUM_ACTIONS 4

// Create array of function pointers for each allowed value of i
void (*actions[NUM_ACTIONS])() = { NULL, action1, action2, action3 }

// And now in the body of a function somewhere...
if ((i < NUM_ACTIONS) && actions[i])
    actions[i]();
else
    action4();

Если возможности для i не являются целыми числами с низким номером, вы можете создать справочную таблицу вместо прямого доступа к элементу i th actions array.

Этот метод становится гораздо более полезным, чем вложенные операторы if или switch , когда вы принимаете решение по десяткам возможных значений.

Операторы if и switch не являются чисто OO. Они являются условной процедурной логикой, но делают очень хорошую работу! Если вы хотите удалить эти утверждения для более оригинального подхода, объединяет шаблоны 'State' и 'Descriptor' .

Вы также можете использовать шаблон посетителей .

Вложено, если эквивалентно логическому оператору AND

if (condition1)
{
    if (function(2))
    {
        if (condition3)
        {
            // do something
        }
    }
}

Эквивалентный код:

if (condition1 && function(2) && condition3)
{
    // do something
}

В обоих случаях, когда выражение оценивает false, последующее выражение не будет оцениваться. Например, если условие1 ложно, функция () не будет вызываться, а условие 3 не будет оцениваться.

Другой пример, который допускают некоторые языки, это

           switch true{
            case i==0
              //action
            break

            case j==2
             //action
            break

            case i>j
             //action
            break
           }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top