Programiranje vođeno događajima

S Vikipedije, slobodne enciklopedije

Programiranje vođeno događajima (engl. Event-driven programming) je paradigma u programiranju u kojoj je tok programa određeno događajima kao što su akcije korisnika (klik mišem, pritiskanje tastera), senzor izlaza, ili porukama iz drugih programa / niti. Programiranje vođeno događajima je dominantna paradigma koja se koristi kod grafičkih korisničkih interfejsa i u drugim aplikacijama (npr JavaScript veb aplikacije) koje su usmerene da obavljaju pojedine radnje u odgovoru na korisnički unos.

U aplikaciji vođenoj događajima, generalno postoji glavna petlja koja sluša događaje, a zatim aktivira povratni poziv funkcije kada se detektuje događaj. U ugrađenim sistemima isti se može postići korišćenjem hardverskih interapata umesto glavne petlje koja se stalno izvršava. Programi vođeni događajima mogu biti napisani u bilo kom programskom jeziku, mada ih je lakše pisati u jezicima koji obezbeđuju apstrakcije na visokom nivou, kao što su zatvorenja.

Hendleri događaja[uredi | uredi izvor]

Trivijalni hendleri događaja[uredi | uredi izvor]

Kako kod za proveru događaja i glavne petlje ne zavisi od same aplikacije, mnogi programski frejmvorci brinu o njihovoj implementaciji i na korisniku je samo da obezbedi kod za upravljanje događajima. U ovom jednostavnom primeru može postojati poziv za događaj trgovine koji se zove OnKeyEnter() koji kao argument uzima nisku karaktera, koja odgovara onome šta je korisnik otkucao pre neto šgo je pritisnuo taster ENTER. Da bi se sabrala dva broja, neophodno je skladištiti podatke izvan hendlera događaja. Sledi primer implementacije:

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

Praćenje istorije je jednostavno u klasičnom programu, ali u programu vođenom događajima iziskuje posebnu pažnju i planiranje.

Hendleri izuzetaka[uredi | uredi izvor]

U PL/1, iako sam program ne mora biti pretežno vođen događajima, izvesni abnormalni događaji kao što su hardverske greške, prekoračenja bafera ili „programske provere“ mogu da se dogode i da eventualno spreče dalje izvršavanje programa. Hendleri izuzetaka mogu da se daju korišćenjem „ON iskaza“ u pozivajućim metodama kako bi se obezbedile rutine za čišćenje stanja pre završetka rada.

Pravljenje hendlera događaja[uredi | uredi izvor]

Prvi korak u razvoju programa vođenih događajima je pisanje niza potprograma, ili metoda, koji se nazivaju rutinama za rukovanje (hendlovanje) događajima. Ove rutine hendluju događaje na koje će glavni program reagovati. Na primer, jedan klik levog dugmeta miša na komandno dugme u GUI programu može da pozove rutinu koja će otvoriti još jedan prozor, sačuvati podatke u bazu podataka ili zatvoriti aplikaciju. Mnoga moderna programerska okruženja programeru pružaju šablone za hendlere događaja, čime omogućavaju programeru da se skoncentriše na pisanje samog koda događaja.

Drugi korak je da se hendleri događaja vežu za događaje, tako da se pri javljanju događaja pozove odgovarajuća, ispravna metoda. Grafički uređivači spajaju prva dva koraka: dvoklikom na dugme, uređivač pravi (prazan) hendler događaja povezan sa akcijom klika na dugme, i otvara prozor u kome programer može da izmeni hendler događaja.

Treći korak u razvoju programa vođenog događajima je pisanje glavne petlje. Ovo je funkcija koja proverava da li je došlo do događaja, i kad dođe do nekog događaja poziva odgovarajući hendler koji će da obradi događaj. Većina programerskih okruženja za pisanje programa vođenih događajima imaju gotove glavne petlje, tako da aplikativni programer ne mora sam da je implementira. RPG, rani programski jezik iz IBMa, čiji dizajn iz 1960ih je nalikovao programiranju vođenom događajima opisanom iznad, je imao ugrađenu glavnu I/O petlju (poznatu kao „programski ciklus“), gde kalkulacije reaguju u skladu sa 'indikatorima' (flegovima) postavljenim ranije tokom ciklusa.

Kritika i najbolja praksa[uredi | uredi izvor]

Programiranje vođeno događajima ima široku primenu u grafičkim korisničkim interfejsima, na primer Android konkurentni frejmvorci su dizajnirani korišćenjem Half-Sync/Half-Async obrasca,[1] gde se koristi kombinacija jednonitne petlje za procesiranje događaja (za glavnu nit za korisnički interfejs) i sinhronih niti (za pozadinske niti). To je zato što dodaci (engl. widget) za korisnički interfejs nisu nit-bezbedni, i pošto su proširivi, ne postoji način da se garantuje da su sve implementacije nit-bezbedne, tako da jednonitni model ublažava ovaj problem.

Dizajn ovih alata je predmet kritike, na primer od strane Mira Sameka, zbog promovisanja preterano pojednostavljenog modela događaja i akcija, što programere navodi da pišu aplikacioni kod koji je podložan greškama, komplikovan za dorade i preterano kompleksan. Miro Kaže:

Takav pristup je plodno tle za bagove iz najmanje tri razloga:

  1. Uvek dovodi do kompleksne uslovne logike.
  2. Svaka tačka grananja zahteva izračunavanje kompleksnog izraza.
  3. Prebacivanje između različitih modova iziskuje izmenu mnogih promenljivih, što lako može da dovede do nedoslednosti.
— Miro Samek, Who Moved My State?, C/C++ Users Journal, The Embedded Angle column (April 2003)

i zalaže za korišćenje konačnih automata kao izvodljive alternative.[2]

Niti bez steka[uredi | uredi izvor]

Pristup vođen događajima se koristi u jeziku za opisivanje hardvera. Kontekstu niti je CPU stek neophodan samo dok aktivno obrašuje događaj. Nakon završetka obrade, CPU može da pređe na druge niti vođene događajima, što omogućava izvršavanje izuzetno velikog broja niti. U suštini ovaj pristup predstavlja konačan automat.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]