Sunteți pe pagina 1din 31

Curs 2 Principiile Program rii Orientate pe Obiecte

Programare Orientat pe Obiecte

Tehnici de programare Programarea procedural


l l

Modul n care este abordat programarea, din punct de vedere al descompunerii programelor Paradigme

Programarea procedural l prima modalitate de programare, nc frecvent folosit l descompunerea programului n proceduri (func#ii) care sunt apelate n ordinea de desf $urare a algoritmului. l limbajele care suport aceast tehnic de programare prev d posibilit #i de transfer a argumentelor c tre func#ii $i de returnare a valorilor rezultate. l limbajul Fortran: primul limbaj de programare procedural . l au urmat Algol60, Algol68, Pascal, iar C este unul din ultimele inven#ii n acest domeniu.

Programarea modular (structurat )


l

l l

accentul n proiectarea programelor s-a deplasat de la proiectarea procedurilor c tre organizarea datelor, datorit cre$terii dimensiunii programelor. stilul de programare este n continuare procedural, dar datele $i procedurile sunt grupate n module. Gruparea de date $i proceduri n module nu implic $i o asociere strict ntre acestea. modul: o mul#ime de proceduri corelate, mpreun cu datele pe care le manevreaz tehnic de ascundere a datelor (data-hiding): posibilitatea de ascundere a unor informa#ii definite ntr-un modul fa# de celelalte module. Modularitatea $i ascunderea informa#iilor sunt caracteristici implicite n programarea orientat pe obiecte.

Programarea orientat pe obiecte


l

programarea procedural $i structurat : descriere a algoritmilor ca o secven# de pa$i care duc de la datele ini#iale la rezultatul c utat. limbaje de programare orientate la o clas concret de probleme: sisteme de dirijare cu baze de date, modelare $.a. a ap rut necesitatatea sporirii siguran#ei programelor - interzicerea accesului neautorizat la date. dezvoltarea sistemelor orientate pe obiecte, bazate pe programarea orientat pe obiecte, care a cunoscut o amploare deosebit n anii 90. programarea orientat pe obiecte presupune: determinarea $i descrierea claselor utilizate n program crearea exemplarelor de obiecte necesare determinarea interac#iunii dintre ele.

Programarea orientat pe obiecte


l

Reprezint aplicarea n domeniul program rii a unei metode din tehnic (tehnologia orientat pe obiecte, care se bazeaz pe modelul obiect) Modelul obiect al unei aplica#ii implic patru principii importante $i anume:

abstractizare; ncapsulare; modularitate; ierarhizare.

Primele aplica#ii: llimbajul Simula, care a stat la baza Smaltalk, Object Pascal, C++, Clos, Ada, Eiffel. modelul obiect: un concept unificator n $tiin#a calculatoarelor, aplicabil nu numai n programare, ci $i n arhitectura calculatoarelor, n proiectarea interfe#elor utilizator, n baze de date.

Programarea orientat pe obiecte


Programarea orientat pe obiecte (object-oriented programming) este o metod de programare n care programele sunt organizate ca #i colec&ii de obiecte cooperante, fiecare dintre ele reprezentnd o instan& a unei clase, iar clasele sunt membre ale unei ierarhii de clase, corelate ntre ele prin rela&ii de mo#tenire. Exist trei p r#i importante ale acestei defini#ii: l Se folosesc obiecte, nu algoritmi, ca unit #i constructive de baz , obiectele fiind componente ale unei ierarhii de agregare. l Fiecare obiect este o instan# (un exemplar) al unei clase. l Clasele sunt componente ale unei ierarhii de tip, fiind corelate ntre ele prin rela#ii de mo$tenire.
l

Obs: Dac lipse$te una din aceste caracteristici, programarea nu se mai nume$te orientat pe obiecte, ci programare prin abstactizarea datelor, deoarece o clas este un tip de date abstract.

Limbaj de programare orientat pe obiecte


l

Cerin#e: 1. Suport obiecte (instan#e ale unor clase), clasele fiind tipuri definite de utilizator (numite $i tipuri abstracte de date). 2. Tipurile (clasele) pot mo$teni atribute de la alte clase, numite clase de baz .

Dac un limbaj nu suport direct mo$tenirea ntre clase se nume$te limbaj de programare bazat pe obiecte (object-based), cum este, de exemplu, limbajul Ada.

Principii POO: Abstractizarea


l

posibilitatea ca un program s ignore unele aspecte ale informa#iei pe care o manipuleaz , adic posibilitatea de a se concentra asupra esen#ialului. nseamn identificarea similitudinilor ntre diferite entit #i, situa#ii sau procese din lumea real , concentrarea aten#iei asupra acestor aspecte comune $i ignorarea pentru nceput a detaliilor. identific tr s turile caracteristice esen#iale ale unui obiect, care l deosebesc de toate celelalte feluri de obiecte. fiecare obiect n sistem are rolul unui actor abstract, care poate executa ac#iuni, $i poate modifica $i comunica starea $i poate comunica cu alte obiecte din sistem f r a dezv lui cum au fost implementate acele facilita#i. procesele, func#iile sau metodele pot fi de asemenea abstracte

Principii POO: ncapsularea


l l

l l

ascunderea de informa#ii (data-hiding) obiectele nu pot schimba starea intern a altor obiecte n mod direct (ci doar prin metode puse la dispozi#ie de obiectul respectiv); doar metodele proprii ale obiectului pot accesa starea acestuia. procesul de compartimentare a elementelor unei abstractiz ri n dou p r#i: structura $i comportarea; ncapsularea separ comportarea (accesat prin interfa# ) de structur , definit prin implementare. fiecare tip de obiect expune o interfa# pentru celelalte obiecte care specific modul cum acele obiecte pot interac#iona cu el.

Principii POO Modularizarea


l

este procesul de parti#ionare a unui program n componente individuale (module) ceea ce permite reducerea complexit #ii programului prin definirea unor grani#e bine stabilite $i documentate n program.

modularizarea const n parti#ionarea programului n module care pot fi compilate separat, dar care au conexiuni cu alte module ale programului. modulele servesc ca $i containere n care sunt declarate clasele $i obiectele programului.

Principii POO Ierarhizarea


l l

modalitatea de a ordona abstractiz rile (tipurile abstracte de date). Ierarhiile pot s denote rela#ii de tip sau rela#ii de agregare. Rela#iile de tip sunt definite prin mo$tenirile ntre clase, prin care o clas (clasa derivat ) mo$tene$te structura sau comportarea definit n alt clas (clasa de baz ). Rela#iile de agregare specific compunerea unui obiect din mai multe obiecte mai simple. Obs: n limbajele de programare procedural agregarea se realiza prin structuri de tip nregistrare (record n Pascal, struct n C, etc).

Principii POO Mo$tenirea


l

l l l l

permite definirea $i crearea unor clase specializate plecnd de la clase (generale) care sunt deja definite permite construirea unor clase noi, care p streaz caracteristicile $i comportarea, deci datele $i func#iile membru, de la una sau mai multe clase definite anterior, numite clase de baz , fiind posibil redefinirea sau ad ugarea unor date $i func#ii noi. o clas ce mo$tene$te una sau mai multe clase de baz se nume$te clasa derivat . posibilitatea refolosirii lucrurilor care func#ioneaz organizeaz $i faciliteaz polimorfismul $i ncapsularea Anumite obiecte sunt similare dar n acela$i timp diferite.

Principii POO Mo$tenirea


l

Proprietatea de mo tenire: proprietatea claselor prin care o clas nou construit poate prelua datele $i metodele clasei mai vechi. l Clasa derivat# se afl ntotdeauna pe un nivel imediat inferior celui corespunz tor clasei de baz#. l n Java exist# doar mo tenire simpl#, o ierarhie de clase n care fiecare clas derivat are o singur clas de baz . Exemplu. parallelogram

dreptunghi patrat
l

romb

Clasa dreptunghi este o clas derivat (subclas ) a clasei paralelogram, iar clasa paralelogram este o clas de baz (supraclas ) a clasei dreptunghi. Astfel, o ierarhie de concepte conduce la o ierarhie ntre clasele care implementeaz conceptele ierarhice respective.

Principii POO: Polimorfismul, supranc rcarea


l

l l

l l

Mai multe func#ii pot avea acela$i nume n acela$i domeniu de defini#ie, dac se pot diferen#ia prin num rul sau tipul argumentelor de apel. O func#ie este polimorfic dac se poate executa cu acela$i efect asupra unor valori de tipuri diferite (ex. operatorul & din C) Un alt mecanism este supranc rcarea func#iilor( function overloading). O func#ie este supranc rcat dac execut opera#ii diferite n contexte diferite (ex. operatorul + din Java) Se poate aplica doar func#iilor. Supradefinirea (overriding) ofer posibilitatea de a redefini metode pentru clasele derivate, metodele au acela$i tip $i aceea$i parametri.

Principii POO: Polimorfismul, supranc rcarea


l

Dac n acela$i domeniu sunt definite mai multe func#ii cu acela$i nume, la fiecare apel se selecteaz func#ia corect prin compararea tipurilor argumentelor reale de apel cu tipurile argumentelor formale ale func#iei. l double abs(double); l int abs(int); l abs(1); // apeleaza abs(int) l abs(1.0); // apeleaza abs(double) Nu este admis ca func#iile s difere doar prin tipul returnat. Dou func#ii declarate cu acela$i nume se refer la aceea$i func#ie dac sunt n acela$i domeniu $i au num r $i tipuri identice de argumente.

l l

Concluzii POO
l

Ideea POO este de a crea programele ca o colec#ie de obiecte, unit #i individuale de cod care interac#ioneaz unele cu altele, n loc de simple liste de instruc#iuni sau de apeluri de proceduri. Obiectele POO snt de obicei reprezent ri ale obiectelor din via#a real , astfel nct programele realizate prin tehnica POO snt mai u$or de n#eles, de depanat $i de extins dect programele procedurale (mai ales n cazul proiectelor software complexe $i de dimensiuni mari, care se gestioneaz f cnd apel la ingineria program rii).

Tip abstract de date


mul#ime de date care au aceea$i reprezentare $i pentru care este definit setul de opera#ii care se pot executa asupra elementelor mul#imii respective. are dou p r#i: o parte care define$te reprezentarea datelor o parte care define$te opera#iile asupra datelor respective.

No#iunea de clas
l

O clas# define$te un tip abstract de date.

Defini#ie clas : class nume{ lista_elementelor_membru } Lista elementelor membru poate con#ine: declara#ii de date; implementari de func#ii; prototipuri de func#ii abstracte. Datele declarate printr-o defini#ie de clas se numesc date membru Func#iile definite sau pentru care este prezent numai prototipul, n defini#ia clasei, se numesc func&ii membru sau metode. Att datele ct $i metodele pot avea modificatori de acces

Modificatorii de acces
l

Modificatorii de acces sunt cuvinte


rezervate ce controleaz accesul celorlalte clase la membrii unei clase. Specificatorii de acces pentru variabilele $i metodele unei clase sunt: public, protected, private $i cel implicit (la nivel de pachet).

Specificator Clasa Subcls Pachet Oriunde Private X Protected X X* Public X X X X Implicit X X

Clas
Exemplu: class Complex { // date membru float real; float imag; // functii membru publice public void atribuire(float x, float y) { real = x; imag=y; } public double retreal() { return real; } public void afiscomplex(){ System.out.println(real+++imag+*i); } }

Obiecte
l

Un obiect este o dat de un tip definit printro clas . Se spune c obiectul este o instan&iere a clasei respective. Formatul declaratiei unui obiect: nume_clas nume_obiect; Instan#ierea obiectelor se face folosind operatorul new. nume_obiect = new nume_clas (..);

Obiecte

Datele membru se aloc distinct la fiecare instan#iere a clasei. O excep#ie o constituie datele membru care au clasa de memorare static, ea este o parte comun pentru toate instan#ierile clasei $i exist ntr-un singur exemplar. Func#iile membru sunt ntr-un singur exemplar oricte instan#ieri ar exista. Leg tura dintre func#ii membru $i obiectul pentru care se face apelul se realizeaz folosind operatorul punct.

Obiecte
l

Exemplu de instan#ieri pentru clasa complex: Complex z; z=new Complex(); Atunci: z.atribuire(0,0); z.afiscomplex(); afi$eaz num rul complex z (n cazul de fa# 0+0i).

Constructori
Obiectele se genereaz $i se pot ini#ializa la instan#iere cu ajutorul constructorilor Func#ii membru de acela$i nume cu numele clasei Func#ii apelate automat la crearea obiectelor. Valorile de ini#ializare se transfer constructorului $i ele joac acela$i rol ca parametrii efectivi de la apelurile func#iilor obi$nuite. Se pot defini mai mul#i constructori pentru o clas . n acest caz ei au acela$i nume, dar difer prin num rul $i/sau tipurile parametrilor.

Constructori
Dac exist mai mul#i constructori, atunci la ini#ializare se utilizeaz regulile de la apelurile func#iilor supranc rcate. Func#iile constructor nu ntorc valori, dar nu sunt preceda#i de cuvntul void. Dac clasa nu con#ine constructori, se genereaz un constructor f r parametri, adic un constructor implicit. El are rolul numai de alocare a obiectelor clasei respective, f r a le ini#ializa.

Constructori
Exemplu: class Complex { double real; double imag; public Complex(double x, double y) {real = x; imag = y;} public Complex ( ) {real = 0; imag = 0;} } Exemple de instan#iere: Complex z= new Complex(); Complex z1= new Complex(1,0);

// z = 0 + 0*i // z1 = 1 + 0*

Realizarea ncapsul rii datelor


l

accesul la datele sau func#iile membre ale unei clase din orice punct al domeniului de defini#ie al clasei s-ar putea rezolva simplu prin declararea de tip public a acestora. o astfel de implementare nu respect principiul ncapsul rii datelor $i se recomand s fie evitat . Din punct de vedere al dreptului de acces la membrii clasei, o clas bine definit permite ncapsularea (sau ascunderea informa#iilor), prin care un obiect poate ascunde celor care-l folosesc modul de implementare, prin interzicerea accesului la datele $i func#iile private sau protected.

Realizarea ncapsul rii datelor


l

n general, respectnd principiul ncapsul rii, datele membre sunt declarate private sau protected $i nu pot fi accesate direct (pentru citire sau scriere) din func#ii nemembre ale clasei. Pentru citirea sau modificarea unora dintre datele membre protejate n clasa respectiv se pot prevedea func#ii membre de tip public, care pot fi apelate din orice punct al domeniului de defini#ie al clasei $i fac parte din interfa#a clasei. De exemplu, pentru clasa Complex , o implementare care respect principiul ncapsul rii, dar, n acela$i timp permite accesul la datele private ale clasei poate ar ta astfel:

Realizarea ncapsul rii datelor


class Complex { private double real; private double imag; public Complex(double x, double y) {real = x; imag = y;} public Complex ( ) {real = 0; imag = 0;} public void set(double x, double y) { re = x; im = y; } public void setre(double x) { re = x;} public void setim(double y) { im = y; } public double getre(){ return re;} public double getim() { return im;}

Realizarea ncapsul rii datelor


public void display(){ System.out.println(re+++im+i);} } class test{ public static void main(String arg[]){ Complex c1=new Complex(),c2=new Complex(1,1); c1.set(7.2, 9.3); c1.display(); // afiseaza 7.2 9.3 c1.setre(1.3); c1.setim(2.8); c1.display(); // afiseaza 1.3 2.8 } } }

Clase abstracte
l l l l l

clasele pentru care programatorul nu inten#ioneaz s instan#ieze obiecte. clase de baz in ierarhii se mai numesc clase abstracte de baz . o clas devine abstract dac con#ine una sau mai multe declara#ii de func#ii abstracte. dac o clas ce mo$tene$te o clas ce con#ine o func#ie abstract nu implementeaz acea func#ie abstract mo$tenit , devine ea ns $i o clas abstract .

OBS: clasele pentru care se pot instan#ia obiecte se numesc clase concrete.