Что такое "интерфейсное программирование"?

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

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

Любая информация с благодарностью.

8 ответов

Решение

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

Это означает, что:

  • Вы можете написать свой код перед реализацией реальной зависимости
  • Вы можете тестировать с помощью насмешек очень легко (без насмешек над классами, что уродливо)
  • Понятно, что вы зависите от API, а не от реализации (т.е. у вас более слабая связь)

Глава 6 "Практического проектирования API" Ярослава Тулаха называется "Код против интерфейсов, а не реализаций". Это объясняет, что, кодируя интерфейс, а не конкретную реализацию, вы можете отделить модули (или компоненты) в системе и, следовательно, повысить качество системы.

Бертран Мейер из OOSC2 ясно объясняет, почему "закрытие" системы и повышение ее модульности повышает ее качество.

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

YourInterface foo = CreateYourInterface();
foo.DoWork();
foo.DoMoreWork();

CreateYourInterface () возвращает конкретную реализацию YourInterface. Это позволяет изменить функциональность приложения, изменив одну строку:

YourInterface foo = CreateYourInterface();

Если вы поищите интерфейсы в Google, вы найдете много информации о том, насколько полезными могут быть интерфейсы.

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

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

Этот метод является стандартным для любого нового проекта программирования, и каждый примет это как должное.

Это то, что я не рекомендую интенсивно использовать в разработке на C#.

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

До.NET это было очень распространено, так как лучший способ получить повторно используемые компоненты в Windows был через COM, который работал везде через интерфейсы. Однако, учитывая способность.NET поддерживать несколько языков в одной среде выполнения (CLR), а также превосходную поддержку управления версиями по сравнению с собственным кодом, полезность программирования на основе интерфейса значительно снижается при программировании на C# (если вы не пытаетесь создать компоненты COM, в этом случае вы все равно будете создавать интерфейсы COM косвенно из ваших классов C#).

Программирование на основе интерфейса можно рассматривать как разделение реализации функциональности и способа доступа к ней.

Вы определяете интерфейс
interface ICallSomeone { public bool DialNumber(string number); }

а ты пишешь свою реализацию

public class callsomeone: ICallSomeone {
public bool DialNumber(string number) {
//dial number, return results}}

Вы используете интерфейс, не заботясь о реализации. Если вы измените реализацию, то все равно, потому что она просто использует интерфейс.

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

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

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

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

Другие вопросы по тегам