В контексте встроенных систем, с учетом следующих структур функций:
Условное присвоение возвращаемой переменной:
int foo(int x)
{
int status;
if (is_valid(x))
{
/* long computation with x */
status = /* some result */;
}
else
status = STATUS_ERROR;
return status;
}
Раннее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
.