Событийно-ориентированное программирование | это... Что такое Событийно-ориентированное программирование? (original) (raw)
- Агентно-ориентированная
- Компонентно-ориентированная
- Конкатенативная
- Декларативная (контрастирует с Императивной)
- Событийно-ориентированная
- Комбинаторная
- Императивная (контрастирует с Декларативной)
- Предметно-ориентированная
- Метапрограммирование
- Автоматизация процесса программирования
- Обобщённое программирование
- Рефлексивно-ориентированная
- Итерационная
- Параллельная
- Структурная
Шаблон: Просмотр • англ. event-driven programming; в дальнейшем СОП) — парадигма программирования, в которой выполнение программы определяется событиями — действиями пользователя (клавиатура, мышь), сообщениями других программ и потоков, событиями операционной системы (например, поступлением сетевого пакета).
СОП можно также определить как способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события.
Как правило, в реальных задачах оказывается недопустимым длительное выполнение обработчика события, поскольку при этом программа не может реагировать на другие события. В связи с этим при написании событийно-ориентированных программ часто применяют автоматное программирование.
Содержание
- 1 Сфера применения
- 2 Применение в серверных приложениях
- 3 Применение в настольных приложениях
- 4 Инструменты и библиотеки
- 5 См. также
- 6 Ссылки
Сфера применения
Событийно-ориентированное программирование, как правило, применяется в трех случаях:
- при построении пользовательских интерфейсов (в том числе графических);
- при создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов;
- при программировании игр, в которых осуществляется управление множеством объектов.
Применение в серверных приложениях
Событийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10000 одновременных соединений и более.
В серверах, построенных по модели «один поток на соединение», проблемы с масштабируемостью возникают по следующим причинам:
- слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, стек);
- слишком велики накладные расходы на переключение контекстов.
Философской предпосылкой для отказа от потоковой модели серверов может служить высказывание Алана Кокса: «Компьютер — это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы»[1].
Серверное приложение при событийно-ориентированном программировании реализуется на системном вызове, получающем события одновременно от многих дескрипторов (мультиплексирование). При обработке событий используются исключительно неблокирующие операции ввода-вывода, чтобы ни один дескриптор не препятствовал обработке событий от других дескрипторов.
Мультиплексирование
Для мультиплексирования соединений могут быть использованы следующие средства операционной системы:
- select (большинство UNIX систем). Плохо масштабируется, из-за того, что список дескрипторов представлен в виде битовой карты;
- poll и epoll (Linux);
- kqueue (FreeBSD);
- /dev/poll (Solaris);
- IO completion port (Windows);
- POSIX AIO на текущий момент только для операций дискового ввода-вывода;
- io submit и eventfd для операций дискового ввода-вывода.
Примеры реализаций
Применение в настольных приложениях
В современных языках программирования события и обработчики событий являются центральным звеном реализации графического интерфейса пользователя. Рассмотрим, к примеру, взаимодействие программы с событиями от мыши. Нажатие правой клавиши мыши вызывает системное прерывание, запускающее определенную процедуру внутри операционной системы. В этой процедуре происходит поиск окна, находящегося под курсором мыши. Если окно найдено, то данное событие посылается в очередь обработки сообщений этого окна. Далее, в зависимости от типа окна, могут генерироваться дополнительные события. Например, если окно является кнопкой (в 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 - процедура-обработчик. Событие может иметь неограниченное количество обработчиков. При добавлении обработчика события он добавляется в специальный стек, а при возникновении события вызываются все обработчики по их порядку в стеке. Отписка от события, то есть удаление обработчика производится аналогично, но с использованием оператора «-=».
Разные языки программирования поддерживают СОП в разной степени. Наиболее полной поддержкой событий обладают следующие языки (неполный список):
- Perl (события и демоны
DAEMON
, и их приоритетыPRIO
),[2] - Java,
- Delphi,
- ActionScript 3.0,
- C# (события
event
)[3].
Остальные языки, в большей их части, поддерживают события как обработку исключительных ситуаций.
Инструменты и библиотеки
- Node.js, событийно-ориентированный I/O фреймворк на JavaScript движке V8
- Cocoa & Objective-C, рефлексивный объектно-ориентированный язык программирования, добавляющий сообщения в стиле Smalltalk в язык Си.
- GLib
- Gui4Cli[4], событийно-ориентированный язык программирования для Windows
- libsigc++ (англ.)русск.
- libevent
- POCO
- libasync, часть библиотек sfs и sfslite[5], эффективная событийная библиотека для C++
- Perl Object Environment (англ.)русск.
- PRADO (англ.)русск., компонентный событийно-ориентированный инструмент для Web-программирования на PHP 5
- Tcl
- Twisted, Python
- Qt, кроссплатформенная библиотека виджетов для C++, основанная на модели управления событиями. Существует сокращённая версия, называемая Qt/Console, из которой исключён, код поддержки виджетов, и представляющий собой управляемый событиями фреймвок, в который также включены некоторые дополнительные средства, вроде кроссплатформенной работы с сетью, многопоточности и работы с XML.
- QP — семейство открытых событийно-ориентированных окружений для встроенных систем реального времени[6]
- Simple Unix Events a.k.a. SUE[7], простая объектно-ориентированная библиотека для построения событийно-ориентированных программ под Unix на языке C++.
См. также
Англоязычные источники
- описание из Portland Pattern Repository
- Event-Driven Programming: Introduction, Tutorial, History — учебное пособие Стефана Ферга (Stephen Ferg)
- Event Driven Programming учебное пособие Алана Голда (Alan Gauld)
- Martin Fowler. Event Collaboration
- Ben Watson. Transitioning from Structured to Event-Driven Programming
- Jonathan Simon. Rethinking Swing Threading
- Chris McDonald. The event driven programming style
- Christopher Diggins. Event Driven Programming using Template Specialization
- Stefan Schiffer and Joachim Hans Fröhlich. Concepts and Architecture of Vista — a Multiparadigm Programming Environment
- Event-Driven Programming and Agents
- LabWindows/CVI Resources
- Comment by Tim Boudreau
- Complex Event Processing and Service Oriented Architecture
- Event-driven programming and SOA: Jack van Hoof. How EDA extends SOA and why it is important;;
- Пример с открытым кодом: Distributed Publish/Subscribe Event System
- Событийно-ориентированное программирование на языке Java: Rex Youung. Jsasb
Материалы на русском
- Н. Н. Непейвода 13. Лекция: Событийное программирование // Стили и методы программирования. курс лекций. учебное пособие. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X
- С.В. Зыков Лекции №15 и №16 // Введение в теорию программирования. Объектно-ориентированный подход. — Интернет-университет информационных технологий.
- О. В. Ануфриев О методике обучения основам событийного программирования] (рус.). Новосибирский государственый педагогический университет. Архивировано из первоисточника 3 марта 2012. Проверено 29 октября 2010.
- А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal
Ссылки
- ↑ Linux-Kernel Archive: Re: Alan Cox quote? (was: Re: accounting
- ↑ Н. Н. Непейвода 13. Лекция: Событийное программирование // Стили и методы программирования. курс лекций. учебное пособие. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X
- ↑ С.В. Зыков Лекции №15 и №16 // Введение в теорию программирования. Объектно-ориентированный подход. — Интернет-университет информационных технологий.
- ↑ Gui4Cli Home page
- ↑ sfslite:overview
- ↑ Download from Quantum Leaps
- ↑ The Simple Unix Events (SUE) library homepage
Категория:
- Парадигмы программирования
Wikimedia Foundation.2010.
Полезное
Смотреть что такое "Событийно-ориентированное программирование" в других словарях:
- Событийно-управляемое программирование — объектно ориентированное программирование, при котором задаются реакции программы на различные события. См. также: Объектно ориентированное программирование Финансовый словарь Финам … Финансовый словарь
- Объектно-ориентированное программирование — Эта статья во многом или полностью опирается на неавторитетные источники. Информация из таких источников не соответствует требованию проверяемости представленной информации, и такие ссылки не показывают значимость темы статьи. Статью можно… … Википедия
- Аспектно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия
- Субъектно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия
- Компонентно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия
- Событийно-ориентированная архитектура — Архитектура, управляемая событиями (Event driven architecture EDA) является шаблоном архитектуры программного обеспечения, позволяющим создание, определение, потребление и реакцию на события. Событие можно определить как «существенное… … Википедия
- Парадигма (программирование) — Парадигма программирования это совокупность идей и понятий, определяющая стиль написания программ. Парадигма, в первую очередь, определяется базовой программной единицей и самим принципом достижения модульности программы. В качестве этой единицы … Википедия
- Автоматное программирование — Автоматное программирование это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого либо формального автомата. В зависимости от конкретной задачи в автоматном программировании… … Википедия
- Отражение (программирование) — У этого термина существуют и другие значения, см. Отражение. Для улучшения этой статьи желательно?: Перевести текст с иностранного языка на русский. Н … Википедия
- Структурное программирование — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей … Википедия