Как заменить «перерыв»? - PullRequest
0 голосов
/ 19 июня 2020

В моей программе у меня есть структура, подобная следующей:

while (true) {
    int c;
    cout << "Type a command: ";
    cin >> command;
    switch (c) {
        case 1:
            // [...]
            if (!condition) break;
            // [...]
            if (!condition2) break;
            // [...]
            if (!condition3) break;
            // [...]
            break;

        case 2:
            // [...]
            break;

        default:
            break;
    }
}

Но наш профессор сказал нам никогда не использовать break, за исключением случая переключения для выхода ... Мне было интересно если есть лучший и умный способ заменить блок if(!condition) break;.

Моя основная цель - предотвратить выполнение программой определенных действий, если condition не проверено.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Чтобы избежать break, вам нужно использовать противоположное условие, и вместо разрыва потока контролировать его:

switch (c) {
    case 1:
        // [...]
        if (condition) {
            // [...]
            if (condition2) {
                // [...]
                if (condition3) {
                    // [...]
                }  // if the third condition is false, you will continue to the break.
            }  // if the second condition is false, you will continue to the break.
        } // if the first condition is false, you will continue to the break.
        break;
    // ...
}

EDIT

Чтобы избежать сложных условий, вы может использовать функции:

void condition_1_actions();
void condition_2_actions();
void condition_3_actions();

// ... main ...

case 1:
    if (condition) condition_1_actions();
    break;

// ... After main ...

condition_1_actions() {
    // do some actions
    // Calculate condition2 or pass it as parameter
    if (condition2) condition_2_actions();
}

condition_2_actions() {
    // do some actions
    // Calculate condition3 or pass it as parameter
    if (condition3) condition_3_actions();
}

condition_3_actions() {
    // do some actions
}
0 голосов
/ 19 июня 2020

Я уверен, что «ваш профессор» согласится: «если не сломано, не чините».

Лог c как написано ясно, и я предполагаю, что работает. Кроме того, как написано, это будет ремонтопригодно: Мне бы не пришлось радикально менять исходный код if when Мне нужно было добавить к нему новое условие. Просто оставь это в покое. Все, что вы слышите от профессора или кого-либо еще, является рекомендацией !

«Ясность» всегда является ключевой, потому что, как указано в go годах вашим источником -code будет добавлен многими другими. Мне нравится исходная идиома, потому что каждый из случаев четко различается: «сделай этот тест, а потом спасайся». (Может быть break или return в зависимости от ситуации.) Очень легко увидеть, как идет лог c, и столь же легко добавить к нему еще один регистр «в том же духе».

В конце концов - «для цифрового компьютера это абсолютно безразлично». (Как любят говорить Perl программисты, «есть несколько способов сделать это. ™») Но это может быть привлекательно для ваших [будущих ...] коллег. Здесь нет абсолютов. Просто постарайся быть с ними милым. Будьте «глупым-очевидным».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...