Почему стандарт кодирования C / C ++ говорит, что в функции не должно быть многократного возврата? [Дубликат]

0

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

  • 2
    Я и многие другие считаю, что это ужасный способ писать код 100% времени. Я думаю, что его аргументация имела больше сил назад, когда она была представлена, но с тех пор уменьшилась.
  • 0
    Длинные функции с несколькими путями возврата трудно читать. Сохранение ваших функций как можно более короткими также помогает с удобочитаемостью.
Показать ещё 14 комментариев
Теги:

3 ответа

2

Я не согласен с тем, что функции никогда не должны иметь больше одного возврата. Бывают случаи, когда ранний возврат может облегчить чтение и обслуживание кода.

function DoStuff
{
  if ( simpleCondition ) return result;

  DoComplcicatedProcess
  return complicatedOperatotionResult;
}

Да, возможно, это условно, но в этом случае легко читать и потенциально более эффективно.

2

Сначала один возврат несколько прост в обслуживании и понимании. Второе, имеющее несколько возвратов, скорее всего, означает, что мы возвращаем значение напрямую, а не количество. Это делает функцию намного легче понять. Позвольте мне привести простой пример.

Пример множественного возврата

CalculateInterest(int cost)
{
    if (cost < 100)
       return cost * .2;
    else
       return cost * .3;
}

Такая же функция с одним возвратом

CalculateInterest(int cost) 
{
    float interest;

    if (cost < 100)
        interest = cost * .2;
    else
        interest = cost * .3;

    return interest;
}
  • 5
    Я не могу не сказать return cost * (cost < 100 ? 0.2 : 0.3); ,
  • 1
    @chris Мой пример, конечно, для иллюстрации сути, а не о том, как рассчитать проценты.
1

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

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

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

  • 0
    И характер тех строк, которые должны быть выполнены? Если это деструкторы, то это не имеет значения с RAII.
  • 4
    Является ли проблема «множественными возвратными утверждениями» проблемой или «длинной, сбивающей с толку функцией» проблемой? Вы лечите симптом или заболевание?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню