|
Obiectele reprezinta cheia pentru intelegerea programarii orientate pe obiecte. Priveste in jur si vei observa multe exemple de obiecte reale: un caine, biroul, televizorul, bicicleta.
Obiectele reale au doua caracteristici: au stare si comportament. Cainii au stare (nume, culoare, rasa, le este foame) si comportament (latra, alearga, dau din coada). Si bicicletele au stare (trepte de viteza, cadenta a pedalei, frane) si comportament (schimbarea vitezei, schimbarea cadentei pedalei, aplicarea franei). Identificarea starii si a comportamentului in cazul obiectelor reale reprezinta o metoda minunata de a incepe sa gandesti in termenii programarii orientate pe obiecte.
Rezerva-ti chiar acum un minut pentru a observa obiectele reale aflate langa tine. In cazul fiecarui obiect observat, pune-ti doua intrebari: „In ce stare se afla acest obiect?” si „Care este comportamentul posibil al acestui obiect?”. Scrie aceste observatii. Vei vedea cum obiectele reale variaza ca si complexitate; lampa de birou poate avea doar doua stari (aprinsa, stinsa), dar aparatul de radio ar putea avea stari suplimentare (deschis, inchis, marirea sau micsorarea volumului, cautare, scanare si reglare). Mai poti observa ca anumite obiecte vor contine alte obiecte. Aceste observatii reale se pot traduce in lumea programarii orientate pe obiecte.
 |
Un obiect software |
Obiectele software sunt din punct de vedere conceptual similare obiectelor lumii reale: si acestea au stare si comportament. Un obiect isi pastreaza starea in campuri (variabile in anumite limbaje de programare) si isi expun comportamentul prin metode (functii in anumite limbaje de programare). Metodele opereaza asupra starii interne a unui obiect si servesc ca mecanism primar in cazul comunicarii de la obiect la obiect. Ascunderea starii interne si solicitarea ca orice interactiune sa se execute prin intermediul metodelor obiectelor poarta numele de incapsulare a datelor – principiul fundamental al programarii orientate pe obiecte.
Considera de exemplu o bicicleta:
 |
O bicicleta modelata ca obiect software |
Atribuind stari (viteza curenta, cadenta curenta a pedalei si trepte de viteza) si furnizand metode pentru schimbarea starii, obiectul controleaza modul in care lumii exterioare ii este permis sa-l utilizeze. De exemplu, daca bicicleta are doar 6 trepte de viteza, o metoda de schimbare a vitezelor ar putea respinge orice valoare care este mai mica de 1 sau mai mare decat 6.
Divizarea codului in obiecte software individuale furnizeaza un numar de avantaje, cum ar fi:
1. Modularitatea: Codul sursa pentru un obiect poate fi scris si mentinut independent de codul sursa al altor obiecte. De indata ce a fost creat, un obiect poate fi transferat cu usurinta in cadrul sistemului.
2. Ascunderea informatiei: Interactionand doar cu metodele obiectelor, detaliile implementarii lor interne raman ascunse lumii exterioare.
3. Reutilizarea codului: Daca un obiect exista deja (poate a fost scris de un alt dezvoltator software), poti utiliza obiectul in programul tau. Aceasta le permite specialistilor sa implementeze/testeze/corecteze obiecte complexe, cu anumite sarcini, despre care pot fi convinsi ca vor rula in propriul cod.
4. Usurinta conectarii si corectarii: Daca un anumit obiect se dovedeste a fi problematic, pur si simplu il poti indeparta din aplicatie si atasa un alt obiect pentru a-l inlocui. Este asemeni reparatiei problemelor mecanice din lumea reala. Daca se strica un surub, il inlocuiesti pe acesta, nu intregul mecanism.
Ce este o clasa?
In lumea reala, deseori vei gasi multe obiecte individuale de acelasi fel. Pot exista mii de alte biciclete, toate avand aceleasi caracteristici, fiind acelasi model. Fiecare bicicleta a fost construita dupa acelasi tipar, deci contine aceleasi componente. In termenii programarii orientate pe obiecte, spunem ca bicicleta este o instanta a clasei de obiecte cunoscute sub numele de biciclete (Bicycle). O clasa reprezinta tiparul dupa care sunt create obiectele individuale.
Urmatoarea clasa Bicycle reprezinta una dintre implementarile posibile ale unei biciclete:
class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadenta:"+cadence+" viteza:"+speed+" treapta:"+gear);
}
}
Sintaxa limbajului de programare Java poate parea ceva nou pentru tine, dar designul acestei clase se bazeaza pe discutia precedenta referitoare la obiectele de tip bicicleta. Campurile cadence, speed, si gear reprezinta starea obiectului si metodele (changeCadence, changeGear, speedUp etc.) definesc interactiunea cu lumea exterioara.
Poate ai observat ca aceasta clasa Bicycle nu contine o metoda main. Aceasta, deoarece nu este o aplicatie completa; reprezinta doar tiparul pentru bicicletele care ar putea fi utilizate intr-o aplicatie. Responsabilitatea crearii si utilizarii noilor obiecte Bicycle apartine altei clase a aplicatiei tale.
Iata o clasa BicycleDemo care creaza 2 obiecte separate Bicycle si apeleaza metodele acestora:
class BicycleDemo {
public static void main(String[] args) {
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
Rezultatul acestui test afiseaza cadenta finala a pedalei, viteza si treptele celor doua biciclete:
cadenta:50 viteza:10 treapta:2
cadenta:40 viteza:20 treapta:3
|