2013-05-29 3 views
3

Я пишу 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); 

Возможно, в этом конкретном примере разница слишком мала, чтобы быть стоит говорить, но мне интересно, если такие конструкты хорошо в целом.

+4

У меня нет проблем с длинами имен переменных. Я бы предпочел сразу узнать, что я смотрю, тогда угадайте, что означает invGeoOut :) –

+1

В общем, я не разрабатываю свой код для наименьшего количества ввода. Я разрабатываю свой код для ясности, удобочитаемости и повторного использования. Поэтому выберите версию, которая проще всего понять и использовать. –

+1

Это рефакторинг [Ввести объект параметров] (http://sourcemaking.com/refactoring/introduce-parameter-object). Конечно, как только вы это сделаете, вы также сможете переместить поведение на него и прекратить передавать его, и не смей писать какие-либо геттеры/сеттеры. –

ответ

2

Мне нравится ваш второй пример кода, хотя я нахожу публичный конструктор немного запутанным. Особенно, если есть другие способы построения InverseGeodetic. Я бы предпочел использовать статический заводский метод для его создания. Таким образом, вы можете дать более значимое имя метода:

struct InverseGeodetic 
{ 
    Angle forwardAzimuth; 
    Angle backAzimuth; 
    double distance; 

    static InverseGeodetic FromTwoPoints(const GeoCoordinate &, const GeoCoordinate &); 
}; 

// usage 
auto inverse = InverseGeodetic::FromTwoPoints(a, b); 

Но тогда может быть моя C# фон кровотечение через.

+0

На самом деле существует только одна форма обратной геодезической задачи, которая всегда берет в двух точках. Следовательно, не очень большая причина ожидать путаницы пользователя или будущего расширения. Но я все еще позаимствовал из вашего способа называть очки :) Спасибо! –

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