Interested Article - Событийно-ориентированное программирование

Парадигмы программирования

Событи́йно-ориенти́рованное программи́рование ( англ. event-driven programming ; в дальнейшем СОП) — парадигма программирования , в которой выполнение программы определяется событиями — действиями пользователя (клавиатура, мышь, сенсорный экран), сообщениями других программ и потоков, событиями операционной системы (например, поступлением сетевого пакета ).

СОП можно также определить как способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения , тело которого состоит из двух частей: выборки события и обработки события .

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

Сфера применения

Событийно-ориентированное программирование, как правило, применяется в трёх случаях:

  1. при построении пользовательских интерфейсов (в том числе графических );
  2. при создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов ;
  3. при программировании игр, в которых осуществляется управление множеством объектов.

Применение в серверных приложениях

Событийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10000 одновременных соединений и более.

В серверах, построенных по модели «один поток на соединение», проблемы с масштабируемостью возникают по следующим причинам:

  • слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, стек );
  • слишком велики накладные расходы на переключение контекстов.

Философской предпосылкой для отказа от потоковой модели серверов может служить высказывание Алана Кокса : «Компьютер — это конечный автомат . Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы» .

Серверное приложение при событийно-ориентированном программировании реализуется на системном вызове , получающем события одновременно от многих дескрипторов (мультиплексирование). При обработке событий используются исключительно неблокирующие операции ввода-вывода, чтобы ни один дескриптор не препятствовал обработке событий от других дескрипторов.

Мультиплексирование

Для мультиплексирования соединений могут быть использованы следующие средства операционной системы:

  • select (большинство UNIX систем). Плохо масштабируется, из-за того, что список дескрипторов представлен в виде битовой карты;
  • poll и epoll ( Linux );
  • ( FreeBSD );
  • ( Solaris );
  • ( Windows );
  • на текущий момент только для операций дискового ввода-вывода;
  • и для операций дискового ввода-вывода.

Примеры реализаций

Применение в настольных приложениях

В современных языках программирования события и обработчики событий являются центральным звеном реализации графического интерфейса пользователя. Рассмотрим, к примеру, взаимодействие программы с событиями от мыши. Нажатие правой клавиши мыши вызывает системное прерывание, запускающее определённую процедуру внутри операционной системы. В этой процедуре происходит поиск окна, находящегося под курсором мыши. Если окно найдено, то данное событие посылается в очередь обработки сообщений этого окна. Далее, в зависимости от типа окна, могут генерироваться дополнительные события. Например, если окно является кнопкой (в Windows все графические элементы являются окнами), то дополнительно генерируется событие нажатия на кнопку. Отличие последнего события в том, что оно более абстрактно, а именно, не содержит координат курсора, а говорит просто о том, что было произведено нажатие на данную кнопку.

Обработчик события может выглядеть следующим образом (на примере C#):

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Была нажата кнопка");
        }

Здесь обработчик события представляет собой процедуру, в которую передается параметр sender, как правило содержащий указатель на источник события. Это позволяет использовать одну и ту же процедуру для обработки событий от нескольких кнопок, различая их по этому параметру.

Языки программирования

В языке C# события реализованы как элемент языка и являются членами классов. Механизм событий здесь реализует шаблон проектирования Publisher/Subscriber . Пример объявления события:

    public class MyClass
    {
        public event EventHandler MyEvent;
    }

Здесь EventHandler делегат , определяющий тип процедуры обработчика событий. Подписка на событие производится следующим образом:

            myClass.MyEvent += new EventHandler(Handler);

Здесь myClass — экземпляр класса MyClass , Handler — процедура-обработчик. Событие может иметь неограниченное количество обработчиков. При добавлении обработчика события он добавляется в специальный стек, а при возникновении события вызываются все обработчики по их порядку в стеке. Отписка от события, то есть удаление обработчика производится аналогично, но с использованием оператора «-=».

Разные языки программирования поддерживают СОП в разной степени. Наиболее полной поддержкой событий обладают следующие языки (неполный список):

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

Инструменты и библиотеки

  • Node.js , событийно-ориентированный I/O фреймворк на JavaScript движке V8
  • Cocoa & Objective-C , рефлексивный объектно-ориентированный язык программирования, добавляющий сообщения в стиле Smalltalk в язык Си .
  • GLib
  • Gui4Cli , событийно-ориентированный язык программирования для Windows
  • (англ.)
  • POCO
  • libasync , часть библиотек sfs и sfslite , эффективная событийная библиотека для C++
  • (англ.)
  • AnyEvent, EV — модули на Perl для событийно-ориентированного программироания
  • (англ.) , компонентный событийно-ориентированный инструмент для Web-программирования на PHP 5
  • Tcl
  • Twisted , Python
  • Qt , кроссплатформенная библиотека виджетов для C++ , основанная на модели управления событиями. Существует сокращённая версия, называемая Qt/Console, из которой исключён код поддержки виджетов, и представляющий собой управляемый событиями фреймворк, в который также включены некоторые дополнительные средства, вроде кроссплатформенной работы с сетью, многопоточности и работы с XML .
  • QP — семейство открытых событийно-ориентированных окружений для встроенных систем реального времени
  • Simple Unix Events a.k.a. SUE , простая объектно-ориентированная библиотека для построения событийно-ориентированных программ под Unix на языке C++ .

См. также

Англоязычные источники

  • из
  • — учебное пособие Стефана Ферга (Stephen Ferg)
  • учебное пособие Алана Голда (Alan Gauld)
  • by
  • Event-driven programming and SOA:
  • Пример с открытым кодом:
  • Событийно-ориентированное программирование на языке Java : (недоступная ссылка)

Материалы на русском

  • Н. Н. Непейвода. 13. Лекция: Событийное программирование // . — М. : Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X .
  • С.В. Зыков. Лекции №15 и №16 // . — Интернет-университет информационных технологий.
  • О. В. Ануфриев. . Новосибирский государственный педагогический университет. Дата обращения: 29 октября 2010. Архивировано из 4 марта 2016 года.

Ссылки

  1. . Дата обращения: 29 апреля 2008. Архивировано из 8 февраля 2008 года.
  2. Н. Н. Непейвода. 13. Лекция: Событийное программирование // . — М. : Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X . 28 января 2012 года.
  3. С.В. Зыков. Лекции №15 и №16 // . — Интернет-университет информационных технологий. 13 апреля 2011 года.
  4. . Дата обращения: 1 июля 2011. 9 июля 2011 года.
  5. . Дата обращения: 22 января 2008. Архивировано из 29 марта 2010 года.
  6. . Дата обращения: 22 января 2008. 8 июля 2008 года.
  7. . Дата обращения: 1 июля 2011. 29 марта 2010 года.
Источник —

Same as Событийно-ориентированное программирование