Подійно-орієнтоване програмування
Подійно-орієнтоване програмування (англ. 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 [Архівовано 9 квітня 2020 у Wayback Machine.]
- 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 - родина відкритих подійно-орієнтованих середовищ для вбудованих систем реального часу
[1] [Архівовано 8 липня 2008 у Wayback Machine.]
- Simple Unix Events aka SUE [Архівовано 29 березня 2010 у Wayback Machine.], проста об'єктно-орієнтована бібліотека для побудови подійно-орієнтованих програм під Unix на мові C++.
Див. також
ред.- Автоматне програмування
- Callback (програмування)
- Подійно-орієнтована архітектура (EDA)
- Багатоетапна подійно-орієнтована архітектура (SEDA)
Джерела
ред.- опис [Архівовано 7 вересня 2011 у Wayback Machine.] з Portland Pattern Repository [Архівовано 22 лютого 2011 у Wayback Machine.]
- Event-Driven Programming: Introduction, Tutorial, History [Архівовано 19 лютого 2006 у Wayback Machine.] - навчальний посібник Стефана Фергі (Stephen Ferg)
- Event Driven Programming навчальний посібник Алана Голда (Alan Gauld)
- Martin Fowler. Event Collaboration [Архівовано 2 вересня 2006 у Wayback Machine.]
- Ben Watson. Transitioning from Structured to Event-Driven Programming [Архівовано 18 січня 2010 у Wayback Machine.]
- Jonathan Simon. Rethinking Swing Threading
- Chris McDonald. The event driven programming style [Архівовано 20 лютого 2005 у Wayback Machine.]
- 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 [Архівовано 10 вересня 2011 у Wayback Machine.]
- LabWindows / CVI Resources
- Comment [Архівовано 18 грудня 2007 у Wayback Machine.] by Tim Boudreau
- Complex Event Processing and Service Oriented Architecture [Архівовано 30 жовтня 2012 у Wayback Machine.]
- Event-driven programming and SOA: Jack van Hoof. How EDA extends SOA and why it is important;; [Архівовано 8 березня 2021 у Wayback Machine.]
- Приклад з відкритим кодом: Distributed Publish / Subscribe Event System [Архівовано 21 червня 2008 у Wayback Machine.]
- Подійно-орієнтоване програмування на мові Java: [https: / / jsasb.dev.java.net / Rex Youung. Jsasb]
- Непейвода Н.Н. Событийное программирование. Стили и методы программирования [Архівовано 28 січня 2012 у Wayback Machine.]
- Зыков С.В. Введение в теорию программирования. Объектно-ориентированный подход [Архівовано 13 квітня 2011 у Wayback Machine.]
- Ануфриев О.В.О методике обучения основам событийного программирования
- А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal
Посилання
ред.- ↑ Linux-Kernel Archive : Re: Alan Cox quote?. Архів оригіналу за 8 лютого 2008. Процитовано 6 квітня 2011.
- ↑ Архівована копія. Архів оригіналу за 29 березня 2010. Процитовано 6 квітня 2011.
{{cite web}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
Це незавершена стаття про програмування. Ви можете допомогти проєкту, виправивши або дописавши її. |