Конкретные Типы или Интерфейсы для типов возврата?

Сегодня я пришел к фундаментальному парадоксу объектного стиля программирования, конкретных типов или интерфейсов.

Что является лучшими выборами для типа возврата метода: конкретный тип или интерфейс?

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

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

Каково правило Вашего ползунка?

Там кто-либо программирует принцип для этого?


ПРЕМИЯ: Это - пример того, что я имею в виду ReadOnlyCollection или IEnumerable для представления членских наборов?

5
задан Community 23 May 2017 в 12:25
поделиться

3 ответа

Мои практические правила:

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

2) Даже если метод объявлен как возвращающий конкретный тип, я бы закодировал вызывающие программы, чтобы они использовали тип интерфейса, когда это возможно:
InterfaceType i = xyz.methodThatReturnsConcreteType (); .

3) То, владею ли я вызывающим кодом, тоже имеет значение (внутренние или общедоступные API):

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

Другие соображения:

  • С интерфейсами тестирование может быть проще, поскольку я могу использовать фиктивный объект, реализующий интерфейс.
  • Есть внешний шанс, что я захочу вернуть прокси-объект (теперь я действительно ищу отговорки)

В общем,

  • я обычно возвращаю тип интерфейса , потому что я считаю, что преимущества слабого сцепления перевешивают удобство полного доступа к конкретному типу.
  • Однако я не против того, чтобы переход на возвращал конкретный тип в каждом конкретном случае, когда удобство перевешивает преимущества слабой связи.
6
ответ дан 18 December 2019 в 13:12
поделиться

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

public AccelerationResponse PressAccelerator(float force) {}

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

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

1
ответ дан 18 December 2019 в 13:12
поделиться

Практическое правило: в типах возвращаемых данных должно быть как можно более конкретным, а в типах параметров - как можно более неопределенными. Также отдайте предпочтение интерфейсам, так как позже вы можете обменять свою реализацию, если это необходимо, без изменения клиентов вашего API.

7
ответ дан 18 December 2019 в 13:12
поделиться