Является ли возврат значения функции из цикла for плохой практикой в C++? [закрытый]


Мой коллега только что посмотрел на мой код и сказал, что согласно "некоторому стандарту" возврат значения функции из цикла for является плохой практикой.

Функция выглядит примерно так:

bool CentralWidget::isBitFieldFree(const QString& define, int lsb, int msb)
{
    QString defineWithoutIndex = getDefineWithoutIndex(define);
    for (int i = lsb; i <= msb; i++)
    {
        if ((registerBitMap[defineWithoutIndex] >> i) & 1)
            return false; //Returning here early...
        else
            registerBitMap[defineWithoutIndex] |= 1 << i;
    }
    return true;
}

Вопросы :

    Есть ли стандарт, который запрещает это?
  1. это признанная плохая практика?
  2. если да, то почему?
4 3

4 ответа:

Нет такого стандарта, как этот, в мире c++. Однако в более специфической среде (например, в компании) могут применяться специализированные стандарты.

С учетом сказанного, это неплохая практика, В общем.


А) стандарт, который запрещает это?

Нет.

Б) это считается плохой практикой?

Нет.

В) на вопрос уже дан ответ.

Кроме этого, он лежит под областью действия личных предпочтений, и вот мой - но это явно не часть реального ответа:

Вы хотите вернуть true, после того как вы сделали петлю над вашей строкой, так как вы могли бы сделать это элегантно внутри цикла? С помощью оператора if, который говорит, что если это последняя итерация, то возвращает true в конце цикла?

Я думаю, что это помещает больше строк кода в ваш файл, без какой-либо причины, и серьезно повреждает читаемость.

Существует школа мысли, которая говорит, что функция должна иметь один вход и одну точку выхода. Это облегчает некоторый статический анализ кода, но в C++, скорее всего, не служит никакой другой цели.

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

Однако в C++ предпочтительным способом управления ресурсами является RAII или использование RAII-классов, таких как общие указатели, string и vector. Таким образом, объем кода, необходимый для очистки ресурсов на выходе, часто равен нулю, поскольку он неявно выполняется в деструкторах объектов в локальной области видимости. Поэтому обычно нет никакого смысла применять однократный вход/однократный выход, если у вас нет для этого веской причины.

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

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

Это также имеет преимущество в создании меньшего количества строк кода. И чем меньше строк кода, тем меньше возможностей ввести ошибку.

В некоторых стандартах кодирования можно найти такие вещи ,как "функция должна иметь только одну точку выхода". Часто Это было связано с процедурами очистки, но во времена умных указателей это больше не применяется.

Итак, как говорят другие ответы и комментарии: нет, такого стандарта нет. Кроме того, я не думаю, что это плохая практика.

Еще больше: я бы сказал, что вам не нужно "else", потому что если вы выходите из цикла/функции, обработка продолжается только в случае "else". Не в вашем случае это имеет большое значение, но если у вас есть несколько "если", это может сэкономить вам много вложенности.