|
Concepte de baza ale dezvoltarii produselor program
Obiect soft
In sens larg, un obiect este o entitate care se poate distinge de alte entitati si care are o semnificatie in contextul aplicatiei pe care o dezvoltam.
Majoritatea obiectelor apartin uneia dintre urmatoarele categorii:
- tangibile: apartin lumii reale si in general corespund substantivelor din limbajul natural,
- incidente (evenimente): ele modeleaza stari de lucruri care se petrec la un moment dat
sau fenomene. Joaca un rol important in modelarea dinamica.
- interactiuni (legaturi): modeleaza interactiunile dintre obiecte,
- specificatii: definesc calitati ale unor definitii. Ele corespund metadatelor - date care
descriu alte date,
- fictive (intangibile): modeleaza entitati conceptuale abstracte,
- roluri: modeleaza calitatile diverselor obiecte perticipante la o interactiune.
Un obiect are trei caracteristici definitorii:
- stare: cuprinde toate proprietatile (de obicei statice) impreuna cu valorile curente
(de obicei dinamice) ale acestor proprietati.
O proprietate este o caracteristica distinctiva, calitate sau atribut al unui obiect si ea contribuie la unicitatea obiectului respectiv
Proprietatile sunt in general statice, in sensul ca nu se schimba in timp.
Proprietatile au valori, acestea putand fi valori simple sau alte obiecte.
Valorile sunt in general dinamice, in sensul ca se schimba in timp.
- Comportament: reprezinta modul in care un obiect actioneaza si reactioneaza, in
termenii schimbarilor de stare si transferurilor de mesaje.
Orice obiect poate actiona asupra altor obiecte si poate fi la randul sau actionat de alte obiecte.
Se mai spune ca obiectul primeste mesaje si respectiv trimite mesaje sau ca un obiect client (emitatorul mesajului) executa o operatie asupra unui obiect server (receptorul mesajului).
- Identitate: este acea proprietate a unui obiect prin care el se distinge de alte
obiecte.
Faptul ca un obiect are stare inseamna ca el ocupa spatiu fie in lumea fizica, fie in memoria computerului.
Proprietatile (structura) si comportamentul obiectelor similare se definesc prin intermediul clasei careia ii apartine obiectul.
Obiectele se mai numesc si instante ale clasei respective.
Relatii intre obiecte
O relatie intre doua sau mai multe obiecte cuprinde presupunerile pe care fiecare dintre ele le face asupra celorlalte, incluzand operatiile care pot fi efectuate, impreuna cu comportamentul rezultat.
Exista doua categorii de relatii intre obiecte
- relatii de legatura (utilizare),
- relatii de agregare (compunere, continere).
Un obiect colaboreaza cu alte obiecte prin intermediul relatiilor de legatura.
Prin intermediul unei legaturi, un obiect (clientul) apeleaza la serviciile altui obiect (serverul).
Un obiect implicat intr-o astfel de relatie de legatura poate avea unul din urmatoarele roluri:
- client: el poate executa operatiile altor obiecte, dar nici un obiect nu executa
operatiile sale,
- server: nu executa operatiile altor obiecte, in schimb alte obiecte apeleaza la
serviciile sale,
- agent: poate executa operatiile altor obiecte si alte obiecte apeleaza la serviciile
sale.
Atunci cand un obiect trimite un mesaj altui obiect cu care se afla intr-o relatie de legatura, cele doua obiecte trebuie sa se sincronizeze intr-un anume fel.
Intr-o aplicatie strict secventiala, sincronizarea se realizeaza printr-un apel de procedura.
Pn aplicatiile care contin mai multe fire de executie, sunt necesare alte metode de sincronizare.
Din acest motiv, obiectele se clasifica astfel:
- obiecte secventiale: sunt obiecte pasive a caror semantica este garantata in prezenta
unui singur fir de executie,
- obiecte blocante: sunt obiecte pasive a caror semantica este garantata in prezenta
mai multor fire de executie. Excluderea mutuala este realizata
prin colaborarea corespunzatoare a clientilor activi;
- obiecte concurente: sunt obiecte active a caror semantica este garantata in prezenta
mai multor fire de executie.
Relatia de agregare este relatia dintre o parte si un intreg, astfel incat sa fie posibila accesarea tuturor partilor intregului.
Un obiect agregat (compus) este format dintr-un numar fix sau variabil de obiecte componente.
Relatiile de agregare se pot clasifica in trei categorii:
- fixa: obiectul agregat este compus dintr-un numar fix de componente,
- variabila: obiectul agregat este compus dintr-un numar finit, dar variabil de
componente,
- recursiva: obiectul agregat are in componeneta obiecte de aceeasi clasa cu el
sau obiecte agregat care contin obiecte de aceeasi clasa cu el.
Alegerea dintre o relatie de legatura si o relatie de agregare in faza de proiectare trebuie judecata atent, deoarece uneori agrgarea este mai buna decat relatia de legatura din cauza ca utilizarea agregarii conduce la reducerea numarului de obiecte, iar alteori, relatia de legatura
este mai buna decat agregarea intrucat utilizarea legaturii conduce la un cuplaj mai slab intre obiecte.
Clase
O clasa reprezinta o multime de obiecte care partajeaza aceeasi structura si acelasi comportament.
Operatiile unei clase, numite si metode, se pot clasisfica in urmatoarele categorii:
- constructori: specifica modul de generare a noi obiecte apartinand structurii respective.
Atunci cand gestiunea obiectelor se face explicit de catre programator, se pun in evidenta prin contrast operatiile destructor, care au rolul de a elibera memoria alocata obiectelor, atunci cand acestea nu mai sunt necesare;
- selectori: specifica modul cum se actualizeaza elementele care compun un obiect compus;
- modificatori: specifica modul cum se actualizeaza elementele care compun un obiect
compus;
- recunoscatori: se folosesc pentru recunoasterea diverselor proprietati ale obiectelor
apartinand structurii respective;
- testori: se folosesc pentru compararea obiectelor apartinand structurii respective;
- iteratori: se folosesc pentru accesul sistematic la componentele unui obiect compus.
In limbajele de programare orientate obiect, cum este spre exemplu C++, identitatea unui obiect se implementeaza de obicei prin adresa.
Orice obiect dispune de o proprietate "ascunsa", a carei valoare este egala cu adresa din memorie a obiectului respectiv.
Relatii intre clase
O relatie intre doua sau mai multe clase desemneaza fie o partajare a membrilor, fie o conexiune semantica.
Exista urmatoarele categorii de realatii intre clase:
-relatii de mostenire,
-relatii de asociere (utilizare),
-relatii de istantiere.
Mostenirea
Este o relatie intre clase prin care o clasa (numita clasa derivata sau subclasa) partajeaza structura si comportamentul uneia sau mai multor clase (numite clase de baza sau superclase).
In primul caz avem mostenire simpla si in al doilea caz avem mostenire multipla.
Prin intermediul unei relatii de mostenire o clasa derivata va mosteni proprietatile si comportamentul clasei de baza.
Din acest motiv se mai spune ca o clasa derivata este o specializare a clasei derivate si invers, clasa de baza este o generalizare a clasei derivate.
Asocierea
Desemneaza o dependenta semantica intre doua sau mai multe clase.
Relatia de asociere evidentiaza faptul ca obiectele unei clase - clasa asociata depind de unul sau mai multe obiecte apartinand uneia sau mai multor clase - clase asociate.
Ea trebuie privita mai ales ca o relatie de utilizare (exploatare), in sensul ca, clasa asocianta utililzeaza interfata, fie implementarea clasei/claselor asociate.
Instantierea
Se refera la posibilitatea definirii unor clase generice care prin instantiere ne conduc la obtinerea de colectii de alte obiecte.
O clasa care modeleaza o colectie omogena sau neomogena de alte obiecte se numeste clasa container.
Spre exemplu, putem defini o clasa container pentru reprezentarea unei multimi de angajati prin instantierea unei clase generice pentru reprezentarea unei multimi.
Clasa rezultata va folosi drept parametru clasa de reprezentare a unui angajat.
Clase abstracte
Deseori clasa de baza a unei ierarhii de clase trebuie sa fie foarte generala si in consecinta ea va contine foarte putini membri, detaliile fiind lasate pe seama claselor derivate.
La limita putem face clasa de baza atat de generala incat ea sa nu poata fi folosita pentru crearea directa de obiecte.
Ea neavand instante, nu are sens sa-i implementam metodele, acestea actionand doar ca sabloane (template) pentru metodele definite in clasele derivate.
O clasa abstracta defineste doar o interfata comuna minimala pentru toate clasele derivate din ea.
Spre exemplu, putem defini o clasa abstracta pentru reprezentarea coceptului de vehicul si o metoda virtuala pura pentru determinarea vitezei unui vehicul.
Prezenta sa are semnificatia ca orice vehicul, iniferent de tip, are viteza.
Intrucat nu putem determina cu exactitate aceasta viteza daca nu cunoastem tipul vehiculului, aceasta metoda va fi redefinita pentru pentru fiecare tip de vehicul in parte in cadrul clasei derivate corespunzatoare.
Spre exemplu putem avea o clasa derivata pentru conceptul de automobil si una pentru conceptul de avion.
Polimorfism
Polimorfismul este modalitatea de a asocia aceluiasi mesaj semnificatii diferite, in 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 in functie de argumentele operatiei.
Se realizeaza prin supraincarcare si legare statica.
Supraincarcarea inseamna ca aceeasi operatie poate avea definitii diferite, pentru tipuri diferite ale argumentelor.
Legarea statica inseamna ca legatura intre apelul operatiei si operatia care va fi efectiv executata este realizata la momentul compilarii programului, in functie de tipurile argumentelor.
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.
Intrucat majoritatea vehiculelor sunt automobile,
este natural sa presupunem ca de obicei viteza unui vehicul este de
Un avion este un vehicul, dar a carui viteza este
de
In acest fel metoda de detrminare 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 apartinand 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 in orice situatie, in functie de tipul obiectului asupra caruia este executata.
Metodele virtuale sunt implementate prin legare dinamica, acest lucru insemnand ca legatura intre apel si operatia efectiv executat se realizeaza la momentul executiei.
Revenind la exemplul anterior, sa presupunem ca dorim sa determinam viteza unui vehicul al carui tip nu-l cunoastem.
In cazul polimorfismului ad-hoc se va obtine viteza 80 km/h indiferent de tipul efectiv al vehiculului respectiv.
Daca insa metoda de determinare a vitezei este virtuala
si tipul vehiculului este avion, se va obtine valoarea
Polimorfismul parametric semnifica faptul ca tipurile argumentelor unei operatii sunt de asemenea 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 dupa tipul elementelor.
Chestionar
1. Pe ce se bazeaza paradigma structurala ?
2. Dar paradigma orientata obiect ?
3. Cum se defineste metoda de dezvoltare a software-ului ?
4. Cum se defineste abstractizarea in cadrul orientarii obiect ?
5. Care este scopul elaborarii unui model ?
6. Cum se defineste modelul liniar ?
7. Cum se defineste obiectul soft ?
8.Care sunt categoriile de relatii intre obiecte?