Событийно-ориентированное программирование, СОП, создание событийно-управляемых программ, event-driven programming
-
парадигма программирования,
в которой выполнение программы определяется событиями - действиями пользователя (клавиатура, мышь), сообщениями других программ и потоков, событиями операционной системы (например, поступлением сетевого пакета).
СОП можно также определить как способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события.
Как правило, в реальных задачах оказывается недопустимым длительное выполнение обработчика события, поскольку при этом программа не может реагировать на другие события. В связи с этим при написании событийно-ориентированных программ часто применяют автоматное программирование.
Сфера применения событийно-ориентированного программирования
Событийно-ориентированное программирование, как правило, применяется в
следующих случаях:
построение пользовательских интерфейсов (в том числе графических);
программирование игр, в которых осуществляется управление множеством объектов.
Применение событийно-ориентированного программирования в серверных приложениях
Событийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10 тыс. одновременных соединений и более. Обычно это делается в среде версионных, а не транзакционных систем.
В серверах, построенных по модели «один поток на соединение», проблемы с масштабируемостью возникают по следующим причинам:
слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, стек);
слишком велики накладные расходы на переключение контекстов.
Серверное приложение при событийно-ориентированном программировании реализуется на системном вызове, получающем события одновременно от многих дескрипторов (мультиплексирование). При обработке событий используются исключительно неблокирующие операции ввода-вывода, чтобы ни один дескриптор не препятствовал обработке событий от других дескрипторов.
Мультиплексирование в событийно-ориентированного программирования
Для мультиплексирования соединений могут быть использованы следующие средства операционной системы:
select (большинство UNIX систем). Плохо масштабируется, из-за того, что список дескрипторов представлен в виде битовой карты;
Применение событийно-ориентированного программирования в настольных приложениях
В современных языках программирования события и обработчики событий являются центральным звеном реализации графического интерфейса пользователя. Рассмотрим, к примеру, взаимодействие программы с событиями от мыши. Нажатие правой клавиши мыши вызывает системное прерывание, запускающее определенную процедуру внутри операционной системы. В этой процедуре происходит поиск окна, находящегося под курсором мыши. Если окно найдено, то данное событие посылается в очередь обработки сообщений этого окна. Далее, в зависимости от типа окна, могут генерироваться дополнительные события. Например, если окно является кнопкой (в Windows все графические элементы являются окнами), то дополнительно генерируется событие нажатия на кнопку. Отличие последнего события в том, что оно более абстрактно, а именно, не содержит координат курсора, а говорит просто о том, что было произведено нажатие на данную кнопку.
Обработчик события может выглядеть следующим образом (на примере C#):
Здесь обработчик события представляет собой процедуру, в которую передается параметр sender, как правило содержащий указатель на источник события. Это позволяет использовать одну и ту же процедуру для обработки событий от нескольких кнопок, различая их по этому параметру.
Языки событийно-ориентированного программирования
В языке C# события реализованы как элемент языка и являются членами классов. Механизм событий здесь реализует шаблон проектирования Publisher/Subscriber. Пример объявления события:
public class MyClass
{
public event EventHandler MyEvent;
}
Здесь EventHandler — делегат, определяющий тип процедуры обработчика событий. Подписка на событие производится следующим образом:
myClass.MyEvent += new EventHandler(Handler);
Здесь myClass — экземпляр класса MyClass, Handler — процедура-обработчик. Событие может иметь неограниченное количество обработчиков. При добавлении обработчика события он добавляется в специальный стек, а при возникновении события вызываются все обработчики по их порядку в стеке. Отписка от события, то есть удаление обработчика производится аналогично, но с использованием оператора «-=».
Разные языки программирования поддерживают СОП в разной степени. Наиболее полной поддержкой событий обладают следующие языки (неполный список):
Perl (события и демоны DAEMON, и их приоритеты PRIO),
Остальные языки, в большей их части, поддерживают события как обработку исключительных ситуаций.
Инструменты и библиотеки для событийно-ориентированного программирования
Node.js - событийно-ориентированный I/O фреймворк на JavaScript движке V8
Cocoa & Objective-C - рефлексивный объектно-ориентированный язык программирования, добавляющий сообщения в стиле Smalltalk в язык Си.
GLib
Gui4Cli - событийно-ориентированный язык программирования для Windows
libsigc++
libevent
POCO
libasync, часть библиотек sfs и sfslite - эффективная событийная библиотека для C++
Perl Object Environment
AnyEvent, EV — модули на Perl для событийно-ориентированного программирования
PRADO - компонентный событийно-ориентированный инструмент для Web-программирования на PHP5
Tcl
Twisted, Python
Qt - кроссплатформенная библиотека виджетов для C++, основанная на модели управления событиями. Существует сокращённая версия, называемая Qt/Console, из которой исключён код поддержки виджетов, и представляющий собой управляемый событиями фреймворк, в который также включены некоторые дополнительные средства, вроде кроссплатформенной работы с сетью, многопоточности и работы с XML.
QP — семейство открытых событийно-ориентированных окружений для встроенных систем реального времени
Simple Unix Events a.k.a. SUE - простая объектно-ориентированная библиотека для построения событийно-ориентированных программ под Unix на языке C++.
Знаете ли Вы, что объектно-ориентированное программирование - это технология программирования, при которой программа рассматривается как набор дискретных объектов, содержащих, в свою очередь, наборы структур данных и процедур, взаимодействующих с другими объектами.