Polimorfism
Polimorfismul este modalitatea de a asocia aceluiasi mesaj semnificatii diferite, în functie de tipurile parametrilor mesajului. Polimorfismul este de urmatoarele tipuri:
polimorfism ad-hoc
polimorfism pur
polimorfism parametric
Polimorfismul ad-hoc se refera la posibilitatea ca o aceeasi operatie efectuata asupra unui obiect sa aiba un comportament diferit în functie de argumentele operatiei. Polimorfismul ad-hoc se realizeaza prin supraîncarcare si legare statica. Supraîncarcarea înseamna ca aceeasi operatie poate avea definitii diferite, pentru tipuri diferite ale argumentelor. Legarea statica înseamna ca legatura între apelul operatiei si operatia care va fi efectiv executata este realizata la momentul compilarii programului, în functie de tipurile argumentelor si ar 949g66j itatea operatiei.
Spre exemplu, sa consideram o clasa care reprezinta conceptul de vehicul. Orice vehicul se caracterizeaza prin viteza de deplasare, care este un numar real pozitiv. Întrucât majoritatea vehiculelor sunt automobile, este natural sa presupunem ca de obicei viteza unui vehicul este de 80 km/h. Un avion este un vehicul, dar a carui viteza este de 800 km/h. În acest fel metoda de determinare a vitezei unui avion suprascrie (redefineste) metoda implicita de determinare a vitezei unui vehicul.
Polimorfismul pur se refera la posibilitatea ca o aceeasi operatie executata asupra unor obiecte apartinând unor clase diferite, dar corelate printr-o aceeasi superclasa sa depinda de tipul obiectelor respective. Polimorfismul pur se realizeaza prin folosirea metodelor virtuale. O metoda virtuala desemneaza o operatie care va fi apelata corect în orice situatie, în functie de tipul obiectului asupra caruia este executata. Metodele virtuale sunt implementate prin legare dinamica, acest lucru însemnând ca legatura între apel si operatia efectiv executata se realizeaza la momentul executiei.
Revenind la exemplul anterior, sa prespunem ca dorim sa determinam viteza unui vehicul al carui tip nu-l cunoastem. În cazul polimorfismului ad-hoc se va obtine viteza 80 km/h indiferent de tipul efectiv al vehiculului respectiv. Daca însa metoda de determinare a vitezei este virtuala si tipul vehiculului este avion, se va obtine valoarea 800 km/h.
Polimorfismul parametric semnifica faptul ca tipurile argumentelor unei operatii sunt deasemenea parametrii ai operatiei respective. Pentru fiecare instantiere a acestor parametrii se va obtine o noua versiune a operatiei respective. Polimorfismul parametric se foloseste mai ales pentru implementarea unor clase container parametrizate dupa tipul elementelor.
Clase abstracte
Deseori clasa de baza a unei ierarhii de clase trebuie sa fie foarte generala si în consecinta ea va contine foarte putini membri, detaliile fiind lasate pe seama claselor derivate. La limita putem face clasa de baza atât de generala încât ea sa nu poata fi folosita pentru crearea directa de obiecte. Ea neavând instante, nu are sens sa-i implementam metodele, acestea actionând doar ca sabloane pentru metodele definite în clasele derivate. O astfel de clasa se numeste clasa abstracta si o astfel de metoda se numeste metoda virtuala pura. O clasa abstracta defineste doar o interfata comuna minimala pentru toate clasele derivate din ea.
Spre exemplu, putem defini o clasa abstracta pentru reprezentarea conceptului de vehicul si o metoda virtuala pura pentru determinarea vitezei unui vehicul. Prezenta sa are semnificatia ca orice vehicul, indiferent de tip, are viteza. Întrucât nu putem determina cu exactitate aceasta viteza daca nu cunoastem tipul vehiculului, aceasta metoda va fi redefinita pentru fiecare tip de vehicul în parte în cadrul clasei derivate corespunzatoare. Spre exemplu putem avea o clasa derivata pentru conceptul de automobil si una pentru conceptul de avion.
3.2. Modelul obiectelor
Orice MDOO foloseste un model al obiectelor - MO, acest lucru fiind valabil si pentru metodele OMT si UML.
Se numeste model al obiectelor - MO o notatie grafica si textuala a conceptelor cheie vehiculate în cadrul unei MDOO. MO va contine urmatoarele elemente:
lista a claselor si obiectelor din domeniul problemei
numele atributelor obiectelor
numele operatiilor claselor
relatiile dintre clase si obiecte
Reprezentarea claselor si obiectelor
Un obiect se simbolizeaza printr-un dreptunghi cu colturile rotunjite. Optional dreptunghiul poate contine si valorile atributelor obiectului, cât si clasa careia îi apartine obiectul. Câteva exemple sunt ilustrate în figura 3.1.
Fig. 3.1. Exemple de obiecte
O clasa se simbolizeaza printr-un dreptunghi cu colturile drepte. Optional, dreptunghiul poate contine si numele/tipurile (semnaturile) atributelor si operatiilor clasei. Câteva exemple sunt ilustrate în figura 3.2.
Fig. 3.2. Exemple de clase
Legaturi si asocieri
O legatura desemneaza o conexiune fizica sau conceptuala între doua sau mai multe obiecte. Spre exemplu, legatura ''România are capitala Bucuresti'' se simbolizeaza în UML dupa cum se arata în figura 3.3.
Fig. 3.3 Exemplu de legatura
Din punct de vedere formal, o legatura este tuplu format din obiectele implicate în cadrul legaturii respective. Spre exemplu, legatura din figura 3.3. corespunde tuplului are-capitala (Romania, Bucuresti).
O asociere descrie un grup de legaturi cu o structura si o semantica comuna. Din acest punct de vedere, putem privi o legatura drept o instanta a unei asocieri. Spre exemplu, între clasele Tara si Oras exista asocierea are-capitala, fapt ilustrat grafic în figura 3.4.
Fig. 3.4. Exemple de asocieri
Din punct de vedere formal, o asociere reprezinta un predicat ale carui argumente sunt clasele implicate în asocierea respectiva. Orice asociere se caracterizeaza prin multiplicitate. Multiplicitatea ne indica numarul instantelor unei singure clase care vor fi în relatie de legatura cu o singura instanta a altei clase participante la asociere. Exista urmatoarele variante de multiplicitati:
unu-unu
unu-multi
multi-multi
Spre exemplu, o tara are o singura capitala, fapt ce ne arata ca asocierea are-capitala este unu-unu. În schimb, un profesor poate preda mai multe discipline, fapt ce ne arata ca asocierea preda este multi-multi. Acest lucru este ilustrat grafic în figura 3.5.
Sensul unei asocieri ne indica clasele asociante si clasele asociate. Spre exemplu, unei tari are sens sa-i asociem capitala, care este un oras. Însa unui oras arbitrar nu are sens sa-i asociem tara a carei capitala este. Deci relatia de asociere are-capitala este unidirectionala, fapt indicat de o sageata, ca în figura 3.6. În schimb, orice disciplina este predata de un profesor, deci asocierea preda este bidirectionala.
Fig. 3.5. Exemplu de asociere unu-multi
Fig. 3.6. Exemplu de asociere cu sens
Multiplicitatea unei asocieri depinde de punctul de vedere din care este abordata problema. Spre exemplu, daca clasa Profesor descrie profesorul titular (cel care preda cursul) al unei discipline, atunci asocierea preda este unu-multi. Daca însa clasa Profesor ne indica orice profesor, asocierea este multi-multi, deoarece profesorul titular poate fi diferit de profesorul care preda seminarul sau laboratorul la disciplina respectiva.
O alta caracteristica a unei asociatii este aritatea. Ea reprezinta numarul de clase implicate în asociatie. Pâna acum am vazut doar exemple de asociatii binare. Un exemplu de asociere ternara este:
un student are un proiect la o anumita disciplina
O asociere ternara se simbolizeaza grafic ca în figura 3.7.
Fig. 3.7. Exemplu de asociere ternara
Orice asociere n-ara cu n > 2 se poate reprezenta cu ajutorul a n asociatii binare. Pentru aceasta se defineste o clasa pentru reprezentarea asocierii si relatii binare de asociere între clasele asocierii si clasa care modeleaza asocierea. Spre exemplu, asocierea ternara din figura 3.7. se poate transforma în multimea de asocieri binare din figura 3.8.
Fig. 3.8. Transformarea unei asocieri ternare într-o multime de asocieri binare
O asociere poate fi optionala. Spre exemplu, faptul ca un oras poate fi o capitala a unei tari poate fi modelat cu ajutorul unei asociatii optionale, ca în figura 3.9.
Fig. 3.9. Exemplu de asociere optionala
Roluri si calificatori
Un rol reprezinta o extremitate a unei asocieri. O asociere n-ara va avea n roluri. Un rol modeleaza rolul jucat de clasa corespunzatoare în cadrul asocierii respective. Spre exemplu, clasa Oras joaca rolul de capitala în asocierea are-capitala. Similar, clasa Persoana din cadrul asocierii angajeaza dintre o persoana si o companie joaca rolul de angajat. În general, rolurile sunt specializari ale clasei ce apare în asocierea respectiva.
În cadrul metodei de modelare UML, rolurile se desemneaza prin etichete textuale plasate la capetele asocierii, ca în figura 3.10.
Fig. 3.10. Exemplu de asociere cu roluri
Specificarea rolurilor în cadrul unei asocieri este optionala. Prezenta lor nu poate însa duce decât la cresterea lizibilitatii modelului. Un element important al unei asocieri îl constituie calificatorul. El este un atribut special care poate reduce multiplicitatea unei asocieri. Un calificator este similar unei chei unice asociate unui rol. Spre exemplu, un director de fisiere poate contine mai multe fisiere. Însa, în cadrul unui director, orice fisier are un nume unic. Acest lucru este ilustrat grafic în figura 3.11.
Fig. 3.11. Exemplu de asociere cu calificator
Modelarea asocierilor prin clase
Uneori este util sa modelam asocierile prin clase si legaturile prin instante ale acestor clase. Acest lucru este necesar atunci când asocierilor li se ataseaza atribute. Spre exemplu, o persoana care lucreaza pentru o anumita companie are un anumit salariu si o anumita functie. Este mai natural sa consideram aceste proprietati drept atribute ale asocierii si nu ale persoanei implicate. Astfel, o persoana poate lucra pentru mai multe companii si pentru fiecare astfel de asociere exista o functie si un salariu. Aceasta situatie este ilustrata grafic în figura 3.12.
Fig. 3.12. Exemplu de asociere modelata ca o clasa
Agregari
Cu ajutorul agregarii se descrie un obiect agregat format din obiecte componente. În acest fel agregarea descrie o relatie de compozitie de tip parte-întreg. Agregarea este o relatie între obiecte si ea poate fi fixa, variabila
sau recursiva. Cu toate ca agregarea a fost definita ca o relatie între obiecte, ea se simbolizeaza în cadrul UML prin conectarea claselor implicate, de partea clasei corespunzatoare obiectului agregat fiind indicat un mic romb. Câteva exemple de agregari sunt indicate în figura 3.13.
Fig. 3.13. Exemple de agregari (fixa, variabila sirecursiva)
Mostenire
Pentru a specifica faptul ca o clasa este o specializare a altei clase UML foloseste un simbol de forma unui triunghi. Triunghiul este gol în cazul în care specializarile claselor nu se suprapun, atât din punctul de vedere al starilor cât si al comportamentului si plin în caz contrar. Figura 3.14 prezinta o ierarhie cu mostenire multipla.
Fig. 3.14. Exemplu de mostenire
Exemple
În acest pargraf se prezinta doua exemple de modelare obiectuala care combina agregarea si asocierea si respectiv agregarea recursiva cu mostenirea. Aceste exemple sunt ilustrate în figurile 3.15 si respectiv 3.16.
Fig. 3.15. Combinarea asocierii cu agregarea
Fig. 3.16. Combinarea agregarii recursive cu mostenirea
|