1. Introducere

Vrem să dedicăm lecția de astăzi încapsulării . Știți deja ce este în termeni generali.

Încapsulare

Care sunt beneficiile încapsulării? Există destul de multe dintre ele, dar pot evidenția patru care, după părerea mea, sunt principalele:


2. Stare internă validă

În programe, adesea apar situații când un obiect interacționează cu alte câteva clase. Aceste interacțiuni cu obiectul pot deteriora datele din interiorul obiectului, făcând imposibil ca obiectul să continue să funcționeze conform așteptărilor.

Ca rezultat, obiectul trebuie să țină evidența oricăror modificări ale datelor sale interne sau, mai bine, să facă modificările în sine.

Dacă nu dorim ca o variabilă să fie schimbată de alte clase, atunci o declarăm privată. Odată ce facem asta, doar metodele propriei sale clase îl pot accesa. Dacă dorim ca variabilele să fie doar în citire, atunci trebuie să adăugăm un public getterpentru variabilele relevante.

De exemplu, să presupunem că vrem ca toată lumea să poată ști numărul de elemente din colecția noastră, dar nu vrem ca ei să poată schimba colecția fără permisiunea noastră. Apoi declarăm o private int countvariabilă și o public getCount()metodă.

Utilizarea corectă a încapsulării asigură că nicio clasă nu poate accesa direct datele interne ale clasei noastre, ceea ce împiedică, prin urmare, orice modificări care nu sunt controlate. Aceste modificări sunt posibile numai prin apelarea metodelor aceleiași clase cu variabilele care sunt modificate.

Cel mai bine este să presupunem că alți programatori îți vor folosi întotdeauna cursurile în modul care le este cel mai convenabil, nu în modul care este cel mai sigur pentru tine (pentru clasa ta). Acest comportament este sursa ambelor erori, precum și a încercărilor de a le preveni.


3. Validarea argumentelor metodei

Uneori trebuie să validăm argumentele transmise metodelor noastre. De exemplu, să presupunem că avem o clasă care reprezintă o persoană și vă permite să setați o dată de naștere. Trebuie să verificăm toate datele de intrare pentru a ne asigura că au sens cu logica programului și logica clasei noastre. De exemplu, pentru a interzice o dată de naștere într-o luna a 13-a sau pe 30 februarie și așa mai departe.

De ce ar indica cineva data de 30 februarie pentru data nașterii? În primul rând, aceasta ar putea fi o eroare de utilizator la introducerea datelor. În al doilea rând, un program poate avea o mulțime de erori înainte de a începe să ruleze ca un ceas. De exemplu, este posibilă următoarea situație.

Un programator scrie un program care identifică persoanele a căror zi de naștere este poimâine. De exemplu, să presupunem că astăzi este 3 martie. Programul adaugă numărul 2 în ziua curentă a lunii și îi caută pe toți cei care s-au născut pe 5 martie. Se pare că totul este corect.

Dar când vine 30 martie, programul nu va găsi pe nimeni, pentru că calendarul nu are 32 martie. Un program are mult mai puține erori dacă verificăm datele trecute la metode.

Îți amintești când i-am studiat ArrayListși analizat codul? Am văzut că metodele getși setau verificat dacă indexeste mai mare sau egal cu zero și mai mică decât lungimea matricei. În plus, aceste metode aruncă o excepție dacă indexul se încadrează în afara limitelor matricei. Acesta este un exemplu clasic de validare a intrărilor.


4. Minimizarea erorilor la schimbarea codului

Să presupunem că am scris o clasă super utilă atunci când am fost implicați într-un proiect mare. Tuturor le-a plăcut atât de mult încât alți programatori au început să-l folosească în sute de locuri din codul lor.

Clasa a fost atât de utilă încât ai decis să-i aduci niște îmbunătățiri. Dar dacă eliminați orice metodă din clasă, atunci codul a zeci de persoane se va opri din compilare. Vor trebui să rescrie totul. Și cu cât faci mai multe modificări, cu atât vei crea mai multe erori. Vei sparge o mulțime de adunări și vei fi urât.

Dar când schimbăm metodele care sunt declarate ca private, știm că nu există nicio altă clasă nicăieri care ar putea apela aceste metode. Le putem rescrie, modifica numărul de parametri și tipurile acestora și orice cod extern dependent va continua să funcționeze. Ei bine, cel puțin se va compila.


5. Noi decidem cum interacționează obiectul nostru cu obiectele externe

Putem restricționa unele dintre acțiunile care pot fi efectuate cu obiectul nostru. De exemplu, să presupunem că vrem ca un obiect să fie instanțiat o singură dată. Chiar dacă poate fi creat în mai multe locuri din proiect. Și putem face acest lucru datorită încapsulării.

Încapsularea 2

Încapsularea ne permite să adăugăm restricții suplimentare , care pot fi transformate în avantaje suplimentare . De exemplu, Stringclasa este implementată ca obiect imuabil . Un obiect al Stringclasei este imuabil din momentul creării sale până în momentul morții sale. Toate metodele clasei String( remove, substring, ...), returnează un șir nou fără a face modificări obiectului pe care sunt apelate.

Încapsularea este un lucru foarte interesant.