Лично мне обычно не нравятся возвращаемые параметры по ряду причин:
- при вызове не всегда очевидно, какие параметры являются входными, а какие выходными
- Обычно вам нужно создать локальную переменную, чтобы перехватить результат, в то время как возвращаемые значения могут использоваться встроенными (что может или не может быть хорошей идеей, но по крайней мере у вас есть опция)
- мне кажется чище иметь функцию "in door" и "out door" - все входы идут сюда, все выходы выходят туда
- Мне нравится, чтобы мои списки аргументов были как можно короче
У меня также есть некоторые сомнения относительно техники пар / кортежей. В основном, часто нет естественного порядка возвращаемых значений. Как читатель кода узнает, является ли result.first частным или остатком? И разработчик может изменить порядок, что нарушит существующий код. Это особенно коварно, если значения имеют один и тот же тип, чтобы не возникало ошибок или предупреждений компилятора. На самом деле эти аргументы применимы и к возвращаемым параметрам.
Вот еще один пример кода, этот чуть менее тривиален:
pair<double,double> calculateResultingVelocity(double windSpeed, double windAzimuth,
double planeAirspeed, double planeCourse);
pair<double,double> result = calculateResultingVelocity(25, 320, 280, 90);
cout << result.first << endl;
cout << result.second << endl;
Имеет ли этот отпечаток скорость и курс или курс и скорость? Это не очевидно.
Сравните с этим:
struct Velocity {
double speed;
double azimuth;
};
Velocity calculateResultingVelocity(double windSpeed, double windAzimuth,
double planeAirspeed, double planeCourse);
Velocity result = calculateResultingVelocity(25, 320, 280, 90);
cout << result.speed << endl;
cout << result.azimuth << endl;
Мне кажется, это понятнее.
Так что я думаю, что мой первый выбор в целом - это техника структуры. Идея пары / кортежа, вероятно, является отличным решением в некоторых случаях. Я хотел бы избежать возвращаемых параметров, когда это возможно.