Что такое «интерфейсное программирование»? - PullRequest
18 голосов
/ 04 декабря 2009

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

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

Любая информация очень ценится.

Ответы [ 8 ]

29 голосов
/ 04 декабря 2009

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

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

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

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

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

3 голосов
/ 04 декабря 2009

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

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

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

YourInterface foo = CreateYourInterface();
3 голосов
/ 04 декабря 2009

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

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

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

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

2 голосов
/ 04 декабря 2009

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

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

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

1 голос
/ 04 декабря 2009

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

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

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

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

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

0 голосов
/ 24 мая 2017

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...