Почему интерфейсы так распространены в приложениях .NET?

Недавно я начал работать над довольно крупным мейнстрим-проектом для предоставления публичной платформы электронной коммерции для клиента, которого я не могу раскрыть.

Я работаю с опытными разработчиками с многолетним опытом работы во многих проектах в Лондоне.

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

.NET не COM, это не платформа программирования на основе интерфейса. Я что-то упускаю или это просто стадный менталитет - годы IProgramming распространились как принятые нормы в среде .NET?

Спасибо

Лука

Ответ 1

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

Конечно, вы можете использовать абстрактные базовые классы, когда будет существовать общая функциональность между различными реализациями (и, если хотите, может быть еще интерфейс поверх абстрактного класса), но если все в абстрактном классе абстрактно, и нет полей, зачем использовать один выстрел в наследство посредством абстрактного класса? Где преимущество?

Ответ 2

Абстрактные классы и интерфейсы имеют два разных применения.
Первые используются для обеспечения наследования отцов/детей.
Вторые используются для указания конкретного поведения для реализации классов.
Я согласен. Интерфейсы слишком часто используются по неправильным причинам IMHO.

РЕДАКТИРОВАТЬ:
Кроме того, широкое использование интерфейсов может привести к проблемам бокса/распаковки:
Это может произойти, когда тип значения, реализующий интерфейс, передается методу, который имеет интерфейсный тип в качестве его параметра. Мне лично пришлось столкнуться с этой проблемой и реорганизовать код, чтобы избавиться от интерфейсов (хотя это было удобно для API) для повышения производительности, поскольку рассматриваемый класс использовался и передавался миллионы раз во время выполнения.

Ответ 3

Все зависит от того, чего вы хотите достичь. Основное различие между интерфейсами и абстрактными классами состоит в том, что класс может наследовать несколько интерфейсов, но только один абстрактный класс. Таким образом, обе имеют свою собственную цель.

Ответ 4

Реферат и интерфейс имеют разные способы использования.

Класс, который является производным, является "чем-то". Класс, реализующий интерфейс, может "что-то сделать".

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

например. Семейство классов System.Web.UI.Control - все они имеют общую функциональность для серверных элементов управления ASP.NET, но реализация в дальнейшем значительно отличается от семейства. Но они по-прежнему отображают HTML на веб-странице в конце дня.

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

например. IHttpModule, Провайдеры, System.Runtime.Remoting.Channels и т.д.

Ответ 5

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

Не всегда легко решить, что такое "правильный путь", используя иерархию классов или интерфейсный подход. Я рассматриваю интерфейсы как возможность повысить уровень абстракции: вместо указания метода, который требует, чтобы его аргумент был частью определенной иерархии классов, вы просто указываете, какие способности должен отображаться передаваемый объект (например, сортировка). Это часто позволяет вам формулировать алгоритмы более общим образом.

Ответ 6

Использование интерфейсов - очень парадигма OO. Интерфейсы могут абстрагировать реализацию, чтобы обеспечить более всестороннее тестирование, масштабируемость и более легкую сборку компонентов (что делает приложения более расширяемыми).

Разумеется, использование интерфейсов будет зависеть от требований (например, нефункционально: должно быть возможно построить модульные тесты для каждого уровня приложения n-уровня).

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

Одним из преимуществ базовых классов над интерфейсами является совместное использование функций во всех объектах определенного уровня (например, для многоуровневой архитектуры). Например. проверка общих полей или преобразование широко используемого типа данных.

Ответ 7

Программирование на интерфейсы является основным принципом OO. Он позволяет создавать Dependency inversion/inversion of control - т.е. реализации напрямую не зависят от других реализаций - вместо этого они зависят от других типов. Это позволяет легко подключать/подключать компоненты вашей системы. Это также повышает работоспособность системы, поскольку ее легко обеспечить макеты, соответствующие интерфейсу, если все ваше внедрение связано с интерфейсом. Кроме того, наличие системы, описанной в терминах нескольких интерфейсов, также облегчает понимание общих политик системы. Попытка объяснить это из группы базовых классов, которые имеют детали реализации, просто делает ее немного сложнее.

Абстрактные базовые классы - это не что иное, как способ совместного использования реализации, который является общим для нескольких подклассов. Но остерегайтесь избегать интерфейса и напрямую привязываться к абстрактному базовому классу - то, что вы делаете по этому поводу, заключается в том, что вы не только привязываетесь к интерфейсу абстрактной базы, но также всегда будете нести вокруг реализации. Есть много раз, когда то, что кажется сегодня данным, поворачивается на 180 градусов в течение нескольких месяцев/лет, и это такое "постоянное" решение, которое вы не должны воспринимать легкомысленно. На мой взгляд, стоимость всегда с интерфейсом намного меньше.

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

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

Полное раскрытие. Я не разработчик .NET. Я разработчик java/python, хотя у меня есть достойный доступ к .NET. На моем рабочем месте гораздо больше разработчиков .NET, чем Java-разработчиков, и мы довольно подробно обсудили эти обсуждения. В стороне, я нахожу это мнение, что интерфейсы злоупотребляют более распространенными в мире .NET, а не среди разработчиков Java, но это только моя перспектива.