Сегодня я пришел к фундаментальному парадоксу объектного стиля программирования, конкретных типов или интерфейсов.
Что является лучшими выборами для типа возврата метода: конкретный тип или интерфейс?
В большинстве случаев я склонен использовать конкретные типы в качестве типа возврата для методов. потому что я полагаю, что конкретный тип более гибок для дальнейшего использования и выставляет больше функциональности.
Темная сторона этого: Связь. Ангельский: конкретный тип содержит серовато-синий интерфейс, который Вы были бы, собираясь возвращать первоначально, и дополнительная функциональность.
Каково правило Вашего ползунка?
Там кто-либо программирует принцип для этого?
ПРЕМИЯ: Это - пример того, что я имею в виду ReadOnlyCollection или IEnumerable для представления членских наборов?
Мои практические правила:
1) Изначально у меня метод возвращает тип интерфейса, потому что его всегда легко изменить на конкретный тип позже при необходимости. Сложнее вернуться в другую сторону.
2) Даже если метод объявлен как возвращающий конкретный тип, я бы закодировал вызывающие программы, чтобы они использовали тип интерфейса, когда это возможно:
InterfaceType i = xyz.methodThatReturnsConcreteType ();
.
3) То, владею ли я вызывающим кодом, тоже имеет значение (внутренние или общедоступные API):
Другие соображения:
В общем,
Интересный вопрос. Я считаю, что вы должны спросить себя, как можно использовать возвращаемые данные. Используя аналогию с вековой машиной, если бы у вас было
public AccelerationResponse PressAccelerator(float force) {}
Скорее всего, вы захотите вернуть интерфейс, а не класс. Вы можете интерпретировать этот ответ по-разному в зависимости от определенных условий.
Если вам гарантировано, что ваш возврат может быть использован только тем способом, который ожидается конкретной реализацией, тогда использование этого класса имеет смысл. Я не уверен в каком-либо общепринятом принципе, но мое практическое правило заключается в том, что если возвращаемый тип может быть повторно использован в различных реализациях, интерфейс имеет больше смысла.
Практическое правило: в типах возвращаемых данных должно быть как можно более конкретным, а в типах параметров - как можно более неопределенными. Также отдайте предпочтение интерфейсам, так как позже вы можете обменять свою реализацию, если это необходимо, без изменения клиентов вашего API.