Событийно-ориентированное программирование - Event-driven programming

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

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

Обработчики событий

Тривиальный обработчик событий

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

globally declare the counter K and the integer T.
OnKeyEnter(character C)
{
   convert C to a number N
   if K is zero store N in T and increment K
   otherwise, add N to T, print the result and reset K to zero
}

Хотя отслеживание истории в последовательной программе обычно тривиально, поскольку обработчики событий выполняются в ответ на внешние события, правильное структурирование обработчиков для правильной работы при вызове в любом порядке может потребовать особого внимания и планирования в программе, управляемой событиями.

Создание обработчиков событий

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

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

Третий шаг в разработке программы, управляемой событиями, - это написание основного цикла . Это функция, которая проверяет наличие событий, а затем вызывает соответствующий обработчик событий для его обработки. Большинство сред программирования, управляемого событиями, уже предоставляют этот основной цикл, поэтому прикладному программисту не требуется его специально предоставлять. RPG , один из первых языков программирования от IBM , чья концепция дизайна 1960-х годов была похожа на описанное выше программирование, управляемое событиями, предоставляла встроенный основной цикл ввода-вывода (известный как «программный цикл»), в котором вычисления выполнялись в соответствии с ' индикаторы ( флаги ), которые были установлены ранее в цикле.

Обработчики исключений в PL / I

В PL / I , даже если сама программа не может быть преимущественно управляемой событиями, могут происходить определенные аномальные события, такие как аппаратная ошибка, переполнение или «проверки программы», которые могут препятствовать дальнейшей обработке. Обработчики исключений могут быть предоставлены «ON заявления» в (невидимых) вызывающих абонентах , чтобы обеспечить очистки процедуры , чтобы очистить потом до прекращения или выполнение операций восстановления и возвращения к прерванной процедуре.

Общее использование

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

Кроме того, такие системы, как Node.js, также управляются событиями.

Критика

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

Заправка без стека

В языках описания оборудования используется событийный подход . Контексту потока нужен стек ЦП только при активной обработке события; после этого ЦП может перейти к обработке других потоков, управляемых событиями, что позволяет обрабатывать чрезвычайно большое количество потоков. По сути, это подход с использованием конечных автоматов .

Смотрите также

использованная литература

внешние ссылки