Sunteți pe pagina 1din 18

Diagrame de stare

Introducere

O diagramă de stare poate fi ataşată oricărei clase care are stări bine
identificate şi un comportament complex. O diagramă de stare descrie o
istorie a vieţii obiectelor unei clase şi poate fi considerată un graf, bazată
pe stări conectate prin tranziţii.

Diagramele de stare specifică modul în care reacţionează un obiect la


primirea unui mesaj.

O diagramă de stare are o singură stare iniţială, una sau mai multe stări
simple, una sau mai multe stări finale şi tranziţii între stări.
Elementele unei diagrame de stare

Elementele principale ale unei diagrame de stare sunt următoarele:


1) stări
2) tranziţii
3) evenimente
4) acţiuni

1) Stări
Starea acoperă toate proprietăţile statice ale unui obiect şi valorile
curente pentru fiecare proprietate. Toate instanţele unei clase există în
aceeaşi stare. Starea curentă a unui element se numeşte stare activă.

a) simplă
Stare b) iniţială
c) finală
a) Stare simplă: este o condiţie specială sau o situaţie a unui obiect de-a
lungul ciclului lui de viaţă.

Exemplu de stări de obiecte:


• obiectul bec poate avea stările: aprins şi stins;
• obiectul factură poate avea stările: plătit şi neplătit;
• obiectul lift poate avea stările: staţionează, urcă, coboară;
• obiectul calculator poate avea stările:
¾inactiv – calculatorul nu este pornit sau nu este accesibil
utilizatorilor;
¾activ – calculatorul este pornit şi este funcţional pentru utilizatorii
săi;
¾blocat – calculatorul nu este alimentat sau are unele erori majore.

Reprezentarea grafică a unei stări simple: dreptughi cu colţurile rotunjite


b) Stare iniţială: indică starea unui element şi momentul creării lui.
Există o singură stare iniţială. Se reprezintă, în UML, sub forma unui
cerc plin, de la care pleacă o săgeată.

c) Stare finală: indică starea unui element la sfârşitul vieţii sale, când el
este distrus. Într-o diagramă de stare, putem avea zero sau mai multe
stări finale. Se reprezintă, în UML, printr-un mic cerc plin, concentric
altui cerc gol, la care sosesc săgeţi de la stările sistemului, astfel:
2) Tranziţii
Tranziţiile sunt relaţiile dintre stări. O tranziţie reprezintă schimbarea
stării sursă a unui obiect, în urma unor acţiuni, datorită producerii unui
eveniment.
Tranziţiile dintre stări se produc în felul următor:
- un obiect este în stare sursă;
- se produce un eveniment (de exemplu recepţionarea unui mesaj);
- se execută o acţiune;
- obiectul intră în starea ţintă.

Într-o diagramă de stare pot exista:


- una sau mai multe tranziţii dintr-o stare, deoarece fiecare este declanşată
de un eveniment unic; în acest caz, spunem că există tranziţii cu mai
multe ţinte;
- din mai multe stări pleacă aceeaşi tranziţie, deoarece acelaşi eveniment
poate declanşa o tranziţie de la mai multe stări sursă; în acest caz, avem
tranziţia cu mai multe surse;
- tranziţie de la o stare la ea însăşi.
Tranziţiile se reprezintă, în UML, printr-o săgeată solidă, de la starea
sursă spre starea ţintă, etichetată cu numele evenimentului şi al acţiunii,
separată prin caracterul slash (‘/’), astfel:

Elementele etichetei sunt opţionale, dar nu poate exista numai acţiunea.


În cazul în care un eveniment cauzează o tranziţie fără acţiune asociată,
atunci trebuie să lipsească şi ‘/’ din eticheta unei tranziţii.

Uneori, o tranziţie se produce nu datorită unui eveniment, ci datorită


faptului că o stare completează o acţiune. În acest caz, tranziţiile fără
etichetă se numesc tranziţii automate (automatic transitions).
3) Evenimente

Un eveniment este ceva ce se produce asupra unui element. Cele mai


frecvente evenimente sunt mesajele recepţionate de un obiect.

În UML, un eveniment are următoarea sintaxă:


nume eveniment (listă parametri) [condiţia de gardă]
unde:
-nume eveniment – este, de obicei, acelaşi cu numele operaţiei
elementului care corespunde în diagrama de stare şi care se execută
pentru evenimentul respectiv (de exemplu, achitarea unei facturi,
pornirea unui calculator, etc);
-lista de parametri – este opţională şi conţine parametrii evenimentului
separaţi prin virgulă. Fiecare parametru poate fi o valoare explicită sau o
variabilă. Dacă evenimentul nu are parametri, se omit şi parantezele;
- condiţia de gardă – este, de asemenea, opţională şi indică o condiţie
care trebuie satisfăcută pentru ca o tranziţie să aibă loc. O condiţie poate
fi exprimată în limbaj natural, în limbaj de programare sau OCL.
În exemplul unui calculator, putem avea evenimentele următoare:
-Startup – indică faptul că un calculator trece din starea sursă, inactiv, în
starea ţintă, activ. Dacă calculatorul este parolat, atunci există parametrul
UserID. De asemenea, există posibilitatea ca un calculator să nu poată fi
pornit din anumite motive (pană de curent), atunci se impune condiţia de
gardă: dacă calculatorul poate fi pornit.
-Shutdown – indică faptul că un calculator, din starea activ, trece în starea
inactiv. Acest eveniment poate avea parametrul UserID. De asemenea,
există posibilitatea ca un calculator să nu poate fi închis din anumite
motive (de exemplu, nu au fost închise toate aplicaţiile), atunci se impune
condiţia de gardă: dacă calculatorul poate fi închis.
-Reset – indică faptul că respectivul calculator poate trece din starea
blocat în starea activ.
- Eroare Sistem – indică faptul că respectivul calculator are erori grave şi
trece din starea activ în starea blocat.
4) Acţiuni: reprezintă o prelucrare executată de un obiect aflat într-o stare
sursă, declanşată în urma producerii unui eveniment (de exemplu,
recepţionarea unui mesaj). O acţiune nu poate fi întreruptă de
evenimente.
În UML, o acţiune are următoarea sintaxă:
Valoare_returnată:= element_ţintă.nume_acţiune (listă argumente)
unde:
- Valoare_returnată – este opţională şi indică numele pentru valoarea
rezultată de acţiunea declanşată de un eveniment. Dacă se omite acest
câmp sau dacă acţiunea nu întoarce nici o valoare, atunci se vor omite şi
caracterele “:=”.
- Element_ţintă – este numele elementului care va executa acţiunea.
Dacă elementul care enunţă acţiunea este acelaşi cu elementul care
primeşte evenimentul declanşator al acţiunii respective, atunci acest câmp
se omite, împreună cu caracterul punct (‘.’).
- Nume acţiune – este, de obicei, acelaşi cu numele operaţiei elementului
respectiv sau al operaţiei elementului – ţintă, dacă acesta este specificat.
- Listă de argumente – este opţională şi indică parametrii care participă la
acţiune, separaţi prin virgulă. Fiecare parametru poate fi o variabilă sau o
valoare explicită.
variabilă
Tipuri de evenimente şi acţiuni
În UML, există patru tipuri de evenimente: a)apeluri de operaţii;
b)semnale; c)schimbarea condiţiilor; d)scurgerea unui interval de timp.

a) Eveniment – apel de operaţie


Apelul de operaţie este un eveniment care, atunci când se produce,
determină schimbări în starea elementului care primeşte apelul.
Acest tip de eveniment este numit mesaj, se implementează, de obicei, ca
un mesaj sincron şi apare în eticheta unei tranziţii. Astfel, când un obiect
transmite un mesaj altui obiect (sau lui însuşi) şi invocă o operaţie,
controlul trece de la obiectul expeditor la obiectul destinatar. Obiectul
apelat execută tranziţia asociată evenimentului respectiv, îşi schimbă
starea şi transmite apelantului controlul. Apelurile de operaţii pot fi mesaje
asincrone, dacă limbajul care le implementează suportă calcul paralel.
b) Eveniment – semnal

Semnalul este un obiect expediat asincron de un obiect şi recepţionat de


alt obiect. Acest tip de eveniment se numeşte tot mesaj şi apare ca o
semnătură de eveniment într-o stare de tranziţie. Semnalul poate
declanşa o acţiune obiectului receptor într-o maşină de stare, în urma
căreia obiectul respectiv îşi schimbă starea, sau poate fi un mesaj
asincron într-o diagramă de interacţiune. Semnalele pot avea parametri,
care se scriu între paranteze rotunde.

Semnalele sunt definite ca un tip special de clasă, stereotipizate cu


<<signal>>. Aceste clase sunt folosite numai pentru trimiterea mesajelor,
nu pot avea operaţii, iar eventualii parametri ai semnalului sunt trecuţi în
compartimentul atributelor. Se poate construi o ierarhie de clase signal,
adică între semnale pot exista relaţii de generalizare, dar sunt excluse
orice relaţii cu clasele obişnuite.
Dacă o tranziţie are o semnătură de eveniment semnal, atunci toate
subsemnalele vor putea fi recepţionate prin acelaşi semnal, aşa cum este
ilustrat în figura de mai jos:
c) Eveniment – schimbare
Un eveniment schimbare reprezintă trecerea unui obiect în altă stare, în
funcţie de satisfacerea unei condiţii. Condiţia apare în condiţia de gardă a
semnăturii unei tranziţii. În UML, un astfel de eveniment este modelat cu
cuvântul cheie when, urmat de o expresie booleană. Se poate folosi o
expresie booleană pentru a indica o valoare (exemplu [when x=1]) sau
pentru testarea continuă a unei expresii (ca de exemplu, [when x<100]).

d) Eveniment – temporal
Un eveniment temporal este o întâmplare care depinde de scurgerea
timpului. El se reprezintă în UML prin cuvântul cheie after, urmat de un
interval de timp care reprezintă timpul scurs din momentul tranziţiei până
la schimbarea stării. Intervalul de timp poate fi redat în limbaj natural,
expresie de timp, sau în orice mod, dar trebuie să fie cât mai explicit.
Această combinaţie after+expresie_timp se trece în semnătura unei
tranziţii, la condiţia de gardă.

De exemplu, putem reprezenta evenimentele temporale, [after 5 secunde],


[after 2 secunde de la părăsirea stării], etc. Într-un eveniment temporal,
expresia din condiţia de gardă poate să nu fie precedată de cuvântul cheie
after (de exemplu, putem scrie [timp = timpdat], în loc de [after timpdat]).
Activităţile stărilor
Pentru reprezentarea unei stări, se foloseşte tot dreptunghiul cu colţurile
rotunjite, compartimentat în trei zone:
- Compartimentul superior este dedicat numelui stării, care trebuie să fie
scris indiferent dacă dreptunghiul este compartimentat sau nu.
- În compartimentul din mijloc se scriu eventualele variabile de stare
(contori, date, constrângeri, etc.).
- În zona inferioară se trec activităţile, unde vor fi specificate
evenimentele şi acţiunile.
În cazul descrierii activităţilor, evenimentele şi acţiunile au aceeaşi sintaxă
ca şi în cazul tranziţiilor şi anume:
Nume eveniment (listă_parametri) [condiţie_gardă]
/element_ţintă.nume acţiune (listă_argumente)

Nume eveniment poate fi orice, dar, de obicei, există trei evenimente


standard care pot declanşa acţiuni stărilor, şi anume:
- entry – specifică acţiunea care se produce atunci când obiectul intră în
starea respectivă;
- exit – specifică acţiunea care se execută atunci când obiectul părăseşte
starea respectivă;
- do – specifică acţiunea care se execută atunci când obiectul se află în
starea respectivă.