Почему интерфейсы так широко используются в приложениях .NET? - PullRequest
13 голосов
/ 16 февраля 2011

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

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

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

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

Спасибо

Люк

Ответы [ 7 ]

20 голосов
/ 16 февраля 2011

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

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

4 голосов
/ 16 февраля 2011

Абстрактные классы и интерфейсы могут использоваться по-разному.
Первые используются для обеспечения наследования Отца / Дитя.
Вторые используются для указания конкретного поведения при реализации классов.
Согласен с интерфейсамислишком часто используются по неправильным причинам ИМХО.

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

2 голосов
/ 16 февраля 2011

Аннотация и Интерфейс имеют различное использование.

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

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

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

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

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

2 голосов
/ 16 февраля 2011

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

1 голос
/ 16 февраля 2011

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

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

0 голосов
/ 06 апреля 2012

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

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

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

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

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

0 голосов
/ 16 февраля 2011

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

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

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

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

...