Возврат double.nan в моей пользовательской функции: это хорошая практика?

(Есть похожий вопрос о возврате NaN, но он не отвечает на это)

Я начинающий программист (поэтому всегда не уверен, что является хорошей практикой), и я пишу метод, который вычисляет угол направления некоторого объекта, движущегося в 2-м пространстве (это для задачи Codingame). Для этого я написал метод

public static double GetAngle(double deltaX, double deltaY)
{
    if (deltaX==0 && deltaY==0) return double.NaN; //if not moving the direction is undefined
    //...
    //calculations etc
    return result;
}

Это хорошая практика - возвращать NaN таким образом? Кажется удобным и логичным (объект не движется, следовательно, нет скорости и, следовательно, нет вектора скорости), но я почему-то чувствую, что это может привести к трудностям для обнаружения ошибок позже, когда этот метод используется в других вычислениях (конечно, я буду использовать проверка NaN, где я помню, но все же). При необходимости этот метод мог бы вернуть 0 вместо NaN, и я мог бы с этим смириться.

Вы можете использовать что-то похожее на методы NET TryParse и вернуть bool

Ňɏssa Pøngjǣrdenlarp 10.08.2018 16:14

Спасибо, я прочитаю об этом. Хотя я думаю, что функция не должна возвращать два разных типа в зависимости от условий (если я правильно вас понял).

sinepuller 10.08.2018 16:39
Int32.TryParse - метод Microsoft считает, что это нормально
Ňɏssa Pøngjǣrdenlarp 10.08.2018 16:46

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

sinepuller 10.08.2018 17:39

Нет, скорее используйте это как образец: bool TryGetAngle(double X, double Y, out double angle)

Ňɏssa Pøngjǣrdenlarp 10.08.2018 17:44

Ах. Хорошая конструкция, я подумаю. Спасибо!

sinepuller 10.08.2018 18:05
0
6
146
2

Ответы 2

Хотя в некотором смысле это логично, я бы предположил, что более идиоматическим подходом было бы использование Nullable<double>, также записанного как double?:

public static double? GetAngle(double deltaX, double deltaY)
{
    if (deltaX == 0 && deltaY == 0)
    {
        return null;
    }
    // ...
    // Calculations etc
    return result;
}

Это, вероятно, будет более согласовано с тем, как вы выражаете «нерезультаты» для другого кода.

Помимо всего прочего, тот факт, что тип возвращаемого значения - double?, а не double, заставит вызывающих абонентов подумать о опции без результата - тогда как очень легко вызвать метод, который возвращает NaN и в конечном итоге случайно распространит это значение NaN в другом месте.

"Помимо всего остального" => вероятно, причина использовать его таким образом,

Paul Palmpje 10.08.2018 16:24

Ой! Я так не думал об этом. Раньше я читал, что двойники не допускают значения NULL, поэтому я подумал, что должен использовать NaN (который, как я думал, является своего рода заменой NULL для этого материала). Спасибо!

sinepuller 10.08.2018 16:32

Я часто возвращаю null, если результат не обнаружен, и всегда использую null. Если вы не можете вернуть здесь null, используйте double.NaN

Спасибо, это было моим намерением до того, как я узнал о типах, не допускающих значения NULL. Я думаю, что дубль? из рекомендации Дейзи Шиптон здесь идеально подойдет.

sinepuller 10.08.2018 16:36

Другие вопросы по теме