Уровень доступа к данным:Список разоблачения<>:плохая идея?

StackOverflow https://stackoverflow.com/questions/201791

Вопрос

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

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

public List<User> GetAllUsers() // non C# users: that means List of User :)

Знаете почему (гугл не помог)?Что вы обычно выставляете напоказ для подобных вещей?IList?IEnumerable?

Это было полезно?

Решение

Обычно лучше предоставить наименее мощный интерфейс, с которым пользователь все еще может осмысленно работать.Если пользователю просто нужны перечислимые данные, верните IEnumerable<User>.Если этого недостаточно, пользователь должен иметь возможность изменять список (внимание!не должно быть часто), верните IList<User>.

/РЕДАКТИРОВАТЬ:

Джоэл задает правильный вопрос в своем комментарии:Действительно, зачем предоставлять наименее мощный интерфейс вместо того, чтобы предоставить пользователю максимальную мощность?(перефразировано)

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

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

В качестве примера представьте, что эффективная реализация использует словарь и просто возвращает Values коллекция, которая не реализуется IList.

Другие советы

Определенно IS-что-то.Использование интерфейса уменьшит связанность и облегчит изменение деталей реализации уровня данных в будущем.Какой интерфейс зависит от обстоятельств.IList — это хорошо, но иногда вам может понадобиться функциональность ICollection или вы захотите указать значения, доступные только для чтения.

Вам следует хорошо подумать, прежде чем возвращать IEnumerable.Если базовый код использует «yield» для создания IEnumerable или использует LINQ, то в конечном итоге вы оставите открытыми все используемые ресурсы.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top