Програмирање вођено догађајима () је парадигма у програмирању у којој је ток програма одређено догађајима као што су акције корисника (клик мишем, притискање тастера), сензор излаза, или порукама из других програма / нити. Програмирање вођено догађајима је доминантна парадигма која се користи код графичких корисничких интерфејса и у другим апликацијама (нпр JavaScript веб апликације) које су усмерене да обављају поједине радње у одговору на кориснички унос.

У апликацији вођеној догађајима, генерално постоји главна петља која слуша догађаје, а затим активира повратни позив функције када се детектује догађај. У уграђеним системима исти се може постићи коришћењем хардверских интерапата уместо главне петље која се стално извршава. Програми вођени догађајима могу бити написани у било ком програмском језику, мада их је лакше писати у језицима који обезбеђују апстракције на високом нивоу, као што су затворења.

Хендлери догађаја Тривијални хендлери догађаја Како код за проверу догађаја и главне петље не зависи од саме апликације, многи програмски фрејмворци брину о њиховој имплементацији и на кориснику је само да обезбеди код за управљање догађајима. У овом једноставном примеру може постојати позив за догађај трговине који се зове -{OnKeyEnter()}- који као аргумент узима ниску карактера, која одговара ономе шта је корисник откуцао пре нето шго је притиснуо тастер ЕНТЕР. Да би се сабрала два броја, неопходно је складиштити податке изван хендлера догађаја. Следи пример имплементације:

глобално декларисан бројач K и цео број T. OnKeyEnter(character C) { конвертуј C у број N ако је K једнако нули, ускладишти N у T и увећај K у супротном додај N у T, одштампај резултат и врати K на нулу }

Праћење историје је једноставно у класичном програму, али у програму вођеном догађајима изискује посебну пажњу и планирање.

Хендлери изузетака У PL/1, иако сам програм не мора бити претежно вођен догађајима, извесни абнормални догађаји као што су хардверске грешке, прекорачења бафера или „програмске провере“ могу да се догоде и да евентуално спрече даље извршавање програма. Хендлери изузетака могу да се дају коришћењем „-{ON}- исказа“ у позивајућим методама како би се обезбедиле рутине за чишћење стања пре завршетка рада.

Прављење хендлера догађаја Први корак у развоју програма вођених догађајима је писање низа потпрограма, или метода, који се називају рутинама за руковање (хендловање) догађајима. Ове рутине хендлују догађаје на које ће главни програм реаговати. На пример, један клик левог дугмета миша на командно дугме у GUI програму може да позове рутину која ће отворити још један прозор, сачувати податке у базу података или затворити апликацију. Многа модерна програмерска окружења програмеру пружају шаблоне за хендлере догађаја, чиме омогућавају програмеру да се сконцентрише на писање самог кода догађаја.

Други корак је да се хендлери догађаја вежу за догађаје, тако да се при јављању догађаја позове одговарајућа, исправна метода. Графички уређивачи спајају прва два корака: двокликом на дугме, уређивач прави (празан) хендлер догађаја повезан са акцијом клика на дугме, и отвара прозор у коме програмер може да измени хендлер догађаја.

Трећи корак у развоју програма вођеног догађајима је писање главне петље. Ово је функција која проверава да ли је дошло до догађаја, и кад дође до неког догађаја позива одговарајући хендлер који ће да обради догађај. Већина програмерских окружења за писање програма вођених догађајима имају готове главне петље, тако да апликативни програмер не мора сам да је имплементира. RPG, рани програмски језик из IBMа, чији дизајн из 1960их је наликовао програмирању вођеном догађајима описаном изнад, је имао уграђену главну I/O петљу (познату као „програмски циклус“), где калкулације реагују у складу са 'индикаторима' (флеговима) постављеним раније током циклуса.

Критика и најбоља пракса Програмирање вођено догађајима има широку примену у графичким корисничким интерфејсима, на пример Андроид конкурентни фрејмворци су дизајнирани коришћењем -{Half-Sync/Half-Async}- обрасца, где се користи комбинација једнонитне петље за процесирање догађаја (за главну нит за кориснички интерфејс) и синхроних нити (за позадинске нити). То је зато што додаци () за кориснички интерфејс нису нит-безбедни, и пошто су прошириви, не постоји начин да се гарантује да су све имплементације нит-безбедне, тако да једнонитни модел ублажава овај проблем.

Дизајн ових алата је предмет критике, на пример од стране Мира Самека, због промовисања претерано поједностављеног модела догађаја и акција, што програмере наводи да пишу апликациони код који је подложан грешкама, компликован за дораде и претерано комплексан. Миро Каже:

и залаже за коришћење коначних аутомата као изводљиве алтернативе.

Нити без стека Приступ вођен догађајима се користи у језику за описивање хардвера. Контексту нити је CPU стек неопходан само док активно обрашује догађај. Након завршетка обраде, CPU може да пређе на друге нити вођене догађајима, што омогућава извршавање изузетно великог броја нити. У суштини овај приступ представља коначан аутомат.

Види још Временски активиран систем (алтернативна архитектура рачунарских система) Интерапт Поређење програмских парадигми Dataflow програмирање (сличан концепт) DOM догађаји Архитектура вођена догађајима Обрада тока догађаја (сличан концепт) Језик за описивање хардвера Инверзија контроле Message-oriented middleware Програмске парадигме Образац publish-subscribe Сигнално програмирање (сличан концепт) Виртуелна синхронија, модел дистрибуираног извршавања за програмирање вођено догађајима

Референце

Спољашње везе -{Concurrency patterns presentation }-, презентовано на scaleconf -{Event-Driven Programming: Introduction, Tutorial, History}-, уџбеник Стивена Ферга -{Event Driven Programming}-, уџбеник Алана Гаулда -{Event Collaboration}-, чланак Мартина Фаулера -{Rethinking Swing Threading}-, чланак Џонатана Сајмона -{The event driven programming style}-, чланак Криса Макдоналда -{Event Driven Programming using Template Specialization}-, чланак Кристофера Дигинса -{Concepts and Architecture of Vista - a Multiparadigm Programming Environment}-, чланак Стефана Шифера и Јоакима Ханса Фролиха -{Event-Driven Programming and Agents}-, поглавље -{LabWindows/CVI Resources}- -{Distributed Publish/Subscribe Event System}-, опен сорс пример у примени на -{MSN.com}- и -{Microsoft.com}-

Категорија:Програмске парадигме