Principiile OOP sau principiile programării orientate pe obiecte (”Object Oriented Programming”, OOP) este o paradigmă de programare ce permite specificarea unui model de rezolvare a unei anumite probleme, ce se axează pe ideea grupării datelor și a codului specific care operează asupra acestora, într-o structură unică. OOP reprezintă, în mod general, procesul specific prin care sunt create obiecte care înglobează atât date (input, de intrare), cât și funcții (output, de ieșire).
Cuprins
Ce este programarea orientată pe obiecte (OOP)?
Programarea orientată pe obiecte permite programatorilor să se gândească la principiul de dezvoltare al unui software ca și cum ar lucra cu entități din viața reală. În viața de zi cu zi, oamenii dispun de cunoștințe și informații care le permit să facă anumite lucruri și să realizeze diferite sarcini. În Principiile OOP, obiectele dispun de anumite „câmpuri” unde sunt stocate tot un tip de „cunoștințe”, informații și date care le pot permite, astfel, să realizeze ceea ce li se cere.
Cu alte cuvinte, această paradigmă de programare utilizează concepte abstracte sub forma claselor și obiectelor pentru a crea anumite modele aferente lumii reale. Aplicațiile dezvoltate prin programarea orientată pe obiecte încorporează obiecte ce pot fi interconectate prin coduri individuale, astfel încât să poată fi capabile să furnizeze, să primească și să proceseze date specifice. Programarea orientată pe obiecte are drept scop final ideea de a maximiza proprietatea programelor de a fi întreținute și reparate cu ușurință, precum și adaptabilitatea acestuia.
Ce sunt obiectele în programarea orientată pe obiecte?
Este simplu – laptopul pe care îl folosesc este un obiect. Laptopul meu are diferite proprietăți care îl definesc – versiunea software, modelul, brandul, capacitatea de stocare, memoria. În aceeași măsură, acest laptop are diferite funcții, cum ar fi camera web, posibilitatea de a utiliza un microfon, Bluetooth, posibilitatea de a-l închide și redeschide oricând doresc. Cu alte cuvinte, laptopul meu („obiectul”) conține date și instrucțiuni care îmi permit să acționez funcțiile sale (activarea camerei web, închiderea/deschiderea și altele specifice).
Ce sunt clasele în programarea orientată pe obiecte?
Clasele reprezintă un termen important în înțelegerea conceptului de programare orientată pe obiecte. O clasă este un fel de șablon din care sunt create obiecte noi, fiind modelul sau standardul ce vizează capacitatea unui obiect de a putea realiza funcțiile pe care le are (după cum am menționat mai sus).
Orice clasă pe care o creezi are un cap și un corp. Capul include, de obicei, modificatori și cuvântul cheie al clasei, în timp ce corpul include membrii de date și funcțiile descrise de aceștia. Componentele unei clase pot fi publice (membrii clasei pot fi accesați de oriunde), protejate (membrii clasei pot fi accesați numai de clasele-părinte și de clasele-moștenite) și private (membrii clasei pot fi accesați doar de clasa care îi definește).
Care sunt principiile OOP de bază ale programării orientate pe obiecte?
Principiile OOP de bază sunt abstractizarea claselor, încapsularea claselor, moștenirea claselor și polimorfismul. Împreună cu obiectele și clasele, acestea reprezintă principiul fundamental de funcționare al oricărui limbaj de programare orientat pe obiecte.
Ce este abstractizarea în programarea orientată pe obiecte?
Bănuiesc că ai mâncat măcar o dată în viața ta pâine prăjită. Deci, cu siguranță este foarte posibil să fi folosit un prăjitor de pâine. În general, conceptul de abstractizare a claselor este în strânsă legătură cu principiul după care funcționează, să zicem, electrocasnicele pe care le folosim în viața de zi cu zi: prăjitorul de pâine, cuptorul cu microunde, mașina de cafea.
Astfel, știi că un prăjitor de pâine, evident, îți prăjește pâinea. Ideea este că acea pâine se prăjește și fără să știi cum funcționează, de fapt, prăjitorul (să ne imaginăm că, într-adevăr, chiar nu știi cum funcționează, pentru a păstra conceptul abstractizării). Pe scurt, tot ce trebuie să știi pentru a-l putea folosi este că trebuie să introduci pâinea în aparat, să-l conectezi la o sursă de electricitate și apoi să apeși pe butonul de pornire.
Așadar, este vorba despre o interfață clară de utilizare a aparatului de prăjit pâinea – știi cum se folosește: pâine – priză – butoane. Motiv pentru care nu trebuie să-ți faci griji cu privire la mecanismul intern de funcționare al dispozitivului. Tocmai asta înseamnă „abstractizarea claselor”, care se aplică și în conceptul unui limbaj de programare orientat pe obiecte – este vorba despre un concept care nu este asociat cu vreo instanță particulară (mașina de prăjit pâine funcționează, iar asta e tot ce contează).
Să presupunem că „metoda” o reprezintă prăjitorul de pâine. Păstrând aceeași idee, parametrii de intrare necesari ca programul (prăjitorul de pâine) să poată rula și livra rezultate (pâinea prăjită) sunt reprezentați de butoanele de pe dispozitiv (aceste butoane „introduc date”, să zicem așa, care-i permit programului să-și îndeplinească funcția). Abstractizarea îți permite să creezi programe fără întreruperi, atât timp cât știi la ce metodă să apelezi și care sunt parametrii ce trebuie introduși.
Ce este încapsularea în programarea orientată pe obiecte?
În limbajele de programare orientată pe obiecte, noțiunea de încapsulare se referă la gruparea datelor, împreună cu metodele care operează asupra acestor date, într-o unitate individuală. În general, majoritatea limbajelor de programare utilizează încapsularea sub forma unor clase. O astfel de clasă este un model de program-cod ce permite dezvoltatorilor să creeze un obiect care dispune atât de variabile (adică date, caracteristici input), cât și de comportamente (adică funcții sau metode, respectiv caracteristici output).
Un exemplu tipic de încapsulare îl reprezintă clasele, întrucât este sunt formate din date și metode ce au fost ulterior grupate într-o singură unitate, după cum am spus. În aceeași măsură, încapsularea definește și mecanismul prin care accesul direct la unele componente ale unui obiect sunt restricționate, astfel încât utilizatorii nu pot accesa valorile de stare pentru toate variabilele care definesc un anumit obiect. Cu alte cuvinte, este „mecanismul de ascundere” a modului de implementare a datelor, pentru a restricționa accesul la metodele publice. În acest scop, variabilele de instanță sunt păstrate private, iar metodele de dezvoltare sunt făcute publice.
Ce este moștenirea în programarea orientată pe obiecte?
În programarea orientată pe obiecte, conceptul de moștenire definește mecanismul prin care un obiect sau o clasă își bazează existența pe un alt obiect (caz în care vorbim de moștenire bazată pe prototip) sau pe o altă clasă (caz în care vorbim despre moștenire bazată pe clasă), păstrând însă o modalitate similară (uneori aproape identică) de implementare.
În aceeași măsură, se definește ca fiind derivarea și formarea de noi clase (subclase) din clasele deja existente – cum ar fi supraclasa sau clasa de bază, și apoi aranjarea acestora într-o ierarhie specifică de clase (subclasă, clasă de bază, supraclasă etc). Pentru majoritatea limbajelor de programare orientate spre obiecte bazate pe clase, un obiect rezultat în urma mecanismului de moștenire dobândește, în general, toate proprietățile și comportamentele „obiectului părinte”, cu excepția constructorilor, destructorilor, operatorilor supraîncărcați și a funcțiilor clasei de bază.
Astfel, moștenirea permite programatorilor să dezvolte și să creeze clase pe baza claselor deja existente și să specifice codul unei noi implementări, păstrând însă aceleași comportamente, să reutilizeze un anumit cod deja scris și să extindă în mod independent software-ul original prin intermediul mai multor tipuri de clase (subclase, supraclase). Concluzionând, prin intermediul moștenirii, în clasele derivate și nou formate poți reutiliza codul din supraclasele deja existente, fără a fi nevoie să-l rescrii. Te-ajută să economisești timp și, în același timp, să scurtezi codul dintr-un anumit program.
Ce este polimorfismul în programarea orientată pe obiecte?
În programarea orientată pe obiecte, în principiile OOP polimorfismul definește acea situație în care un anumit obiect apare în mai multe forme diferite. Descrie conceptul conform căruia poți accesa obiecte de tipuri diferite folosindu-te de aceeași interfață, iar fiecare tip poate oferi propria implementare, independentă, a acestei interfețe. În teoria limbajelor de programare și în teoria tipurilor, polimorfismul reprezintă furnizarea unei singure interfețe pentru entități de diferite tipuri. Conceptul este împrumutat de la un principiu biologic în care un organism sau o specie poate avea mai multe forme sau stadii diferite (cum sunt majoritatea insectelor).
Polimorfismul reprezintă capacitatea unei date de a putea fi procesată în mai multe forme. Însuși cuvântul definește, de fapt, semnificația acestuia: în limba greacă, „poly” înseamnă „multe”, iar „morphism” înseamnă „tipuri”, „formă”. Cea mai frecventă utilizare a polimorfismului în programarea orientată pe obiecte are loc atunci când o referință la „clasa-părinte” este utilizat pentru a face referire la un obiect din clasa-moștenită. Acest lucru permite adăugarea sau extinderea funcționalității unui cod preexistent, fără a rescrie la nesfârșit definiția întregii clase, ceea ce ușurează mult sarcina programatorului.
În principiile OOP, spre exemplu, o persoană poate avea, în același timp, roluri diferite de îndeplinit de-a lungul vieții. Un bărbat poate fi, în același timp, soț, tată, bunic, unchi, angajat și fiu. Astfel, această persoană trebuie să aibă mai multe caracteristici, însă este nevoită să le implementeze pe fiecare în funcție de situație și condiții. Polimorfismul reprezintă capacitatea unui obiect sau a unei referințe de a lua mai multe forme, în funcție de nevoi și circumstanțe. El implementează conceptul de supraîncărcare ș i suprapunere a funcțiilor, precum și pe cel al funcțiilor virtuale.
Cam despre asta este, pe scurt, programarea orientată pe obiecte. Cel puțin acum, ar trebui să ai o idee mai clară despre principiile OOP de bază și despre ce presupun acestea. Cele patru concepte prezentate mai sus – abstractizarea, încapsularea, moștenirea și polimorfismul – reprezintă pilonii de bază ai oricărui limbaj de programare orientat pe obiecte, oricât de complicat s-ar dovedi acesta.