Классы должны избегать получения классов и вместо этого применять минимальные интерфейсы.
Вывод из классов прерывает инкапсуляцию :
. Среди прочего это затрудняет реорганизацию вашего кода.
Классы - это детали реализации, которые должны быть скрыты от других частей вашего кода. Короче говоря, System.List
представляет собой конкретную реализацию абстрактного типа данных, который может быть или не быть подходящим сейчас и в будущем.
Концептуально тот факт, что тип данных System.List
называется «списком», является немного красношейникой. A System.List
- измененная упорядоченная коллекция, которая поддерживает амортизированные операции O (1) для добавления, вставки и удаления элементов и операций O (1) для извлечения числа элементов или получения и установки элемента по индексу.
При проектировании структуры данных, чем проще интерфейс, тем более гибким является код. Просто посмотрите, как мощный LINQ для демонстрации этого.
Когда вы думаете «список», вы должны начать с самого себя: «Мне нужно представлять коллекцию бейсболистов». Итак, допустим, вы решили моделировать это с помощью класса. Сначала вы должны решить, какое минимальное количество интерфейсов, которое этот класс должен будет предъявить.
Некоторые вопросы, которые могут помочь в руководстве этим процессом:
IEnumerable
IReadonlyList
. ICollection
ISet
? IList
. Таким образом, вы не будете связывать другие части кода с деталями реализации вашей коллекции бейсболистов и сможете свободно изменять, как это реализовано, если вы уважаете интерфейс.
Используя этот подход, вы обнаружите, что код становится легче читать, рефакторировать и повторно использовать.
Реализация интерфейсов в современной среде IDE должна быть простой. Щелкните правой кнопкой мыши и выберите «Использовать интерфейс». Затем переместите все реализации в класс-член, если вам нужно.
Тем не менее, если вы обнаружите, что пишете много шаблонов, это потенциально потому, что вы подвергаете больше функций, чем вам должно быть. Это то же самое, что вы не должны наследовать от класса.
Вы также можете разрабатывать меньшие интерфейсы, которые имеют смысл для вашего приложения, и, возможно, всего лишь несколько вспомогательных функций расширения для сопоставления этих интерфейсов с любыми другими, которые вам нужны. Это подход, который я использовал в своем собственном интерфейсе IArray
для библиотеки LinqArray .
Ну, Включать противоречит где. Включайте говорит, "Загрузите все теги". Где говорит, "Загружают некоторые теги". Когда существует противоречие между запросом, и Включайте, запрос будет всегда побеждать.
Для возврата весь теги от любой объект с [по крайней мере 118] один тег == текст:
var items = from i in db.Items.Include("Tags")
where i.Tags.Any(t => t.Text == text)
orderby i.CreatedDate descending
select i;
(Непротестированный, поскольку у меня нет Вашего DB/модели)