Задать вопрос
@Venesuella
BlackJack и ...

Часто ли вы используете интерфейсы?

Здравствуйте! Разбираюсь с темой интерфейсов, задавая вопрос "для чего, зачем нужны интерфейсы", часто получал ответ для слабой связанности компонентов/заменяемости компонентов, для лучшего тестирования. И вопрос такой часто ли вы окружаете интерфейсами свои слои приложения, или еще что то? Часто ли у вас было что ваши репозитории окруженные интерфейсами используют MSSQL, и есть еще такие же репозитории но уже использующие к примеру MongoDB, и где нито вы подменяете одно другим? Часто ли у вас было что у вас есть 2 разных слоя сервисов, окруженных интерфейсами, и опять же вы один подменяете другим? Такое реально возможно, если вряд ли, либо вероятность мала, получается интерфейсы в основном используются для тестирования, чтобы можно было использовать моки? Так ли, разъясните, разжуйте, приведите реальные примеры, очень хочу в теме разобраться
  • Вопрос задан
  • 927 просмотров
Подписаться 4 Оценить 5 комментариев
Ответ пользователя Александр Рыжов К ответам на вопрос (7)
RyzhovAlexandr
@RyzhovAlexandr
люблю .NET, интересуюсь также Java, BigData
Рискую повториться, но позволю описать свое видение.
Можно выделить несколько случаев, когда удобно использовать интерфейсы:
  • Абстракция, предполагающая несколько одновременно используемых реализаций. Например IEnumerable или как пример с паттерном "Стратегия" в первом комментарии.
  • Несколько взаимозаменяемых реализаций одной абстракции. Например логгер, можно логировать в файл, в табличку на форме, в БД.
  • Замена для тестирования. Хотя при желании это можно сделать и с виртуальными методами, но как правило, с интерфейсами удобнее, с учетом множественной реализации нескольких интерфейсов, но наследование только от одного базового класса, да и базовая реализация как правило тянет за собой клубок зависимостей.
  • Для следования принципу инверсии зависимостей. Очень рекомендую ознакомиться с принципами SOLID, два из которых как про интерфейсы - принцип инверсии зависимостей и принцип разделения интерфейсов. Если кратко про инверсию - потребители должны зависеть от абстракции, а не от реализации, в том числе на уровне сборок. Чтобы сократить и упорядочить зависимости между сборками, как правило выделяют сборку с интерфейсами и контрактами, которую используют сборки с реализацией, сборки потребители и сборки с тестами.


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