Програмирање вођено догађајима

Из Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу

Програмирање вођено догађајима (енгл. Event-driven programming) је парадигма у програмирању у којој је ток програма одређено догађајима као што су акције корисника (клик мишем, притискање тастера), сензор излаза, или порукама из других програма / нити. Програмирање вођено догађајима је доминантна парадигма која се користи код графичких корисничких интерфејса и у другим апликацијама (нпр 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 обрасца,[1] где се користи комбинација једнонитне петље за процесирање догађаја (за главну нит за кориснички интерфејс) и синхроних нити (за позадинске нити). То је зато што додаци (енгл. widget) за кориснички интерфејс нису нит-безбедни, и пошто су прошириви, не постоји начин да се гарантује да су све имплементације нит-безбедне, тако да једнонитни модел ублажава овај проблем.

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

Такав приступ је плодно тле за багове из најмање три разлога:

  1. Увек доводи до комплексне условне логике.
  2. Свака тачка гранања захтева израчунавање комплексног израза.
  3. Пребацивање између различитих модова изискује измену многих променљивих, што лако може да доведе до недоследности.
— Miro Samek, Who Moved My State?, C/C++ Users Journal, The Embedded Angle column (Април 2003)

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

Нити без стека[уреди]

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

Види још[уреди]

Референце[уреди]

Спољашње везе[уреди]