Я пишу API для внутренних нужд, и поэтому простота использования является одним из главных приоритетов. Я задаюсь вопросом, не заставляю ли я его слишком далеко, как в следующем примере.Функции со многими параметрами - создание их как структур
Функция для решения обратной геодезической задачи берет геокоординаты двух точек и вычисляет расстояние между ними и асимуты (углы) от каждой из точек к другой.
Простота в использовании-оптимизированной обычное решение может выглядеть примерно так (пожалуйста, не возражаю длину имен, я знаю, что есть место для совершенствования):
class Angle;
class GeoCoordinate;
...
struct InverseGeodeticOut
{
Angle forwardAzimuth;
Angle backAzimuth;
double distance;
};
InverseGeodeticOut inverseGeodetic(const GeoCoordinate &firstPoint,
const GeoCoordinate &secondPoint);
// or
void inverseGeodetic(const GeoCoordinate &firstPoint,
const GeoCoordinate &secondPoint,
InverseGeodeticOut *result);
Мой вопрос заключается в том, как разумно будет это будет сделать еще один шаг вперед, чтобы сохранить пользователю некоторый набор текста:
class Angle;
class GeoCoordinate;
...
struct InverseGeodetic
{
InverseGeodetic();
InverseGeodetic(const GeoCoordinate &firstPoint,
const GeoCoordinate &secondPoint);
Angle forwardAzimuth;
Angle backAzimuth;
double distance;
};
// so the usages would be
InverseGeodeticOut inverse = inverseGeodetic(firstPoint, secondPoint);
InverseGeodeticOut inverse;
inverseGeodetic(firstPoint, secondPoint, &inverse);
InverseGeodetic inverse(firstPoint, secondPoint);
Возможно, в этом конкретном примере разница слишком мала, чтобы быть стоит говорить, но мне интересно, если такие конструкты хорошо в целом.
У меня нет проблем с длинами имен переменных. Я бы предпочел сразу узнать, что я смотрю, тогда угадайте, что означает invGeoOut :) –
В общем, я не разрабатываю свой код для наименьшего количества ввода. Я разрабатываю свой код для ясности, удобочитаемости и повторного использования. Поэтому выберите версию, которая проще всего понять и использовать. –
Это рефакторинг [Ввести объект параметров] (http://sourcemaking.com/refactoring/introduce-parameter-object). Конечно, как только вы это сделаете, вы также сможете переместить поведение на него и прекратить передавать его, и не смей писать какие-либо геттеры/сеттеры. –