Интерфейс программы
Интерфейс программирования — это механизм вызова сервисов, предоставляемый операционной системой для программистов. Он обеспечивает взаимодействие пользовательских программ с ядром через системные вызовы и включает функции управления процессами, работы с файлами, обмена данными между процессами и другие возможности. Будучи единственным законным способом доступа приложений к системным ресурсам, интерфейс запускает переход из пользовательского режима в режим ядра с помощью программных прерываний, передает запросы через регистры или таблицу параметров и в конечном итоге выполняет их, возвращая результат.
Развитие интерфейсов программирования сопровождается эволюцией парадигм программирования. В ранние времена процедурно-ориентированные языки использовали функции как минимальную единицу, а объектно-ориентированные языки ввели классы, объединяющие данные и методы. Чтобы решить проблему смешанного функционала внутри классов, механизмы интерфейсов определяют модульные наборы методов с помощью чисто виртуальных функций. Сначала C++ реализовал технологию интерфейсного поиска (QI) для переключения между функциональными модулями. Системные вызовы, являясь базовой реализацией интерфейсов, постепенно стандартизировались в такие спецификации, как POSIX, а также улучшались за счёт инкапсуляции через API, что повысило удобство использования.
Описание интерфейса
Сообщениередактор
Для описания интерфейсов необходимо рассказать об истории развития языков программирования. Как говорил Лу Синь: «Сначала изучай историю, а затем учись науке». Только поняв прошлое и настоящее языков программирования, можно разобраться, почему существуют столько языков и почему они выглядят именно так, как сейчас. После появления компьютеров ученые последовательно разработали множество языков — Smalltalk, Pascal, Basic, C, C++, Java, .NET и другие. Развитие этих языков можно рассматривать как исторический переход от процедурного к объектно-ориентированному программированию. Многие книги по объектно-ориентированному программированию, рассказывая о своей истории, включают этот период в свои описания и призывают читателей восхищаться преимуществами ОО-программирования. Проблема в том, что многие новички в программировании вообще не понимают, зачем вообще нужно такое изменение, и трудно осмыслить, для чего вообще нужны такие понятия, как виртуальные функции, интерфейсы и т.д. в ОО-языках. Гранулометрия. Трансляция.редактор
Прежде чем мы погрузимся в историю этого раздела, давайте сначала разберём понятие «гранулометрия». Что такое гранулометрия? Автор считает, что под гранулометрией подразумевается масштаб комбинирования кодовых единиц в программе. Возьмём пример: песок — кирпичи — шаблон для строительства дома. Представьте, что вы собираетесь построить дом, и существует множество способов его возведения. Если вам не против сложности, можно строить домиками из песка, или обжигать песок в кирпичи и использовать их для кладки, а также напрямую покупать двери, окна и стены для дома на заводе. Эти три различных метода представляют собой три разных масштаба комбинирования. Песок — это минимальная единица измерения: если строить небольшой дом из песка, возможно, это даже приемлемо, но, безусловно, нам придётся использовать огромное количество песка, что затрудняет управление им. Кирпичи представляют собой более крупный уровень, позволяющий строить большие дома; шаблон для строительства дома — это максимальный масштаб, который позволяет быстро сооружать крупномасштабные здания. Различия и взаимосвязи между этими тремя уровнями во многом аналогичны концепции написания программ.
Во время раннего изучения языка Pascal преподаватель объяснил, что базовой единицей в этом процедурном языке являются процедуры и функции — они представляют собой мельчайшие компоненты программы. Процедуры и функции позволяют реализовать базовое повторное использование кода. Когда мы пишем определённые фиксированные функции в виде процедур или функций, мы можем вызывать их в программе, не приходя в каждый нужный момент написать такой же код отдельно. Преимущество очевидно. В небольших программах использование процедур и функций вполне уместно, однако в средних и крупных программах их недостатки проявляются: гранулометрия процедур и функций слишком мала. Если в системе насчитывается 10 000 функций и процедур, наши программисты будут тратить огромное количество времени на поиск и обслуживание этих элементов. Управление 10 000 совершенно не связанных между собой функций и процедур очевидно сложно — как быстрое расстройство компании из 10 000 человек без отделов и должностей?
Объектно-ориентированное программированиередактор
Появление объектно-ориентированных языков было задумано именно для решения этой проблемы. Не слушайте, как ОО-языки хвалятся, их появление имело одну единственную цель — повысить гранулярность программирования. Основной элементом объектно-ориентированного программирования является класс (CLASS), который объединяет множество данных, методов и процедур, тем самым повышая уровень детализации компонентов. Теперь мы не работаем с процедурами и функциями, а с отдельными классами более высокого уровня.
Например, если мы разделим 10 000 человек на несколько отделов, каждый из которых будет заниматься разными задачами, компания наконец сможет нормально функционировать. Но стоит ли сразу после создания класса CLASS закрываться? Нет, новые вопросы возникают: допустим, в одном отделе много сотрудников, которые могут выполнять множество задач — как же улучшить управление внутри отдела? Возьмем класс, который предоставляет множество методов и свойств, но эти методы и свойства можно разделить на группы, выполняющие различные функции. Однако наш класс не обеспечивает такого управления.
В объектно-ориентированном программировании (AO) объект map обладает множеством функций: управление слоями, элементами, наборами выбора, отображение карты. Каждая из этих функций имеет множество методов и свойств, которые хаотично скопированы в один класс без какой-либо системы группировки. Когда программист хочет найти определенный метод, ему приходится перебирать все методы, что очень неудобно.
В этот момент появляется интерфейс (interface). Когда создатель C++ впервые предложил концепцию чистых абстрактных функций (по сути, интерфейсов), он столкнулся с сопротивлением. Многие не понимали смысла интерфейса. Мы хорошо использовали виртуальные функции, зачем тогда добавлять пустой формальный инструмент?
Если сказать, что это класс, то он не может создавать объекты; если сказать, что это объект, то у него нет тела метода. Интерфейс сыграл хорошую роль, выделив внутренние структуры класса. Для объекта map можно создать несколько интерфейсов, в которых будут определены методы и функции различных функциональностей. Класс map реализует эти интерфейсы, и теперь мы можем использовать интерфейсы для определения и реализации объектов.
Таким образом, интерфейс — это совокупность определенных методов и свойств.
Dim pGraphicsContainer as iGraphicsContainer
pGraphicsContainer = application.document.ActiveView.focusMap
Свойства и методы, доступные для использования в pGraphicsContainer, ограничиваются теми, что они определили, и нельзя использовать интерфейсы, такие как управление элементами. Как же тогда использовать другие функции? Это называется QI (Query Interface).
Dim pGeoFeatureLayer as iGeofeatureLayer
pGeoFeatureLayer = pGraphicsContainer QI
История развития компьютерных языков — это история постоянного повышения гранулярности компонентов и повторного использования кода. Раньше мы использовали процедуры и функции, затем классы, а потом интерфейсы — всё ради того, чтобы найти баланс между конкретностью и абстрактностью. Если слишком конкретно, например, процедуры и функции, — теряется структура. Если слишком абстрактно, например, классы, — невозможно различать их.
Пример кода:
public interface IForm{
voidShow();
voidShowDialog();}
public class A : IForm{
public void Show(){
}
public void ShowDialog(){
}
}
public class B : IForm{
public void Show(){
}
public void ShowDialog(){
}
}
public class FormFactory{
public static IFormCreateInstance(string parm){
если (параметр == “A”){
returnnewA();
elseif(parm==”B”)
returnnewB();}
return null;}
}
Это абстракция логики, это конкретизация метода — это философия написания программ.
Leave a comment
Your email address will not be published. Required fields are marked *