Object oriented programming (OOP) se referă la o metodologie de programare bazată pe obiecte, în loc de doar funcții și proceduri. Obiectele conțin datele și metodele (sau comportamentul). în conceptele OOPs, vom învăța patru principii majore-abstractizare, încapsulare, moștenire și polimorfism. Ei sunt, de asemenea, cunoscuți ca patru piloni ai paradigmei de programare orientată pe obiecte.,
- abstractizarea este procesul de expunere a detaliilor esențiale ale unei entități, ignorând detaliile irelevante, pentru a reduce complexitatea pentru utilizatori.
- încapsularea este procesul de grupare a datelor și a operațiunilor pe date împreună într-o entitate.
- moștenirea este utilizată pentru a obține un tip nou dintr-un tip existent, stabilind astfel o relație părinte-copil.
- polimorfismul permite unei entități să preia sensuri diferite în contexte diferite.
ce este programarea orientată pe obiecte?,
în zilele inițiale, programele au fost scrise cu cod binar, iar comutatoarele mecanice au fost folosite pentru a încărca programele. Mai târziu, pe măsură ce capacitățile hardware au evoluat, experții au încercat să simplifice programarea folosind limbaje de nivel înalt, unde compilatoarele au fost folosite pentru a genera instrucțiuni de mașină din program.cu mai multă evoluție, experții au creat programarea structurată bazată pe funcții mici. Aceste funcții au ajutat în multe feluri, de exemplu, reutilizarea codului, variabilele locale, depanarea codului și mentenabilitatea codului.,cu mai multe progrese de calcul și cererea pentru aplicații mai complexe, limitările programării structurate au început să fie vizibile. Aplicațiile complexe trebuiau să fie modelate mai îndeaproape cu lumea reală și cu cazurile de utilizare. apoi, experții au dezvoltat programarea orientată pe obiecte. În centrul OOP, avem obiecte și clase., Doar ca o entitate, un obiect are două particularități majore :
- date – spune despre atributele și starea obiectului
- comportament – îi dă posibilitatea de a schimba în sine și de a comunica cu alte obiecte
1.1. Clasă și obiect
un obiect este o instanță a unei clase. Fiecare obiect are propria sa Stare, Comportament și identitate. O clasă este modelul sau șablonul pentru obiectele sale. Obiectele pot comunica cu alte obiecte prin apelarea funcțiilor. Este uneori menționată ca mesaj de trecere.,
de exemplu, dacă lucrăm la o aplicație de resurse umane, atunci aceasta este formată din entități/actori, de exemplu, angajat, manager, departament, fluturași de salariu, vacanță, obiective, urmărirea timpului etc. Pentru a modela aceste entități în programe de calculator, putem crea clase care vor avea atribute și comportamente de date similare ca în viața reală.de exemplu, o entitate angajat poate fi reprezentat ca Employee
class:
de mai sus Employee
acționează ca un șablon. Putem folosi această clasă pentru a crea cât mai multe obiecte diferite ale angajaților de care avem nevoie în aplicație.,
Employee e = new Employee(111);e.setFirstName("Alex");....int age = e.getAge();
câmpul id
ajută la stocarea și regăsirea detaliilor oricărui angajat individual.identitatea obiectului este în general menținută de mediul de rulare al aplicației, de exemplu pentru aplicațiile Java, mașina virtuală Java (JVM). De fiecare dată când creăm un obiect Java, JVM creează un hashcode pentru acest obiect și îl atribuie. În acest fel, chiar dacă programatorul uită să adauge câmpul id
, JVM se asigură că toate obiectele sunt identificate în mod unic.
1, 2., Constructorul
Constructorii sunt metode speciale fără valoare returnată. Numele lor este întotdeauna același cu numele clasei; dar pot accepta parametri care ajută la setarea stării inițiale a obiectului, înainte ca aplicația să înceapă să o folosească.
dacă nu oferim niciun constructor, JVM atribuie un constructor implicit clasei. Acest constructor implicit nu acceptă niciun parametru.
amintiți-vă, dacă atribuim un constructor la orice clasă, atunci JVM nu atribuie constructorul implicit să-l. Dacă este necesar, trebuie să specificăm constructorul implicit în mod explicit clasei.,
public class Employee { // Default constructor public Employee() { } // Custom constructor public Employee(int id) { this.id = id; }}
cele Patru Principii de OOP
Cele patru caracteristici majore ale programării orientate pe obiecte sunt:
- Abstractizare
- Încapsulare
- Moștenire
- Polimorfism
2.1. Abstractizarea
abstractizarea este foarte ușor de înțeles atunci când o raportăm la exemplul în timp real. De exemplu, atunci când ne conducem mașina, nu trebuie să ne preocupăm de funcționarea internă exactă a mașinii., Ceea ce ne preocupă este interacțiunea cu mașina prin interfețele sale precum volanul, pedala de frână, pedala de accelerație etc. Aici cunoștințele pe care le avem despre mașină sunt abstracte.în informatică, abstractizarea este procesul prin care datele și programele sunt definite cu o reprezentare similară în formă cu semnificația (semantica), ascunzând în același timp detaliile implementării.
în termeni mai simpli, abstractizarea este de a ascunde informații care nu sunt relevante pentru context sau mai degrabă arată doar informații relevante și de a le simplifica comparând-o cu ceva similar în lumea reală.,
-
abstractizarea datelor
abstractizarea datelor este modalitatea de a crea tipuri complexe de date din mai multe tipuri de date mai mici – ceea ce este mai aproape de entitățile din viața reală. de exemplu, o clasă
Employee
poate fi un obiect complex de a avea diverse asociații mici.,deci, dacă doriți să preluați informațiile unui angajat, îl întrebați de laEmployee
obiect – așa cum faceți în viața reală, întrebați persoana în sine.controlul abstractizării se realizează prin ascunderea secvenței de acțiuni pentru o sarcină complexă – în interiorul unui apel simplu, astfel încât logica pentru îndeplinirea sarcinii poate fi ascunsă de client și ar putea fi schimbată în viitor fără a afecta codul clientului.,public class EmployeeManager{ public Address getPrefferedAddress(Employee e) { //Get all addresses from database //Apply logic to determine which address is preferred //Return address }}
În exemplul de mai sus, mâine, dacă doriți să modificați logica, astfel încât de fiecare dată interne adresa este întotdeauna de preferat adresa, va schimba logica interior
getPrefferedAddress()
metodă, și clientul va fi afectată.
Citeste Mai mult : Abstracție în Java
2.2. Încapsularea
înfășurarea datelor și metodelor în cadrul claselor în combinație cu ascunderea implementării (prin controlul accesului) este adesea numită încapsulare., Rezultatul este un tip de date cu caracteristici și comportamente.
„Orice modificări, să-l cuprindă” – Un celebru principiu de design
Încapsulare, în esență, are atât de exemplu ascunderea de informații și punerea în aplicare a ascuns.
- ascunderea informațiilor se face prin utilizarea modificatorilor de control al accesului (public, privat, protejat) și
implementation hiding
se realizează prin crearea interfeței pentru o clasă. - punerea în aplicare ascunde dă designer libertatea de a modifica modul în care responsabilitatea este îndeplinită de un obiect., Acest lucru este deosebit de valoros în punctele în care designul (sau chiar cerințele) este probabil să se schimbe.
să luăm un exemplu pentru a face mai clar.
2.2.1. Informații ascund
class InformationHiding { //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; }}
2.2.2. Punerea în aplicare a ascunde
interface ImplemenatationHiding { Integer sumAllItems(ArrayList items);}class InformationHiding implements ImplemenatationHiding{ //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; } public Integer sumAllItems(ArrayList items) { //Here you may do N number of things in any sequence //Which you do not want your clients to know //You can change the sequence or even whole logic //without affecting the client }}
Citeste Mai mult : Încapsulare În Java
interface ImplemenatationHiding { Integer sumAllItems(ArrayList items);}class InformationHiding implements ImplemenatationHiding{ //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; } public Integer sumAllItems(ArrayList items) { //Here you may do N number of things in any sequence //Which you do not want your clients to know //You can change the sequence or even whole logic //without affecting the client }}
Citeste Mai mult : Încapsulare În Java
2.3. Moștenirea
moștenirea este un alt concept important în programarea orientată pe obiecte., Moștenirea în Java este un mecanism prin care o clasă dobândește proprietățile și comportamentele clasei părinte. În esență, creează o relație părinte-copil între clase. În Java, vom folosi moștenirea în principal pentru reutilizarea și mentenabilitatea codului.
cuvântul cheie „extinde” este folosit pentru a moșteni o clasă în java. Cuvântul cheie”extends
” indică faptul că facem o nouă clasă care derivă dintr-o clasă existentă.
în terminologia Java, o clasă moștenită se numește super-clasă. Noua clasă se numește subclasă.,
o subclasă moștenește Toți Membrii non-privați (câmpuri, metode și clase imbricate) din superclasa sa. Constructorii nu sunt membri, deci nu sunt moșteniți de subclase, dar constructorul superclasei poate fi invocat din subclasă.
2.3.1., Moștenirea exemplu
public class Employee { private Department department; private Address address; private Education education; //So on...}public class Manager extends Employee { private List<Employee> reportees;}
În codul de mai sus, Manager
este specializata versiune a Employee
și reutilizează department
, address
și education
de la Employee
clasa precum și defini propria reportees
listă.
3.2.2. Tipuri de moștenire
- moștenire unică-o clasă copil este derivată dintr-o clasă părinte.
class Parent{ //code}class Child extends Parent{ //code}
- moșteniri Multiple – un copil poate deriva de la mai mulți părinți. Până la JDK 1.,7, moștenirea multiplă nu a fost posibilă în java prin utilizarea claselor. Dar începând cu JDK 1.8, moștenirea multiplă este posibilă prin utilizarea interfețelor cu metode implicite.
moștenirea multiplă prin utilizarea interfețelor este întotdeauna posibilă în Java.
interface MyInterface1{ }interface MyInterface2{ }class MyClass implements MyInterface1, MyInterface2{}
- moștenire pe Mai multe niveluri – se referă la moștenire între mai mult de trei clase, astfel încât o clasă copil va acționa ca clasă părinte pentru o altă clasă copil.
în exemplul dat,
B
este clasa părinte, precum și clasa copil, de asemenea.,class A{}class B extends A{}class C extends B{}
- moștenire ierarhică – se referă la moștenire atunci când există o super-clasă și mai multe sub-clase care extind super-clasa.
class A{}class B extends A{}class C extends A{}class D extends A{}
- moștenire hibridă – este o combinație de două sau mai multe tipuri de moștenire. Deci, atunci când relația dintre clase conține moștenirea a două sau mai multe tipuri, atunci spunem că clasele implementează moștenirea hibridă.
interface A{}interface B extends A{}class C implements A{}class D extends C impements B{}
2.4., Polimorfismul
polimorfismul este abilitatea prin care putem crea funcții sau variabile de referință care se comportă diferit într-un context programatic diferit. Este adesea menționată ca un nume cu mai multe forme.
De exemplu, în cele mai multe limbaje de programare, '+'
operator este utilizat pentru a adăuga două numere precum și concatenarea a două șiruri. Pe baza tipului de variabile, Operatorul își schimbă comportamentul. Este cunoscut sub numele de supraîncărcarea operatorului.
în Java, polimorfismul este considerat în esență în două tipuri:
2.4.1., Polimorfismul în timpul compilării
în polimorfismul în timpul compilării, compilatorul poate lega metodele corespunzătoare de obiectele respective la momentul compilării, deoarece are toate informațiile necesare și știe ce metodă să apeleze în timpul compilării programului.
este adesea menționată ca legarea statică sau legarea timpurie.
în Java, se realizează prin utilizarea metodei de supraîncărcare. În metoda supraîncărcarea, parametrii metodei pot varia cu un număr, ordine, sau tipurile de parametri.
2.4.2., Polimorfismul Runtime
în polimorfismul runtime, apelul la o metodă suprascrisă este rezolvat dinamic la runtime. Obiectul, pe care va fi executată metoda, este determinat în timpul rulării-în general, în funcție de contextul condus de utilizator.
este adesea menționată ca legarea dinamică sau metoda imperativă. Este posibil să fi auzit – o cu numele dynamic method dispatch.
în polimorfismul runtime, avem în general o clasă părinte și minim o clasă copil. Într-o clasă, vom scrie o declarație pentru a executa o metodă care este prezentă în clasa părinte și clasa copil, ambele.,
apelul metodei este dat folosind variabila tipului de clasă părinte. Instanța reală a clasei este determinată în timpul rulării, deoarece o variabilă de tip clasă părinte poate stoca referința la instanța clasei părinte, precum și la clasa copil.
Citeste Mai mult : Polimorfism în java
Minore Concepte
în Afară de cele de mai sus 4 blocuri de OOP, mai avem câteva concepte care joacă un rol important în construirea toată înțelegerea.
înainte de a merge mai adânc, vom înțelege termenul modul., În programarea generală, un modul se referă la o clasă sau o sub-aplicație care efectuează funcționalități unice. În aplicația HR, o clasă poate îndeplini diverse funcții, cum ar fi trimiterea de e-mailuri, generarea alunecării salariale, calcularea vârstei angajatului etc.
3. 1. Cuplarea
cuplarea este măsura gradului de interdependență între module. Cuplarea se referă la cât de puternic este conectat un element software la alte elemente. Un software bun va avea cuplaj scăzut.aceasta înseamnă că o clasă ar trebui să îndeplinească o sarcină unică sau doar sarcini care sunt independente de alte sarcini. De exemplu., o clasă EmailValidator
va valida doar e-mailul. Similar, EmailSender
clasa va trimite doar e-mail.
dacă includem atât funconality într-o singură clasă EmailUtils
atunci este exemplu de cuplare strânsă.
3. 2. Coeziunea
coeziunea este adezivul intern care menține modulul împreună. Un design software bun va avea o coeziune ridicată.înseamnă că o clasă/modul ar trebui să includă toate informațiile necesare pentru a-și îndeplini funcția fără nicio dependență., De exemplu, o clasă EmailSender
ar trebui să poată configura serverul SMTP, să accepte e-mailul, subiectul și conținutul expeditorului. Practic, ar trebui să se concentreze doar pe trimiterea de e-mailuri.
aplicația nu ar trebui să utilizeze EmailSender
pentru orice altă funcție decât trimiterea de e-mail. Coeziunea scăzută are ca rezultat clase monolitice dificil de întreținut, de înțeles și de redus reutilizabilitatea.
3. 3. Asociația
Asociația se referă la relația dintre obiectele care au un ciclu de viață independent fără proprietate., să luăm un exemplu de profesor și student. Mai mulți studenți se pot asocia cu un singur profesor, iar un singur student se poate asocia cu mai mulți profesori, dar ambii au propriile lor cicluri de viață. ambele pot fi create și șterse independent, astfel încât atunci când un profesor părăsește școala, nu trebuie să ștergem niciun elev, iar atunci când un elev părăsește școala, nu trebuie să ștergem niciun profesor.
3. 4. Aggregation
Asociația se referă la relația dintre obiectele care au un ciclu de viață independent cu proprietatea., Este între clasele copil și părinte în care obiectele copil nu pot aparține unui alt obiect părinte.să luăm un exemplu de telefon mobil și o baterie de telefon mobil. O singură baterie poate aparține unui singur telefon la un moment dat. Dacă telefonul nu mai funcționează și îl ștergem din Baza noastră de date, bateria telefonului nu va fi ștearsă, deoarece poate fi încă funcțională. Deci, în agregare, în timp ce există proprietate, obiectele au propriul lor ciclu de viață.
3. 5. Compoziție
compoziția se referă la relații atunci când obiectele nu au un ciclu de viață independent., Dacă obiectul părinte este șters, toate obiectele copil vor fi, de asemenea, șterse.de exemplu, relația dintre întrebări și răspunsuri. Întrebările unice pot avea mai multe răspunsuri, dar răspunsurile nu pot aparține mai multor întrebări. Dacă ștergem o întrebare, toate răspunsurile sale vor fi șterse automat.
cele mai bune practici
4.1. Favorizează compoziția peste moștenire
moștenire și compoziție, ambele tipuri de a promova reutilizarea codului. Dar utilizarea compoziției este preferată față de moștenire.,
o implementare a compoziției peste moștenire începe de obicei cu crearea diferitelor interfețe care reprezintă comportamentele pe care sistemul trebuie să le prezinte. Interfețele permit comportamentul polimorf. Clasele care implementează interfețele identificate sunt construite și adăugate la clasele de domenii de afaceri, după cum este necesar. Astfel, comportamentele sistemului sunt realizate fără moștenire.
4. 2. Program la o interfață, nu la punerea în aplicare
Acest lucru duce la cod flexibil, care poate lucra cu orice nouă implementare a interfeței., Ar trebui să ne propunem să folosim interfețele ca variabile, ca tipuri de retur ale unei metode sau ca tip de argument al metodelor.
interfețele acționează ca tipuri de superclase. În acest fel, putem crea mai multe specializări ale interfeței în viitor fără a modifica codul existent.
4. 3. Uscat (nu te repeta)
nu scrie cod duplicat, în schimb, utilizați abstractizare pentru a abstractiza lucruri comune într-un singur loc.
ca regulă de degetul mare, dacă scrieți aceeași bucată de cod în două locuri – luați în considerare extragerea într-o funcție separată și apelați funcția în ambele locuri.
4. 4., Încapsulează ce modificări
tot software-ul obține modificări în timp. Deci, încapsulează codul pe care îl aștepți sau suspectezi că va fi schimbat în viitor.
În Java, utilizați private
metode pentru a ascunde astfel de implementări de la clienți, astfel încât atunci când face o schimbare, clientul nu este obligat să facă modificări la codul său.
utilizarea modelelor de proiectare este, de asemenea, recomandată pentru a realiza încapsularea. De exemplu, modelul de design din fabrică încapsulează codul de creare a obiectelor și oferă flexibilitate pentru a introduce un nou tip mai târziu, fără impact asupra clienților existenți.
4. 5., Principiul responsabilității unice
este unul dintre principiile solide ale designului clasei OOP. Se subliniază faptul că o clasă ar trebui să aibă o singură responsabilitate.cu alte cuvinte, ar trebui să scriem, să schimbăm și să menținem o clasă cu un singur scop. Acest lucru ne va oferi flexibilitatea de a face schimbări în viitor, fără a ne îngrijora de impactul schimbărilor pentru o altă entitate.
4. 6. Principiul deschis închis
Acesta subliniază faptul că componentele software ar trebui să fie deschise pentru extensie, dar închise pentru modificare.,acest lucru înseamnă că clasele noastre ar trebui să fie proiectate în așa fel încât ori de câte ori colegii Dezvoltatori vrea să schimbe fluxul de control în condiții specifice în aplicație, tot ce au nevoie pentru a extinde clasa noastră și suprascrie unele funcții și asta este.dacă alți dezvoltatori nu sunt capabili să proiecteze comportamentul dorit din cauza constrângerilor puse de clasa noastră, atunci ar trebui să ne reconsiderăm schimbarea clasei noastre.există o mulțime de alte concepte și definiții în întreaga paradigmă OOPs pe care le vom învăța în alte tutoriale.
învățare fericită !!
Lasă un răspuns