Неоднозначность перегрузки функций - целые числа против двойных - PullRequest
5 голосов
/ 18 декабря 2009

Предположим, я хочу иметь 2 функции: одну, которая генерирует случайное целое число в заданном диапазоне, и одну, которая генерирует случайное двойное число в данном диапазоне.

int GetRandomNumber( int min, int max );
double GetRandomNumber( double min, double max );

Обратите внимание, что имена методов совпадают. Я пытаюсь решить, назвать ли функции, которые или ...

int GetRandomInteger( int min, int max );
double GetRandomDouble( double min, double max );

Преимущество первого варианта заключается в том, что пользователю не нужно беспокоиться о том, кому он звонит. Они могут просто вызвать GetRandomNumber с целыми или двойными числами и получить результат.

Второй вариант более явный в именах, но он показывает ненужную информацию вызывающей стороне.

Я знаю, это мелочно, но я забочусь о мелочах.

Редактировать: Как поведет себя C ++ в отношении неявного преобразования.

Пример:

GetRandomNumber( 1, 1 ); 

Это может быть неявно преобразовано для функции GetRandomNumber для двойной версии. Очевидно, я не хочу, чтобы это произошло. Будет ли C ++ использовать версию int перед двойной версией?

Ответы [ 8 ]

3 голосов
/ 18 декабря 2009

Я предпочитаю ваш второй пример, он явный и не оставляет двусмысленности в интерпретации. Лучше ошибиться в том, чтобы быть явным в именах методов, чтобы четко осветить назначение и функцию этого члена.

Единственным недостатком вашего подхода является то, что вы связали имя метода с типом возвращаемого значения, что не идеально, если вы хотите изменить тип возвращаемого значения одного из этих методов. Однако в этом случае я бы лучше добавил новый метод и не нарушал бы совместимость в вашем API.

2 голосов
/ 18 декабря 2009

Имя функции должно указывать, что делает функция; Я не вижу смысла в том, чтобы втиснуть типы в имена. Так что определенно пойдем на перегрузку - вот для чего она.

2 голосов
/ 18 декабря 2009

Я предпочитаю вторую версию. Мне нравится перегружать функцию, когда в конечном итоге две функции делают одно и то же; в этом случае они возвращают разные типы, поэтому они не совсем одно и то же. Еще одна возможность, если ваш язык поддерживает его, это определить его как универсальный / шаблонный метод, например:

T GetRandom<T>(T min, T max);
1 голос
/ 18 декабря 2009

Я обычно предпочитаю первый пример, потому что он не загрязняет пространство имен. Например, при вызове, если я передаю int, я ожидаю получить int. Если я сдал в парном разряде, я, вероятно, ожидаю получить двойной. Компилятор выдаст вам ошибку, если вы напишите:

//this causes an error
double d = GetRandomNumber(1,10);

так что это не очень большая проблема. и вы всегда можете привести аргументы, если вам нужен int, но для ввода есть двойные числа ...

1 голос
/ 18 декабря 2009

Я предпочитаю перегруженный метод. Посмотрите на метод Math.Min () в .NET. Имеет 11 перегрузок: int, double, byte и т. Д.

0 голосов
/ 18 декабря 2009

Я думаю, что идеальным решением было бы

Int32.GetRandom(int min, int max)
Double.GetRandom(double min, double max)

но, увы, метод статического расширения невозможен (пока?).

.NET Framwork предпочитает первый вариант ( System.Math class ):

public static decimal Abs(decimal value)
public static int Abs(int value)

Как и Эндрю, я лично предпочел бы второй вариант, чтобы избежать двусмысленности, хотя я думаю, что это дело вкуса.

0 голосов
/ 18 декабря 2009

Предполагая, что C ++, второй также позволяет избежать проблем с неоднозначностью. Если бы вы сказали:

GetRandomNumber( 1, 5.0 );

какой из них следует использовать? На самом деле это ошибка компиляции.

0 голосов
/ 18 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...