Подійно-орієнтоване програмування
Подійно-орієнтоване програмування (англ. event-driven programming; надалі ПОП) — парадигма програмування, в якій виконання програми визначається подіями — діями користувача (клавіатура, миша), повідомленнями інших програм і потоків, подіями операційної системи (наприклад, надходженням мережевого пакета).
ПОП можна також визначити як спосіб побудови комп'ютерної програми, при якому в коді (як правило, в головний функції програми) явним чином виділяється головний цикл програми, тіло якого складається з двох частин: отримання повідомлення про подію і обробки події.
Як правило, в реальних завданнях виявляється неприпустимим тривале виконання обробника події, оскільки при цьому програма не може реагувати на інші події. У зв'язку з цим при написанні подійно-орієнтованих програм часто застосовують автоматне програмування.
Сфера застосування
Подійно-орієнтоване програмування, зазвичай застосовують в трьох випадках:
Застосування в серверних програмах
Подійно-орієнтоване програмування застосовується в серверних програмах для вирішення проблеми масштабування на 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- процедура-обробник. Подія може мати необмежену кількість обробників. При додаванні обробника події він додається до спеціального стек, а при виникненні події викликаються всі обробники за їх порядку в стеці. Відписка від події, тобто видалення обробника виконується аналогічно, але з використанням оператора «-=».
Різні мови програмування підтримують ПОП в різному ступені. Найповнішу підтримку подій мають наступні мови (неповний список):
Інші мови, в більшості з них, підтримують події як обробку виключних ситуацій.
Інструменти і бібліотеки
- подійно-орієнтована обробка з «Azuki framework»
- Подійна бібліотека мови Eiffel
- Cocoa & Objective-C, рефлексивна об'єктно-орієнтована мова програмування, який додає повідомлення в стилі Smalltalk в мову Сі.
- GLib
- Gui4Cli, подійно-орієнтована мова програмування для Windows
- event loop management library
- Libsigc + +
- Libevent
- POCO
- Libasync, частина бібліотек sfs і sfslite [2], ефективна подійна бібліотека для C++
- Perl Object Environment
- PRADO, компонентний подійно-орієнтований інструмент для Web-програмування на PHP 5
- Tcl
- Twisted, Python
- The Qt Toolkit, a cross-platform GUI toolkit for C + + based on an event-driven model. A version called Qt / Console exists which omits the GUI features, but still includes the event-handling framework and some other features like cross-platform networking, threading, and XML libraries.
- QP - родина відкритих подійно-орієнтованих середовищ для вбудованих систем реального часу
- Simple Unix Events aka SUE, проста об'єктно-орієнтована бібліотека для побудови подійно-орієнтованих програм під Unix на мові C++.
Див. також
- Автоматне програмування
- Callback (програмування)
- Подійно-орієнтована архітектура (EDA)
- Багатоетапна подійно-орієнтована архітектура (SEDA)
Джерела
- опис з 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: [https: / / jsasb.dev.java.net / Rex Youung. Jsasb]
- Непейвода Н.Н. Событийное программирование. Стили и методы программирования
- Зыков С.В. Введение в теорию программирования. Объектно-ориентированный подход
- Ануфриев О.В.О методике обучения основам событийного программирования
- А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal
Посилання
- Linux-Kernel Archive : Re: Alan Cox quote?. Архів оригіналу за 8 лютого 2008. Процитовано 6 квітня 2011.
- Архівована копія. Архів оригіналу за 29 березня 2010. Процитовано 6 квітня 2011.