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

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

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

Любая информация приветствуется.

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Посмотрите, помогают ли эти очень популярные обсуждения:

Какова лучшая аналогия, помогающая программистам на основе не-oop-разработчиков?

Почему я хочу использовать интерфейсы?

Когда нужны интерфейсы?

Когда нужно использовать интерфейсы?

Какова цель интерфейса?

Хороший пример для интерфейсов

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

YourInterface foo = CreateYourInterface();

Ответ 6

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

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

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

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