Структура функции: «если ошибка, досрочное возвращение» или «если ошибка, назначить, еще, назначить, вернуть назначенное значение»? - PullRequest
0 голосов
/ 13 мая 2019

В контексте встроенных систем, с учетом следующих структур функций:

  1. Условное присвоение возвращаемой переменной:

    int foo(int x)
    {
        int status;
    
        if (is_valid(x))
        {
            /* long computation with x */
            status = /* some result */;
        }
        else
            status = STATUS_ERROR;
    
        return status;
    }
    
  2. Раннееreturn:

    int foo(int x)
    {
        if (!is_valid(x))
            return STATUS_ERROR;
    
        /* long computation with x */
        return /* some result */;
    }
    

По моему мнению, последнее должно быть предпочтительнее первого:

  • Это не требует дополнительных и ненужных определений иприсваивания для status;
  • В нем четко говорится, что в случае ошибки ничего не делается, кроме как вернуть STATUS_ERROR, записанный в начале функции, самым ясным образомязыковые разрешения;
  • Позволяет код для обычного случая быть более плоским, поскольку он не должен быть отступ для if - else.

Однако,Я видел, как первый использовался в нескольких разных проектах.Я полагаю, что причины этого могут быть связаны с этапом отладки, позволяющим:

  • иметь единую точку возврата, что упрощает размещение точек останова;
  • проверкавозвращаемое в ближайшее время значение через status (в частности, при единственном возврате).

Прав ли я, предполагая, что это сделано для отладки?Есть ли другие причины, чтобы предпочесть 1. над 2.?1. Считается ли хорошей практикой в контексте разработки без использования металла?

Обратите внимание, что, в отличие от этого вопроса , перед возвратом кода ошибки вслучай недействительного x.

1 Ответ

0 голосов
/ 13 мая 2019

Если вы спросите, следует ли использовать один или другой, это будет вопрос, основанный на мнении, и его следует закрыть.

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

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

...