2013-09-24 3 views
3

Моя интуиция и практика в течение длительного времени заключались в том, чтобы избежать параметров, если это вообще возможно. Я считаю, что функция должна иметь одну логическую цель и что обычно подразумевает один возвращаемый тип (не возвращающий несколько вещей). Иногда желательно возвращать несколько вещей (например, std :: map :: insert). Я знаю, что это можно сделать в виде пары/кортежа или в качестве выходных параметров; аргумент которого из тех, кто используется, менее важен для меня.Выходят ли устаревшие параметры?

Каковы концептуальные, конструктивные или служебные причины для предпочтения выходных параметров или возвращаемых значений?

+0

как я думаю, что ваша функция может возвращать словарь значений или объект возвращаемых значений. например, если вы вычисляете деление, вам может понравиться знать некоторые вещи об этой операции, такие как bool_value, int_value, float_value и т. д. Но также вам может понравиться string_value или exception_value и так далее. – gaussblurinc

+0

Те, кто голосует, закрываются: я не спрашиваю, куда помещать пространство, до или после '*'. Лучшие практики в соответствии с этим вопросом должны иметь конкретные причины, оправдывающие их, и должны быть бесспорными разумными людьми. Это мои $ 0.02 в любом случае ... – David

ответ

6

Вы правы, параметры на самом деле не нужны, поскольку RVO делает возможным возврат по значению, даже с большими типами. И необходимость возвращать несколько вещей - это либо запах кода, либо может быть разумно упакована в структуру.

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

+0

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

+0

@ Давай это зависит от ситуации. Если вы хотите заняться задачей реорганизации существующего кода, аргументы pro не будут его обрезать, потому что, честно говоря, они недостаточно хороши. Изменение того, что работает, более рискованно, чем изменение, чтобы код выглядел красивее. По «запаху кода» я имею в виду, что он, возможно, был бы реализован более чистым способом (вот почему это зависит от ситуации). –

+0

'вероятно, возможно, было реализовано более чистым способом': почему используются параметры (часто), указывающие на бедные/нечистые реализации (или дизайн)? – David

0

В зависимости от контекста третьей альтернативой может быть передача обратного вызова. Обратный вызов может иметь несколько методов, если вызываемая функция «производит» несколько значений.

Хотя функция, которая принимает аргумент обратного вызова, действительно не соответствует определению «функции», также функция, возвращающая несколько значений, ИМО.

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