Является ли возврат значения функции из цикла 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;
}
Вопросы :
-
Есть ли стандарт, который запрещает это?
- это признанная плохая практика?
- если да, то почему?
4 ответа:
Нет такого стандарта, как этот, в мире c++. Однако в более специфической среде (например, в компании) могут применяться специализированные стандарты.
С учетом сказанного, это неплохая практика, В общем.
А) стандарт, который запрещает это?Нет.
Б) это считается плохой практикой?
Нет.
В) на вопрос уже дан ответ.
Кроме этого, он лежит под областью действия личных предпочтений, и вот мой - но это явно не часть реального ответа:
Вы хотите вернуть
true
, после того как вы сделали петлю над вашей строкой, так как вы могли бы сделать это элегантно внутри цикла? С помощью оператораif
, который говорит, что если это последняя итерация, то возвращаетtrue
в конце цикла?Я думаю, что это помещает больше строк кода в ваш файл, без какой-либо причины, и серьезно повреждает читаемость.
Существует школа мысли, которая говорит, что функция должна иметь один вход и одну точку выхода. Это облегчает некоторый статический анализ кода, но в C++, скорее всего, не служит никакой другой цели.
Этот тип мышления исходит в основном из C, где может быть много смысла выйти из функции через одну точку, чтобы гарантировать, что ресурсы, в конечном счете взятые функцией, должным образом очищены на выходе. Репликация этой очистки через несколько выходов считается хрупкая и трудная в уходе - согласен.
Однако в C++ предпочтительным способом управления ресурсами является RAII или использование RAII-классов, таких как общие указатели,string
иvector
. Таким образом, объем кода, необходимый для очистки ресурсов на выходе, часто равен нулю, поскольку он неявно выполняется в деструкторах объектов в локальной области видимости. Поэтому обычно нет никакого смысла применять однократный вход/однократный выход, если у вас нет для этого веской причины.
На этот счет могут быть разные мнения, и люди могут утверждать, что это создает "неинтуитивный" поток управления. Но для этого нетстандарта .
Лично я считаю, что это лучше, чем иметь дополнительную переменную и условие для выхода из кода. Вы хотите выйти из области в этот момент, и вы делаете это, возвращаясь из функции. Иногда я даже помещаю код в дополнительную функцию, чтобы иметь возможность использовать функцию выхода из области видимости из любого места с помощью вернуть.
Это также имеет преимущество в создании меньшего количества строк кода. И чем меньше строк кода, тем меньше возможностей ввести ошибку.
В некоторых стандартах кодирования можно найти такие вещи ,как "функция должна иметь только одну точку выхода". Часто Это было связано с процедурами очистки, но во времена умных указателей это больше не применяется.
Итак, как говорят другие ответы и комментарии: нет, такого стандарта нет. Кроме того, я не думаю, что это плохая практика.
Еще больше: я бы сказал, что вам не нужно "else", потому что если вы выходите из цикла/функции, обработка продолжается только в случае "else". Не в вашем случае это имеет большое значение, но если у вас есть несколько "если", это может сэкономить вам много вложенности.