Programarea orientată pe evenimente

Când se lucrează cu o interfață grafică, pe ecranul stației de lucru apar diferite obiecte grafice: ferestre, meniuri, butoane, bare de defilare etc. Operatorul poate utiliza tastatura stației de lucru, la fel ca în cazul progrămarii tradiționale, dar, în plus, utilizează un dispozitiv de selecție numit mouse, cu ajutorul căruia poate alege diferite obiecte grafice de pe ecran și poate da anumite comenzi prin apăsarea unuia din butoanele acestui dispozitiv.

Se numeste eveniment orice modificare care are loc, fie în starea dispozitivelor de intrare, fie în cea a obiectelor grafice de pe ecran: apăsarea sau eliberarea unei taste, deplasarea mouse-ului, apăsarea sau eliberarea unui buton al mouse-ului, deschiderea sau închiderea unei ferestre, efectuarea unui clic de mouse pe un obiect de control (buton, caseta de validare, bara de defilare etc.), intrarea cursorului de mouse în câmpul activ al unui obiect grafic sau părăsirea acestuia etc. Pot exista, desigur, și alte tipuri de evenimente, dar aici ne interesează numai cele legate de interfața grafică a aplicației.

Interacțiunea dintre operator și aplicație într-un sistem bazat pe evenimente decurge astfel: operatorul provoacă generarea unui eveniment, acționând asupra tastaturii, mouse-ului sau a altui dispozitiv de intrare, iar programul "răspunde" la acest eveniment prin executarea unei anumite acțiuni. Acest mod de lucru impune o nouă concepție în proiectarea programelor, numită programarea orientată pe evenimente.
 
În programarea procedurală tradițională, procesul de calcul este în întregime ghidat de instrucțiunile programului. Imediat ce s-a încheiat executarea unei instrucțiuni, se trece la instrucțiunea următoare, respectând fluxul de instrucțiuni al programului respectiv. Aceasta se referă și la interacțiunea dintre program și utilizator. Chiar dacă programul este interactiv, initiațiva privind ce date trebuie introduse și în ce moment se introduc acestea aparține programului. Operatorului uman nu îi rămâne decât să se conformeze solicitărilor programului și să introducă date atunci când ele sunt cerute de acesta. Este evident că un asemenea rol nu este deloc convenabil pentru om, care dorește să aibă el inițiativa acțiunilor. 

Apariția interfețelor grafice a permis introducerea unei noi concepții în interacțiunea dintre operator și aplicatie, astfel ca inițiativa să îi revină operatorului uman, iar programul să execute comenzile acestuia. S-a trecut, astfel, de la programarea procedurală tradițională la programarea orientată pe evenimente (engleză: Event-Oriented Programming), cunoscuta și sub numele de programare ghidată de evenimente (engleză: Event Driven Programming). 

Există diferite modele de generare, captare și tratare a evenimentelor. În lucrarea de față va fi prezentat modelul de evenimente specific platformei Java 2.

Modelul de evenimente de pe Platforma Java 2

In JDK 1.0 s-a folosit un model de evenimente bazat pe moștenire, reprezentat prin clasa Event. Această clasă este menținuta în continuare, din motive de compatibilitate a programelor din JDK 1.0 cu cele din versiunile ulterioare, dar nu mai este recomandată. 

Începând cu JDK 1.1 s-a introdus un nou model de evenimente, bazat pe delegare (engleză: Delegation Event Model). Conform acestui model, distingem trei catedorii de obiecte care au relații cu evenimentele:
    - obiecte care generează evenimente, numite surse de evenimente (engleza: Event Source);
    - obiecte care captează și tratează evenimentele, numite ascultători de evenimente (engleză: Event Listener);
    - evenimentele propriu-zise (engleză: Event), care sunt tot obiecte, generate de surse și captate de ascultători.
Un eveniment generat de o sursă poate fi interceptat  de mai mulți ascultători. Este posibil ca un obiect să se "asculte" pe sine însuși, deci să își trateze propriile evenimemte. Tocmai această legatură strânsa între sursele și ascultătorii de evenimente este caracteristica esențiala a "modelului delegării": ea constă în faptul că sursa transmite evenimentele generate de ea numai către ascultătorii care au fost atașați la sursa respectivă, iar ascultătorul primește evenimente numai de la sursele la care a fost atașat.
 
În modelul de evenimente din JDK 1.0 sursa transmitea evenimentele fără o destinație anume, iar consumatorii de evenimente trebuiau sa depisteze singuri ce fel de evenimente sunt acestea și de la ce sursă provin și, în funcție de aceasta, să decidă dacă interceptează sau nu evenimentul respectiv. 
Remarcăm, deci, că se aplică cu consecvență principiul programării orientate pe obiecte, în sensul că aplicația este constituită dintr-un ansamblu de obiecte care interacționează. Putem spune că evenimentul este o nouă forma de mesaj, care se transmite între obiectele-sursă și obiectele-ascultători. Fiecare ascultator trebuie "adăugat" la sursă. În acest fel, sursa "știe" căror ascultători să le transmită evenimentele pe care le generează. 

Este important sa reținem faptul că, în acest model de evenimente, sursele sunt întotdeauna componente ale interfeței grafice. Când cursorul mouse-ului intră în interiorul unei componente sau iese din aceasta, sau când facem click de mouse pe o componenta, evenimentul nu este generat direct de către mouse, ci de către componenta respectivă a interfeței. În mod similar, când apăsăm sau eliberăm o tastă, evenimentul nu este generat direct de către tastă, ci de către acea componentă a interfeței grafice, care este activă în momentul respectiv. Evenimentele pot fi generate de o componentă și atunci când au loc modificari ale stării acesteia ca urmare a executării unor instrucțiuni din program (de exemplu când se deschide sau se închide o fereastră, etc.).



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați