Подійно-орієнтоване програмування (; надалі ПОП) — парадигма програмування, в якій виконання програми визначається подіями — діями користувача (клавіатура, миша), повідомленнями інших програм і потоків, подіями операційної системи (наприклад, надходженням мережевого пакета).

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

Як правило, в реальних завданнях виявляється неприпустимим тривале виконання обробника події, оскільки при цьому програма не може реагувати на інші події. У зв'язку з цим при написанні подійно-орієнтованих програм часто застосовують автоматне програмування.

Сфера застосування

Подійно-орієнтоване програмування, зазвичай застосовують в трьох випадках: При побудові користувацьких інтерфейсів (в тому числі графічних); При створенні серверних застосунків у разі, якщо з тих чи інших причин небажано породження обслуговуючих процесів; При програмуванні ігор, в яких здійснюється управління значною кількістю об'єктів.

Застосування в серверних програмах

Подійно-орієнтоване програмування застосовується в серверних програмах для вирішення проблеми масштабування на 10000 одночасних з'єднань і більше.

У серверах, побудованих за моделлю «один потік на з'єднання», проблеми з масштабованістю виникають з наступних причин: Занадто великі накладні витрати на структури даних операційної системи, необхідні для опису однієї задачі (сегмент стану завдання, стек); Занадто великі накладні витрати на перемикання контекстів. Філософською передумовою для відмови від потокової моделі серверів може служити вислів Алана Кокса: «Комп'ютер - це кінцевий автомат. Потокове програмування потрібно тим, хто не вміє програмувати кінцеві автомати ».

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

Мультиплексування Для мультиплексування сполук можуть бути використані наступні засоби операційної системи: Select (більшість UNIX систем). Погано масштабується, через те, що список дескрипторів представлений у вигляді бітової карти; Poll і epoll (Linux); Kqueue (FreeBSD); /Dev/poll ( Solaris); IO completion port (Windows); POSIX AIO на поточний момент тільки для операцій дискового введення-виведення; Io submit і eventfd для операцій дискового введення-виведення.

Приклади реалізацій Вебсервери: Nginx Lighttpd Проксі-сервери: Squid Серверні платформи node.js

Застосування в настільних програмах У сучасних мовах програмування події та обробники подій є центральною ланкою реалізації графічного інтерфейсу користувача. Розглянемо, наприклад, взаємодію програми з подіями від миші. Натискання правої клавіші миші викликає системне переривання, що запускає певну процедуру всередині операційної системи. У цій процедурі відбувається пошук вікна, що знаходиться під курсором миші. Якщо вікно знайдено, то дана подія надсилається в чергу обробки повідомлень цього вікна. Далі, в залежності від типу вікна, можуть генеруватися додаткові події. Наприклад, якщо вікно є кнопкою (у 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 Java Delphi C #

Інші мови, в більшості з них, підтримують події як обробку виключних ситуацій.

Інструменти і бібліотеки

подійно-орієнтована обробка з «Azuki framework» Подійна бібліотека мови Eiffel Cocoa & Objective-C, рефлексивна об'єктно-орієнтована мова програмування, який додає повідомлення в стилі Smalltalk в мову Сі. GLib Gui4Cli, подійно-орієнтована мова програмування для Windows event loop management library Libsigc + + Libevent POCO Libasync, частина бібліотек sfs і sfslite , ефективна подійна бібліотека для 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: Rex Youung. Jsasb Непейвода Н.Н. Событийное программирование. Стили и методы программирования Зыков С.В. Введение в теорию программирования. Объектно-ориентированный подход Ануфриев О.В.О методике обучения основам событийного программирования А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal

Посилання