2013-02-05 4 views
0

Пример 1:Single-Step Return Заявление или Multi-Step Return Заявление

int length() 
{ 
     return strlen(random_string); 
} 

Пример 2:

int length() 
{ 
     int str_length = 0; 
     str_length = strlen(random_string); 
     return str_length; 
} 

Вопрос:
Я встречал много функций, где одна строка кода может удовлетворить необходимое для этой функции, но я напоминаю что-то об исключении такого рода ярлыков.

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

+2

Для достойного компилятора это не должно иметь никакого значения. Выберите то, что подходит для вас более читабельным или поддерживаемым. –

+1

@AndyProwl: Тем не менее, NRVO .... –

+0

Лучше делать многострочные операторы, если функция выполняет несколько операций, а возможность изменения реализации не равна нулю. – Shmiddty

ответ

1

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

int length() 
{ 
    const int str_length = strlen(something); 
    printf("str_length = %d\n", str_length); 
    return str_length; 
} 

Или, если вы хотите, чтобы добавить некоторые дополнительные утверждают:

int length() 
{ 
    const int str_length = strlen(something); 
    assert(str_length >= 0); 
    return str_length; 
} 

кроме того, все это о том, что вы чувствуете, является наиболее подходящим

+1

Вы забыли 'const'! –

2

Я бы никогда не пошел на второй пример, потому что назначение инициализации-то просто занимает место без причины.

Что может сделать следующее:

int length() 
{ 
    const int str_length = strlen(arbitrary_string); 
    return str_length; 
} 

Это происходит по двум причинам:

  1. Вы позволяете ваш компилятор для выполнения Названы возвращаемого значения оптимизации; и
  2. Ваше возвращаемое значение теперь самодокументируется в силу наличия имени.

Однако, это более по умолчанию правило для меня.

В данном конкретном случае, фактический:

  1. Ваш тип возвращаемого значения является лишь ничтожные немного int, поэтому Названный Return-Value Optimization не допускается в любом случае, и будет в значительной степени бессмысленно, даже если бы это было; и
  2. Функция уже тривиальна и соответствует названию.

Так что я бы, используя первый пример:

int length() 
{ 
    return strlen(arbitrary_string); 
} 
+2

Еще одно преимущество: он может облегчить отладку, когда вы сможете увидеть, какое значение производит код, прежде чем вы его вернете. –

+2

Пример 2 действительно предотвратит NRVO? "в выражении return в функции с типом возвращаемого класса, когда выражение является именем энергонезависимого автоматического объекта (кроме функции или параметра catch-clause) с тем же самым cv-неквалифицированным типом, что и тип возврата функции , операция копирования/перемещения может быть опущена путем построения автоматического объекта непосредственно в возвращаемое значение функции « –

+0

@ Светлый ваш второй код более оптимизирован, а затем 1-й или оба одинаковы. ? – Arpit

1

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

Я бы никогда не предложил пример 2, хотя - инициализация до 0 бессмысленно. Середина лучше:

int length() 
{ 
    int str_length = strlen(random_string); 
    return str_length; 
} 

Однако ясно, что str_length не говорит вам больше, чем имя функции strlen делает.

-1

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

Всегда обращайтесь к читабельности.

+0

Всегда идите на удобочитаемость да, но в этом примере первый из них действительно лучше читается. Конечно, я не верну 300 строк символов, чтобы выиграть некоторое пространство. –

0

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

Как всегда могут быть исключения. Особенно, когда возвращаемое значение возникает из длинного и усложненного выражения. Тогда было бы полезно назвать некоторые промежуточные результаты.

0

чтобы ответить на этот вопрос ALW [если у вас есть строгие стандарты кодирования, чтобы следовать, конечно!] ays выбирают более легкое для чтения решение, это важно на каждом языке программирования, но это очень важно в C++.

Для вашего конкретного вопроса самым легким для чтения разработчиком C++ является вариант номер 1, он чист и прост. НО если это происходит, что одна строка вы должны написать, как:

return (classA *)(function1(data1)->function2())->function3(); 

В этом случае ВСЕГДА выбрать, чтобы разделить линию, потому что даже если вы понимаете, что он делает сейчас, вы можете иметь трудное время для выяснить, что там происходит в будущем.

Надеюсь, это поможет

+1

Этот плохой пример также ужасен для отладки, главным образом потому, что отладчики склонны «думать» в строках (в основном), например. Я не видел отладчика, где вы можете поставить точку останова где-то посередине линии. –

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