В вычислительной технике интерфейс — это общая граница, через которую два или более отдельных компонента компьютерной системы обмениваются информацией. Обмен может осуществляться между программным обеспечением , компьютерным оборудованием , периферийными устройствами , людьми и их комбинациями. [1] Некоторые компьютерные аппаратные устройства, такие как сенсорный экран , могут как отправлять, так и получать данные через интерфейс, в то время как другие, такие как мышь или микрофон, могут только предоставлять интерфейс для отправки данных в данную систему. [2]
Аппаратные интерфейсы существуют во многих компонентах, таких как различные шины , устройства хранения данных , другие устройства ввода-вывода и т. д. Аппаратный интерфейс описывается механическими, электрическими и логическими сигналами на интерфейсе и протоколом для их упорядочивания (иногда называемым сигнализацией). [3] Стандартный интерфейс, такой как SCSI , разделяет проектирование и внедрение вычислительного оборудования, такого как устройства ввода-вывода , от проектирования и внедрения других компонентов вычислительной системы, тем самым предоставляя пользователям и производителям большую гибкость при реализации вычислительных систем. [3] Аппаратные интерфейсы могут быть параллельными с несколькими электрическими соединениями, переносящими части данных одновременно, или последовательными , когда данные отправляются по одному биту за раз. [4]
Программный интерфейс может относиться к широкому спектру различных типов интерфейсов на разных «уровнях». Например, операционная система может взаимодействовать с аппаратными средствами. Приложениям или программам, работающим в операционной системе, может потребоваться взаимодействие через потоки данных , фильтры и конвейеры. [5] В объектно-ориентированных программах объекты внутри приложения могут потребоваться для взаимодействия через методы . [6]
Ключевым принципом проектирования является запрет доступа ко всем ресурсам по умолчанию, разрешая доступ только через четко определенные точки входа, т. е. интерфейсы. [7] Программные интерфейсы обеспечивают доступ к компьютерным ресурсам (таким как память, ЦП, хранилище и т. д.) базовой компьютерной системы; прямой доступ (т. е. не через хорошо спроектированные интерфейсы) к таким ресурсам со стороны программного обеспечения может иметь серьезные последствия — иногда катастрофические — для функциональности и стабильности. [ необходима цитата ]
Интерфейсы между программными компонентами могут предоставлять константы , типы данных , типы процедур , спецификации исключений и сигнатуры методов . Иногда публичные переменные также определяются как часть интерфейса. [8]
Интерфейс программного модуля A намеренно определяется отдельно от реализации этого модуля. Последний содержит фактический код процедур и методов, описанных в интерфейсе, а также другие «частные» переменные, процедуры и т. д. Другой программный модуль B , например клиент A , который взаимодействует с A , вынужден делать это только через опубликованный интерфейс. Одним из практических преимуществ такого подхода является то, что замена реализации A другой реализацией того же интерфейса не должна приводить к сбою B — то, как A внутренне соответствует требованиям интерфейса, не имеет значения для B , который занимается только спецификациями интерфейса. (См. также принцип подстановки Лисков .) [ необходима цитата ]
В некоторых объектно-ориентированных языках, особенно в тех, где нет полного множественного наследования , термин интерфейс используется для определения абстрактного типа , который действует как абстракция класса . Он не содержит данных, но определяет поведение как сигнатуры методов . Класс, имеющий код и данные для всех методов, соответствующих этому интерфейсу, и объявляющий это, считается реализующим этот интерфейс. [9] Более того, даже в языках с одиночным наследованием можно реализовать несколько интерфейсов, и, следовательно, одновременно иметь разные типы. [10]
Интерфейс, таким образом, является определением типа ; везде, где объект может быть обменен (например, в вызове функции или метода ), тип объекта, который должен быть обменен, может быть определен в терминах одного из его реализованных интерфейсов или базовых классов, а не указанием конкретного класса . Такой подход означает, что может быть использован любой класс, реализующий этот интерфейс. [ необходима цитата ] Например, фиктивная реализация может использоваться, чтобы позволить разработке продвигаться до того, как будет доступна окончательная реализация. В другом случае поддельная или фиктивная реализация может быть заменена во время тестирования. Такие реализации- заглушки заменяются реальным кодом позже в процессе разработки.
Обычно метод, определенный в интерфейсе, не содержит кода и, таким образом, не может быть вызван сам по себе; он должен быть реализован неабстрактным кодом, чтобы быть запущенным при вызове. [ необходима цитата ] Интерфейс с именем " Stack
" может определять два метода: push()
и pop()
. Он может быть реализован разными способами, например, FastStack
и GenericStack
— первый из них быстрый, работающий со структурой данных фиксированного размера, а второй — использующий структуру данных, размер которой можно изменять, но за счет несколько более низкой скорости.
Хотя интерфейсы могут содержать много методов, они могут содержать только один или даже не содержать ни одного. Например, язык Java определяет интерфейс Readable
, который имеет единственный метод; различные реализации используются для разных целей, включая , , , , и . Интерфейсы маркеров , такие как , вообще не содержат методов и служат для предоставления информации о времени выполнения для общей обработки с использованием Reflection . [11]read()
BufferedReader
FileReader
InputStreamReader
PipedReader
StringReader
Serializable
Использование интерфейсов допускает стиль программирования, называемый программированием под интерфейс . Идея этого подхода заключается в том, чтобы основывать логику программирования на интерфейсах используемых объектов, а не на внутренних деталях реализации. Программирование под интерфейс снижает зависимость от особенностей реализации и делает код более пригодным для повторного использования. [12]
Доводя эту идею до крайности, инверсия управления оставляет контекст для внедрения кода с конкретными реализациями интерфейса, который будет использоваться для выполнения работы.
Пользовательский интерфейс — это точка взаимодействия между компьютером и человеком; он включает в себя любое количество модальностей взаимодействия ( таких как графика, звук, положение, движение и т. д.), посредством которых данные передаются между пользователем и компьютерной системой.
Как только вы зависите только от интерфейсов, вы отсоединяетесь от реализации. Это означает, что реализация может меняться, и это здоровая зависимость. Например, для целей тестирования вы можете заменить тяжелую реализацию базы данных на более легкую фиктивную реализацию. К счастью, с сегодняшней поддержкой рефакторинга вам больше не нужно придумывать интерфейс заранее. Вы можете извлечь интерфейс из конкретного класса, как только у вас будет полное представление о проблеме. Предполагаемый интерфейс находится всего в одном рефакторинге "извлечь интерфейс". ...
Сначала мы поговорим об интерфейсе Serializable. Это интерфейс-маркер, не имеющий никаких методов.