Является ли плохой практикой возвращать разные типы при перегрузке метода? - PullRequest
7 голосов
/ 06 мая 2011

Данный пример:

Interface CustomersDao
    Function Get(ByVal Id As Integer) As Customer
    Function Get(ByVal Filter As Filter) As IList(Of Customer)
End Interface

Public Sub Main()
    Dim Customer As Customer = CustomersDao.Get(4)

    Dim Filter As New CustomersDao.Filter
    Filter.Category = 2
    Dim Customers As IList(Of Customer) = CustomersDao.Get(Filter)
End Sub

Разве плохая практика - возвращать разные типы одним и тем же методом?

Ответы [ 6 ]

6 голосов
/ 06 мая 2011

Я бы порекомендовал вызвать второй GetAll.

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

4 голосов
/ 06 мая 2011

Нет, я бы сказал, что это прекрасно.

3 голосов
/ 06 мая 2011

Да, я считаю, что это плохая практика.

Попробуйте найти перегрузку в .NET Framework , которая возвращает другой тип, Я не могуподумайте об одном .


ОБНОВЛЕНИЕ

Есть некоторые методы в .NET Framework как таковые DateTime.Subtract () , но они являются исключениема не правило, а только случаи, когда намерение совершенно очевидно .

3 голосов
/ 06 мая 2011

В вашем примере API имеет смысл и выглядит интуитивно понятным. Тем более что вы назвали аргументы функции Id и Filter, которые, IMO, подразумевают одно значение результата и коллекцию соответственно. Недостаток заключается в том, что в сценарии с intellisense вам придется проверять каждую перегрузку, чтобы увидеть, что она делает, а просто увидеть правильный метод для вызова в предлагаемом списке. Например. GetSingle(int id) против GetAll() против GetSubset(string filter)

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

0 голосов
/ 28 марта 2013

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

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

Отсутствующая альтернатива, которую здесь никто не предоставил, заключается в том, чтобы перегрузить оба элемента, возвращая список, даже если для id было бы глупо возвращать только список из одного элемента.Он отлично работает для jQuery, который является JavaScript-эквивалентом сильно перегруженной функции.

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

0 голосов
/ 06 мая 2011

Я хотел бы предположить, что это не лучшая практика, так как она не дает интуитивно понятного кода, если объявления переменных не видны сразу. Я бы обычно использовал GetById и GetForFilter, GetAll и т. Д., Которые лучше описывают происходящее действие.

...