Почему операторы LINQ определены как методы расширения в интерфейсе IEnumerable и не являются частью самого интерфейса? C# - PullRequest
3 голосов
/ 05 февраля 2020

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

Мой вопрос: когда мы знаем, что нам нужны операторы LINQ для каждого класса, реализующего IEnumerable, почему операторы LINQ не определяются непосредственно в интерфейсе IEnumerable? Зачем использовать методы расширения?

Спасибо.

1 Ответ

7 голосов
/ 05 февраля 2020

Причина в три раза:

  1. Изменение интерфейса IEnumerable является серьезным изменением для существующих потребителей. Поскольку. NET 3.5 (когда была представлена ​​LINQ) была не единственной версией. NET в производстве (на тот момент. NET 2.0 и. NET 1.1), команда Microsoft. NET имела быть особенно осторожным с изменениями.
  2. Одна фундаментальная часть в программном обеспечении для архитектуры - это понимание принципа проектирования Object SOLID принципа "Open-Closed" ("O" в SOLID). Также известен как Состав над наследованием . То есть, когда вы создаете программное обеспечение, предпочитайте, чтобы элементы le go могли работать вместе для составления требуемого результата le go, а не для блока le go, чтобы все эти функции были встроены в его наследование. цепь. Не каждый кирпич le go нуждается в функциональности колеса le go, но если вы используете наследование, каждый кирпич le go будет иметь доступ к этой функциональности - вероятно, не то, что вам нужно.

    By использование композиции и настройка синтаксиса нового метода расширения; Microsoft могла бы добавить функциональность в интерфейс Enumerable, не беспокоясь о существующих потребителях IEnumerable, и ни одна из этих реализаций не должна была бы реализовывать весь набор операторов LINQ, что им пришлось бы делать, если бы он был встроен в интерфейс IEnumerable.

  3. IEnumerable и IEnumerable<T> были названы просто: предоставить интерфейс для общего способа перебора коллекции. Таким образом, этот интерфейс может использовать каждый, кому нужно перебирать коллекцию. Если они начнут добавлять вещи в этот интерфейс, которые не имеют отношения к перечислению, потребители начнут путаться. "Что это за вещь снова?"

    Другим принципом в разработке программного обеспечения является принцип единой ответственности (S в SOLID), и когда у вас есть класс или интерфейс, отвечающий за две или несколько вещей, пришло время Пересмотрите, почему существует этот интерфейс.

...