2010-09-10 2 views
4

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

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

ответ

12

Часто лучше возвращать интерфейсы вместо конкретных классов в открытый API.

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

+0

Так же, как IEnumerable и другие такие интерфейсы используются по всему .net. – Mark

+0

Хорошим примером является возврат IEnumerable при использовании 'yield return': http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx. С этой комбинацией вам не нужно заполнять весь список, прежде чем вы его вернете. Если пользователь интересуется только частью списка, будет заполнена только часть, которую они прочитали. Это также может упростить код, который генерирует список, так как вам не нужно создавать временный список для возврата результата. –

+1

Да - IEnumerable еще более гибкий, чем ICollection , но ICollection , в свою очередь, более гибкий, чем IList . Чем проще интерфейс, который вы возвращаете, тем больше возможностей для изменения реализации позже ... –

0

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

0

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

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

Смежные вопросы