Присоединитесь и включайте в платформу объекта

Предпочитают интерфейсы над классами

Классы должны избегать получения классов и вместо этого применять минимальные интерфейсы.

Inheritance breaks Encapsulation

Вывод из классов прерывает инкапсуляцию :

  • раскрывает внутренние подробности о том, как реализована ваша коллекция
  • ] объявляет интерфейс (набор публичных функций и свойств), который может быть неприемлем

. Среди прочего это затрудняет реорганизацию вашего кода.

Классы являются частью реализации

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

Концептуально тот факт, что тип данных System.List называется «списком», является немного красношейникой. A System.List - измененная упорядоченная коллекция, которая поддерживает амортизированные операции O (1) для добавления, вставки и удаления элементов и операций O (1) для извлечения числа элементов или получения и установки элемента по индексу.

Чем меньше Интерфейс, тем гибче код

При проектировании структуры данных, чем проще интерфейс, тем более гибким является код. Просто посмотрите, как мощный LINQ для демонстрации этого.

Как выбрать интерфейсы

Когда вы думаете «список», вы должны начать с самого себя: «Мне нужно представлять коллекцию бейсболистов». Итак, допустим, вы решили моделировать это с помощью класса. Сначала вы должны решить, какое минимальное количество интерфейсов, которое этот класс должен будет предъявить.

Некоторые вопросы, которые могут помочь в руководстве этим процессом:

  • Нужно ли иметь счет? Если не рассмотреть реализацию IEnumerable
  • Будет ли эта коллекция изменяться после ее инициализации? Если не считать IReadonlyList .
  • Важно ли, чтобы я мог обращаться к элементам по индексу? Рассмотрим ICollection
  • Является ли порядок, в котором я добавляю элементы в сборник, важно? Может быть, это ISet ?
  • Если вы действительно хотите эту вещь, тогда идите и реализуйте IList .

Таким образом, вы не будете связывать другие части кода с деталями реализации вашей коллекции бейсболистов и сможете свободно изменять, как это реализовано, если вы уважаете интерфейс.

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

Заметки об исключении котельной

Реализация интерфейсов в современной среде IDE должна быть простой. Щелкните правой кнопкой мыши и выберите «Использовать интерфейс». Затем переместите все реализации в класс-член, если вам нужно.

Тем не менее, если вы обнаружите, что пишете много шаблонов, это потенциально потому, что вы подвергаете больше функций, чем вам должно быть. Это то же самое, что вы не должны наследовать от класса.

Вы также можете разрабатывать меньшие интерфейсы, которые имеют смысл для вашего приложения, и, возможно, всего лишь несколько вспомогательных функций расширения для сопоставления этих интерфейсов с любыми другими, которые вам нужны. Это подход, который я использовал в своем собственном интерфейсе IArray для библиотеки LinqArray .

29
задан Foyzul Karim 29 July 2012 в 07:48
поделиться

1 ответ

Ну, Включать противоречит где. Включайте говорит, "Загрузите все теги". Где говорит, "Загружают некоторые теги". Когда существует противоречие между запросом, и Включайте, запрос будет всегда побеждать.

Для возврата весь теги от любой объект с [по крайней мере 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/модели)

Вот действительно хорошая, бесплатная книга на LINQ.

50
ответ дан Craig Stuntz 28 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: