int foo (type & bar); плохая практика? - PullRequest
3 голосов
/ 14 апреля 2010

Ну, вот и мы.Еще одна предложенная практика, по которой моя книга по С ++ имеет мнение.В нем говорится, что «функция с возвращаемым значением (не пустая) не должна принимать ссылочные типы в качестве параметра».Таким образом, в принципе, если бы вы реализовали такую ​​функцию:

int read_file(int& into){
   ...
}

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

void read_file(int& into, int& error){

}

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

Что вы думаете об этом?Моя книга полна дерьма?(снова)

Ответы [ 5 ]

10 голосов
/ 14 апреля 2010

Совет глупый. Прямое возвращаемое значение намного меньше и его легче набирать.

Прямой возврат:

if (read_file(...)) {
    ... handle problem ...
}

косвенный возврат:

int status;

read_file(..., status);
if (status) {
    ... handle problem ...
}

Редактировать: большая проблема в том, использовать ли вообще не-1009 * опорные параметры. Может быть удивительно, что побочные эффекты появляются из параметров. Один стандарт кодирования говорит, что опорные параметры должны быть const, а выходные параметры должны использовать указатели. Таким образом, читатель получает & в точке вызова, который выкрикивает «что-то происходит с этим параметром».

5 голосов
/ 14 апреля 2010

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

3 голосов
/ 14 апреля 2010

Это довольно неинтересный и субъективный стиль дебатов.Лично я предпочел бы вернуть std::pair, структуру или (в TR1) кортеж.

1 голос
/ 14 апреля 2010

Они пытаются научить вас практике «если вы возвращаете значение, не изменяйте переменные в параметрах вызова»

Вместо этого вы можете сделать что-то вроде следующего:

int read_file(const int& into){ ... }

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


Редактировать: Кроме того, как уже отмечали другие, если ваша цель состоит в том, чтобы иметь несколько возвращаемых значений, то, как правило, лучше либо сделать так, как предлагает книга, либо вместо этого создать «составной» тип возврата - использовать пара, ваш собственный тип и т. д.

0 голосов
/ 12 мая 2010
//somewhere deep in the code space
a = func(i); //i is modified inside func() or not?    
j = i; //what is this for? depends on the answer to the first question

Если код был написан в соответствии с правилом, предлагаемым в книге, вы можете быть уверены, что «i» не изменяется, просто взглянув на сайт вызова, поэтому код говорит вам больше, чем иначе

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

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