Введение
Общая граница между элементами вычислительной системы
В вычислительной технике интерфейс — это общая граница, через которую два или более отдельных компонента компьютерной системы обмениваются информацией. Обмен может происходить между программным обеспечением, компьютерным оборудованием, периферийными устройствами, пользователями и их комбинациями. Некоторые аппаратные устройства, такие как сенсорный экран, могут как отправлять, так и принимать данные через интерфейс, в то время как другие, например, мышь или микрофон, могут предоставлять только интерфейс для отправки данных в систему.
Интерфейсы оборудования
Аппаратные интерфейсы присутствуют во многих компонентах, таких как различные шины, устройства хранения, другие устройства ввода-вывода и так далее. Аппаратный интерфейс определяется механическими, электрическими и логическими сигналами на интерфейсе, а также протоколом их последовательности (иногда называемым сигнализацией). Стандартный интерфейс, например SCSI, обеспечивает независимость разработки и внедрения вычислительного оборудования, такого как устройства ввода-вывода, от разработки и внедрения других компонентов вычислительной системы, предоставляя пользователям и производителям большую гибкость при создании вычислительных систем.
Интерфейсы программного обеспечения
Программный интерфейс может относиться к широкому спектру различных типов интерфейсов на разных "уровнях". Например, операционная система может взаимодействовать с аппаратными компонентами. Приложения или программы, работающие в операционной системе, могут нуждаться во взаимодействии посредством потоков данных, фильтров и конвейеров. В объектно-ориентированных программах объекты внутри приложения могут нуждаться во взаимодействии через методы.
На практике
Ключевым принципом проектирования является запрет доступа ко всем ресурсам по умолчанию, разрешая доступ только через четко определенные точки входа, то есть интерфейсы. Программные интерфейсы обеспечивают доступ к компьютерным ресурсам (таким как память, процессор, хранилище и т. д.) базовой компьютерной системы; прямой доступ (то есть не через хорошо спроектированные интерфейсы) к таким ресурсам программным обеспечением может иметь серьезные последствия — иногда катастрофические — для функциональности и стабильности. Интерфейсы между программными компонентами могут предоставлять константы, типы данных, типы процедур, спецификации исключений и сигнатуры методов. Иногда публичные переменные также определяются как часть интерфейса. Интерфейс программного модуля А намеренно определяется отдельно от реализации этого модуля. Последняя содержит фактический код процедур и методов, описанных в интерфейсе, а также другие "приватные" переменные, процедуры и т. д. Другой программный модуль B, например, клиент модуля A, взаимодействующий с A, вынужден делать это только через опубликованный интерфейс. Одним из практических преимуществ такой организации является то, что замена реализации A другой реализацией того же интерфейса не должна приводить к сбою в работе B — то, как A внутренне удовлетворяет требованиям интерфейса, не имеет значения для B, который заботится только о спецификациях интерфейса. (См. также принцип подстановки Лисков.)
В объектно-ориентированных языках
В некоторых объектно-ориентированных языках, особенно в тех, которые не поддерживают полноценное множественное наследование, термин "интерфейс" используется для определения абстрактного типа, который служит абстракцией класса. Он не содержит данных, но определяет поведение в виде сигнатур методов. Класс, имеющий код и данные для всех методов, соответствующих данному интерфейсу, и объявляющий об этом, считается реализующим этот интерфейс. Более того, даже в языках с одиночным наследованием можно реализовать несколько интерфейсов, и, следовательно, объект может одновременно относиться к разным типам. Таким образом, интерфейс – это определение типа; везде, где происходит обмен объектами (например, при вызове функции или метода), тип передаваемого объекта может быть определен на основе одного из реализованных им интерфейсов или базовых классов, а не конкретного класса. Такой подход позволяет использовать любой класс, реализующий этот интерфейс. Например, может быть использована заглушка, чтобы продолжить разработку до появления окончательной реализации. В другом случае, во время тестирования может быть использована имитация или макетная реализация. Такие временные реализации заменяются реальным кодом на более поздних этапах разработки. Обычно метод, определенный в интерфейсе, не содержит кода и, следовательно, не может быть вызван напрямую; он должен быть реализован неабстрактным кодом для выполнения при вызове. Интерфейс с именем "Stack" может определять два метода: push и pop. Он может быть реализован различными способами, например, FastStack и GenericStack – первый оптимизирован по скорости и работает со структурой данных фиксированного размера, а второй использует структуру данных, размер которой можно изменять, но с некоторой потерей производительности. Хотя интерфейсы могут содержать множество методов, они могут содержать только один или даже не содержать их вовсе. Например, язык Java определяет интерфейс, который имеет единственный метод; различные реализации используются для разных целей, включая интерфейсы , , , , а маркерные интерфейсы, такие как , не содержат методов и служат для предоставления информации о времени выполнения для обобщенной обработки с использованием рефлексии.
Программирование интерфейса
Использование интерфейсов позволяет применять стиль программирования, называемый программированием к интерфейсу. Суть этого подхода заключается в том, чтобы строить логику программы на основе интерфейсов используемых объектов, а не на деталях их внутренней реализации. Программирование к интерфейсу снижает зависимость от конкретных реализаций и повышает повторное использование кода. Доводя эту идею до крайности, инверсия управления предоставляет контексту возможность внедрять в код конкретные реализации интерфейсов, необходимых для выполнения задачи.
Пользовательские интерфейсы
Пользовательский интерфейс — это точка взаимодействия между компьютером и пользователем, включающая в себя различные способы взаимодействия (например, графику, звук, положение, движение и т.п.), посредством которых происходит обмен данными между пользователем и компьютерной системой.