Proiect colectiv

Analiza unui proiect

Back Up Next

 

1. Analiza orientată obiect a aplicaţiilor utilizând UML

Analiza unei aplicaţii implică realizarea mai multor categorii de modele, dintre care cele mai importante sunt:

1.        Modelul de utilizare. realizează modelarea problemelor şi a soluţiilor acestora în maniera în care le percepe utilizatorul final al aplicaţiei. Diagramă asociată: diagramă de cazuri de utilizare

2.        Modelul structural: se realizează pe baza analizei statice a problemei şi descrie proprietăţile statice ale entităţilor care compun domeniul problemei. Diagrame asociate: diagramă de module, diagramă de clase.

3.        Modelul comportamental: priveşte descrierea funcţionalităţiilor şi a succesiunii în timp a acţiunilor realizate de entităţile domeniului problemei. Diagrame asociate: diagrama (harta) de stări, diagrama de colaborare, diagrama de interacţiune

1.1. Modelul de utilizare

Diagramele de cazuri utilizare descriu funcţionalitatea unui sistem.  Aceste diagrame conţin următoarele tipuri de elemente:

-          Actori: sunt reprezentate grafic prin intermediul unui “omuleţ” şi reprezintă “utilizatorii” uni sistem (utilizatori umani sau alte sisteme)

-          Cazuri de utilizare: sunt prezentate grafic prin intermediul unor elipse etichetate, şi reprezintă funcţionalităţi sau servicii furnizate utilizatorilor de către un sistem.

Figura 1 prezintă un şef de proiect care comunică cu cazul de utilizare “Gestionează proiecte” (sau cu alte cuvinte care utilizează funcţionalitatea sistemului de a gestiona proiecte).  Linia care conectează actorul şi cazul de utilizare indică faptul că actorul participă la funcţionalitatea furnizată de către cazul de utilizare.


Figura 1.

Figura 2 ilustrează detalierea cazului de utilizare “Gestionează proiecte”


Figura 2.

1.1. Modelul structural

Modelul structural descrie structura sistemului (prin diagrame de module) şi a obiectelor care fac parte dintr-un sistem: identitatea lor, relaţiile cu celelalte obiecte, atributele şi operaţiile lor (numit şi model obiect) prin intermediul diagramelor de clase).

Prezentare generală a modelului obiect

Câteva dintre conceptele importante folosite în construirea modelului obiect sunt: obiect, clasă, legătură, asociere, agregare şi generalizare.

Scopul modelării obiect este de a descrie obiecte. Un obiect se defineşte ca fiind un concept, abstracţie sau lucru cu înţeles şi limite bine definite pentru problema în lucru. Descompunerea unei probleme în obiecte nu este unică şi ea depinde de natura problemei.

O clasă descrie un grup de obiecte cu proprietăţi similare ( atribute ), comportament comun ( operaţii ) şi relaţii similare cu celelalte obiecte. Gruparea obiectelor în clase realizează o abstractizare a problemei. Abstractizarea permite generalizarea anumitor cazuri specifice la o mulţime de cazuri similare.

Un atribut este o informaţie ţinută de obiectele dintr-o clasă. Fiecare atribut are o anumită valoare pentru fiecare instanţă. Fiecare nume de atribut este unic în cadrul unei clase, dar nu este neapărat unic de-a lungul tuturor claselor.

O operaţie este o funcţie sau o transformare care poate fi aplicată unor sau de către obiectele unei clase. Fiecare operaţie are ca argument implicit obiectul ţintă. Aceeaşi operaţie poate fi aplicată în clase diferite şi de aceea poate avea forme diferite în clase diferite. O metodă este implementarea unei operaţii într-o clasă.

O legătură este o conexiune fizică sau conceptuală între două sau mai multe instanţe. O asociere descrie un grup de legături cu semantică şi structură comună. Asocierile sunt adesea implementate în limbajele de programare ca pointeri de la un obiect la altul. Asocierile sunt importante deoarece pot modela foarte bine informaţiile care nu sunt subordonate unei singure clase dar depind de două sau mai multe clase. O noţiune care apare legată de asocieri este multiplicitatea care specifică faptul că zero, una sau mai multe instanţe ale unei clase pot avea legături cu o singură instanţă a clasei asociate.

Moştenirea este o abstractizare puternică pentru factorizarea similarităţilor între clase. Generalizarea este o relaţie între o clasă şi una sau mai multe versiuni rafinate ale ei. Clasa care este rafinată se numeşte superclasă, iar versiunile rafinate ale ei subclase. Atributele şi operaţiile comune unui grup de subclase sunt ataşate superclasei şi sunt partajate de fiecare subclasă; spunem că subclasele moştenesc trăsăturile superclasei. Generalizarea este utilă atât la modelare cât şi la implementare. Ea facilitează modelarea prin structurarea claselor şi capturarea succintă a ceea ce este similar şi aceea ce este diferit între clase.

Agregarea este o formă puternică a asocierii, în care un obiect agregat este ‘construit din’ componente, care sunt ‘părţi ale’ agregatului. Un agregat poate avea mai multe părţi; fiecare relaţie parte-întreg este tratată ca agregare separată. Părţile pot să apară în mai multe agregate. Agregarea este inerent tranzitivă: un agregat are părţi care, la rândul lor, pot avea părţi etc.. Agregarea nu este un concept individual ci o formă specială a asocierii. Dacă două obiecte sunt strâns legate printr-o relaţie parte-întreg atunci avem o agregare. În schimb, dacă două obiecte sunt considerate independente, chiar dacă între ele poate exista uneori o relaţie, atunci avem o asociere.

 Diagrama folosită în modelarea obiect se numeşte diagramă de clase şi ea oferă o notaţie grafică pentru reprezentarea claselor şi relaţiilor dintre ele. Diagramele de clase descriu cazuri generale în modelarea sistemului.

Clasele sunt reprezentate de dreptunghiuri împărţite în trei compartimente şi care conţin numele clasei (în compartimentul superior), lista de atribute ale clasei (opţional) şi lista de operaţii (opţional) cu argumentele lor şi tipul returnat. Cele trei compartimente vor fi separate între ele prin câte o linie orizontală.

Valorile iniţiale ale atributelor pot fi specificate astfel: nume:tip=expresie.

Figura 1. Exemplu de clasă

Toate relaţiile din cadrul diagramei de clase sunt reprezentate grafic printr-o succesiune de segmente orizontale sau verticale care leagă o clasă de alta.

Asocierea poate avea sau nu un nume care se va afla tipărit în vecinătatea sa şi va conţine o săgeată care precizează modul de citire al acestuia. O asociere poate avea nume diferite pentru fiecare direcţie. Fiecare capăt al asocierii este un rol şi fiecare rol poate avea un nume ( nume de rol ) care arată cum este văzută clasa asociată lui de alta. Fiecare rol indică multiplicitatea clasei sale ( câte instanţe ale clasei pot fi asociate cu o instanţă a altei clase ). Multiplicitatea poate fi 1 ( nu se marchează ), 0-1 ( marcată printr-un cerc alb ) 0 sau mai multe ( marcată printr-un cerc negru ), sau alte intervale de valori întregi care se indică prin expresii de tipul 1+ ( mai mult de o instanţă ), 3 ( exact trei instanţe ) sau 2-4 ( între 2 şi 4 instanţe inclusiv ).

Figura 2. Relaţii de asociere

Este posibilă asocierea între o clasă şi ea însăşi sau mai multe asocieri la aceeaşi pereche de clase. Dacă multiplicitatea este mai mare ca 1 atunci lângă rol poate apare adnotarea {ordered} care indică faptul că elementele au o ordine explicită; în caz contrar elementele nu au o ordine predefinită.

Agregarea este o formă specială de asociere cu înţelesul de relaţie ‘parte-întreg’. Ea se indică prin plasarea unui mic romb la capătul corespunzător clasei care semnifică ‘întreg’. Multiplicitatea unei agregări precum şi calificarea se reprezintă analog ca la asocieri.

Figura 3. Relaţia de agregare

Generalizarea se reprezintă grafic sub forma unui triunghi echilateral cu o linie ( frântă ) de la un vârf al acestuia ( vârf care trebuie să fie îndreptat spare supeclasă ) la superclasă şi o linie frântă de la baza triunghiului opusă vârfului la fiecare subclasă. Generalizare este o relaţie n-ară. Din punct de vedere grafic simbolul de generalizare ( triunghiul ) poate fi considerat ca un nod al diagramei. Deci în reprezentarea unei relaţii de generalizare sunt implicate un nod (triunghiul ) şi două arce (unul care uneşte o clasă de vârful triunghiului, şi altul care uneşte o clasă de baza triunghiului ).

În general subclasele sunt disjuncte, ceea ce este reprezentat prin culoarea albă a triunghiului; există însă situaţii când acestea nu respectă acestă proprietate, fapt care se reprezintă printr-un triunghi negru.

 

Figura 4. Relaţia de generalizare

 

 

1.3. Modelul de stari

         În UML hărţile de stări sunt utilizate în descrierea comportamentului obiectelor aparţinând unui clase. 

        O stare (concretă) este caracterizată de valorile proprietăţilor unui obiect şi de mulţimea mesajelor care pot fi acceptate de către acest obiect la un moment dat.  O stare conţine descrierea unui invariant de stare (condiţie logică adevărată pentru toate obiectele care se află în starea respectivă), şi a trei proceduri speciale: entry, exit şi do.  Aceste proceduri descriu secvenţele de acţiuni care vor fi executate în momentul în care un obiect intră (entry), părăseşte (exit) sau se află (do) în starea respectivă.  O stare se reprezintă grafic prin intermediul unui dreptunghi cu colţurile rotunjite, afişând în partea superioară un nume de stare.  În partea inferioară a dreptunghiului opţional poate exista un compartiment care conţine expresiile ce definesc invariantul de stare şi cele trei proceduri speciale. 

        O tranziţie exprimă o situaţie în care un obiect poate trece dintr-o stare în alta.  Tranziţiile se reprezintă grafic prin intermediul unor arce de cerc, linii simple sau linii poligonale orientate şi (opţional) etichetate care unesc două stări, numite stare sursă, respectiv destinaţie.  Eticheta unei tranziţii este formată dintr-o signatură de mesaj, o condiţie (expresie logică) şi o secvenţă de activităţi care au loc în momentul declanşarii tranziţie.  Pentru un obiect oarecare o tranziţie este declanşată atunci când obiectul se află în starea sursă a acesteia, execută operaţia corespunzătoare mesajului şi este îndeplinită condiţia specificată în etichetă.

Hărţile de stări permit reprezentarea ierarhică a stărilor unui obiect prin intermediul stărilor compuse (întâlnite şi sub denumirea de XOR-stări, stări abstracte sau super-stări).  Stările compuse conţin un număr finit de stări simple sau compuse.  Un obiect aflat într-o stare compusă se va afla în una şi numai una din sub-stările acesteia. Stările compuse se reprezintă grafic la fel ca stările simple, la care se adaugă un compartiment special, localizat între numele stării şi compartimentul destinat afişării invarianţilor de stare şi a procedurilor speciale.  În cadrul acestui compartiment sunt reprezentate grafic toate sub-stările corespunzătoare.

Figura 5. Etichetarea tranziţiilor în hărţile de stări UML

        Hărţile de stări permit modelarea de comportamente paralele ale unui obiect prin intermediul stărilor ortogonale (denumite şi AND-stări sau stări concurente).  Stările ortogonale sunt formate din mai multe componente ortogonale, fiecare dintre acestea conţinând diverse sub-stări.  Un obiect aflat într-o stare ortogonală se va afla de fapt în câte o stare corespunzătoare fiecărei componente ortogonale a acesteia.  Reprezentarea grafică a stărilor ortogonale este asemănătoare reprezentării stărilor compuse, componentele ortogonale ale acestora fiind delimitate prin linii punctate verticale.


Figura 6.
Principalele notaţii ale hărţilor de stări UML

         De asemenea, hărţile de stări introduc o serie de stări speciale, numite pseudo-stări.  Pseudo-stările sunt stări intermediare care permit conectarea mai multor tranziţii în scopul descrierii unor situaţii complexe de modificare a stării concrete a unui obiect.  Cele mai importante pseudo-stări definite în UML sunt:

-          starea iniţială - indică sub-starea implicită în care intră un obiect în cazul declanşării unei tranziţii a cărei stare destinaţie este o stare compusă.  Se reprezintă grafic sub forma unui cerc plin.

-          starea finală - indică părăsirea contextului unei stări compuse.  În cazul în care starea finală aparţine stării compuse de la cel mai înalt nivel al ierarhiei de stări (este rădăcina ierarhiei de stări) intrarea o tranziţie spre această stare semnifică distrugerea obiectului.

-          starea istoric - este utilizată atunci când sub-starea iniţială a unei stări compuse nu este fixată decât pentru prima tranziţie spre această stare compusă, ea fiind dată mai apoi de ultima sub-stare activă.  În figura 6 o primă tranziţie spre starea Pornita implică activarea sub-stării Normal, următoarele tranziţii activând sub-starea (Normal sau Marsalier) activă în momentul ultimei părăsiri a stării Pornita.

 

Back Up Next