Что означает возвращаемый тип ICollection <Person>? - PullRequest
4 голосов
/ 10 сентября 2010

Я смотрю на некоторые примеры кода для Entity Framework 4, и автор создал метод, который возвращает ICollection .Я знаю, что ICollection - это интерфейс.Я знаю, что Персона - это тип объекта в коллекции.Я знаю, что возвращаю коллекцию Персонов.

Вопрос.Почему ICollection?Почему не List <>?Почему такой интерфейс используется?Я использовал интерфейсы как «чертежи» для классов, указав обязательные элементы, но я не совсем понимаю их использование здесь.

Ответы [ 3 ]

12 голосов
/ 10 сентября 2010

В публичном API часто лучше возвращать интерфейсы, а не конкретные классы.

Это позволяет реализации измениться позже. Например, он может на самом деле возвращать List<T> в данный момент. Однако позже может быть проведена оптимизация для возврата коллекции другого типа, которая может иметь более высокую эффективность использования памяти, потоковую передачу или одно из многих других преимуществ. Пока этот класс все еще реализует ICollection<T>, реализация может свободно переключаться, не вызывая критических изменений API.

0 голосов
/ 10 сентября 2010

Если ваши пользователи не хотят этого от вас, ваш API должен предоставлять как можно меньше подробностей реализации, и в этом случае использование List<Person> является подробностью реализации.Например, если вы или ваши пользователи знают, что они хотят получить доступ к результирующему набору по индексу, чем, возможно, лучше вернуть IList<Person> вместо ICollection<Person>, но если вы не уверены в пользовательских сценариях, вы должны представить самые базовые абстракции, так как выможет (т. е. в этом случае может быть достаточно IEnumerable<Person>).

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

0 голосов
/ 10 сентября 2010

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

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