Замена, вложенная, если операторы

29
задан Filipp W. 2 July 2018 в 11:30
поделиться

9 ответов

Ну, не непосредственно ответ на Ваш вопрос, так как Вы конкретно спрашиваете о переключателе/операторах выбора, но здесь являетесь подобным вопросом.

оператор Invert “if” для сокращения вложения

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

22
ответ дан Community 28 November 2019 в 01:32
поделиться

Один пример, который я всегда пытаюсь сделать, заменить в большой степени вложенный if's как это (на самом деле это не также плохой, но я видел их до 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;
}

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

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

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

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.
11
ответ дан paxdiablo 28 November 2019 в 01:32
поделиться

Как насчет цепочечной IFS?

Замена

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

    }
}

с

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

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

9
ответ дан 28 November 2019 в 01:32
поделиться

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

, Если код был:

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;}
6
ответ дан khivi 28 November 2019 в 01:32
поделиться

Для таблиц решений см. мой ответ на этот вопрос , или лучше все еще прочитайте главу 18 в Код, Завершенный 2 .

3
ответ дан Community 28 November 2019 в 01:32
поделиться

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

Так вместо этого (использование примера @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 массив.

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

1
ответ дан Paul Stephenson 28 November 2019 в 01:32
поделиться

Если и операторы переключения не просто OO. Они - условная процедурная логика, но делают очень хорошее задание! Если Вы хотите удалить эти операторы для большего количества подхода OO, комбинируют 'состояние' и шаблоны 'Дескриптора' .

0
ответ дан Anthony Mastrean 28 November 2019 в 01:32
поделиться

Вы могли бы также рассмотреть использование Шаблон "посетитель" .

0
ответ дан Drejc 28 November 2019 в 01:32
поделиться

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

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

            case j==2
             //action
            break

            case i>j
             //action
            break
           }
-1
ответ дан Jim C 28 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: