2013-06-15 1 views
0

Недавно я просматривал некоторый код, который я поддерживаю, и я заметил практику, отличную от того, к чему я привык. В результате, мне интересно, какой метод использовать при выполнении раннего возврата функции.C/C++ (Другие языки тоже?) Условное раннее возвращение Хорошая практика кода

Вот несколько примеров:

Версия 1:

int MyFunction(int* ptr) 
{ 
    if(!ptr) { // oh no, NULL pointer! 
    return -1; // what was the caller doing? :(
    } 
    // other code goes here to do work on the pointer 
    // ... 
    return 0; // we did it! 
} 

Версия 2:

int MyFunction(int* ptr) 
{ 
    if(!ptr) { // oh no, NULL pointer! 
    return -1; // what was the caller doing? :(
    } else { // explicitly show that this only gets call when if statement fails 
    // other code goes here to do work on the pointer 
    // ... 
    return 0; // hooray! 
    } 
} 

В результате, я задаюсь вопросом, который считается "лучшей практики" для тех, из вас, кто пережил (и выжил) много обзоров кода. Я знаю, что каждый из них делает то же самое, но добавляет ли «еще» с точки зрения удобочитаемости и ясности? Спасибо за помощь.

+0

Правильно, я понимаю, но что-то получило читаемость мудрым явным другим? –

+1

Я не думаю, что это добавляет читаемость, но это мнение. – ChiefTwoPencils

+0

Думаю, мне пришлось бы изменить это, чтобы сказать, что это не добавит читаемости программисту (все еще мнение). – ChiefTwoPencils

ответ

0

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

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

В некоторых случаях я использовал один цикл, чтобы ряд начальных проверок мог использовать прерывание для выхода.

do { 
... 
} while (0); 

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

Так много будет зависеть от любых стандартов кода вашей организации. Мне нравится минимализм, поэтому я использую первую версию, которую вы предоставляете без остального.

Я мог бы также сделать что-то вроде следующего в меньшей функции говорят меньше, чем 20 или 30 строк:

int MyFunction(int* ptr) 
{ 
    int iRetStatus = -1; // we have an error condition 
    if (ptr) { // good pointer 
     // stuff to do in this function 
     iRetStatus = 0; 
    } 

    return iRetStatus; // we did it! 
} 

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

Смежные вопросы