Присвоение объекту - PullRequest
0 голосов
/ 23 января 2011

Есть ли разумное объяснение следующей технике:

//value HAS TO BE CHANGED those are requirements
int f(int value)
{
int tmp = value;//In order to not change "value" inside fnc - again requirements
//do something with tmp
return tmp;
}

int a = 0;
a = f(a);//here I assign to a anyway

вместо этого:

void f(int& value)
{
//do something with value
}

или это:

int f(int& value)
{
//do something with value
return value;
}

и вы согласитесьэтот первый фрагмент кода (в общем) пример плохой практики программирования?

Ответы [ 7 ]

3 голосов
/ 23 января 2011

Я не вижу причины для бита tmp = value, так как в первой версии параметр не является справочным, но я думаю, что часто рекомендуется брать параметр по значению, а затем возвращать обновленныйкопировать, вместо того, чтобы брать и изменять ссылки.Меньшее количество побочных эффектов облегчает анализ кода.

Так что я бы сказал, что самая хорошая версия такова:

int f(int value)
{
  //do something with value
  return value;
}

int a = f(a);

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

1 голос
/ 23 января 2011

Это зависит от того, что именно нужно программисту.Для этого использования a = f(a) я не вижу разницы, поскольку результат, очевидно, будет таким же.Но, в целом, использование типа a = f(a) + f(a) даст другой результат.Поэтому я не могу сказать, что это абсолютно плохая практика программирования.

1 голос
/ 23 января 2011

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

1 голос
/ 23 января 2011

Если вам нужно исходное значение value для справки.Например, если вы хотите выполнить какие-либо операции с ним, а затем сравнить, чтобы увидеть, было ли то же самое впоследствии.И вернуть значение.

Кажется немного неясным, но это имело бы смысл.

1 голос
/ 23 января 2011

Если вы действительно не хотите менять value, сделайте это const.Но, честно говоря, я не вижу причин для этого.

0 голосов
/ 23 января 2011

Вам может понадобиться исходное значение для некоторого использования, это зависит от того, что вы должны сделать. Например, временная переменная может использоваться для хранения одного из двух параметров во время «подкачки» (хотя в STD есть встроенная функция подкачки):

void swap(int& first, int& second) {
    int tmp = second;
    second = first;
    first = tmp;
}
0 голосов
/ 23 января 2011

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

avariable = f(avalue)

Только avariable изменится.

Вы можете использовать вторую версию функции следующим образом:

 f(&avalue)

Только avalue изменится.

Вы можете использовать последнюю версию функции следующим образом:

 avariable = f(&avalue)

Изменится avariable и avalue.

Все они имеют свое применение. Это зависит от того, что вам как программисту нужно от них. Спросите себя: какую переменную (и) нужно вернуть, измененную функцией?

...