Bună! Vom dedica lecția de astăzi încapsulării în Java și vom începe cu exemple de la început:) Aici aveți o mașină obișnuită de distribuire a sifonului . Am o întrebare pentru tine: cum funcționează? Încercați să dați un răspuns detaliat: De unde provine sifonul? Cum se menține temperatura internă? Unde se depozitează gheața? De unde știe aparatul ce sirop să adauge? Probabil că nu aveți răspunsuri la aceste întrebări. Bine, poate că nu toată lumea folosește aceste mașini. Nu sunt atât de populare în prezent. Să încercăm un alt exemplu. Ceva pe care cu siguranță îl folosești de multe ori în fiecare zi. Oh, am o idee! Principiile încapsulării - 2Spune-mi cum funcționează motorul de căutare Googlelucrări. Cum caută exact informații despre cuvintele pe care le introduceți? De ce sunt aceste rezultate la vârf și nu altele? Chiar dacă folosești Google în fiecare zi, probabil că nu știi. Dar asta nu contează. La urma urmei, nu este ceva ce trebuie să știi. Puteți folosi un motor de căutare fără să vă gândiți exact cum funcționează. Puteți cumpăra sifon de la o mașină fără să știți cum este construit. Poți conduce o mașină fără să te aprofundezi în modul în care funcționează motorul cu ardere internă și fără să cunoști fizica la liceu. Toate acestea sunt posibile datorită unuia dintre principiile principale ale programării orientate pe obiecte: încapsularea. Citind diferite articole pe această temă, trebuie să fi întâlnit două concepte de programare larg răspândite: încapsularea și ascunderea informațiilor. După cum se întâmplă, diferiți oameni înțeleg cuvântul " încapsulare' pentru a însemna lucruri diferite. Vom descifra ambii termeni, astfel încât să aveți o înțelegere completă. În programare, sensul original alîncapsularea combina datele și metodele de lucru cu acele date într-un singur pachet ("capsulă"). În Java, pachetul de încapsulare este clasa . Clasa conține atât date (câmpuri), cât și metode de lucru cu acele date. Principiile încapsulării - 3Acest lucru vă poate părea evident, dar totul este aranjat diferit în alte paradigme de programare. De exemplu, în programarea funcțională, datele sunt strict separate de operațiunile de date. În programarea orientată pe obiecte (OOP), programele constau din capsule (clase) formate atât din date, cât și din funcții pentru lucrul cu date.

Acum să vorbim despre ascunderea informațiilor

Cum folosim tot felul de mecanisme complexe fără să înțelegem cum sunt construite sau cum funcționează? Este simplu: creatorii lor au oferit interfețe simple și convenabile. La o mașină de sifon, interfața sunt butoanele de pe panoul frontal. Un buton vă permite să alegeți dimensiunea cupei. Siropul il alegi cu un al doilea buton. Un al treilea este responsabil pentru adăugarea de gheață. Și asta este tot ce trebuie să faci. Nu contează cum arată mașina în interior. Important este că este conceput astfel încât utilizatorul să primească sifon prin apăsarea a trei butoane. Același lucru este valabil și pentru o mașină. Nu contează ce se întâmplă înăuntru. Important este că atunci când apăsați pedala dreaptă mașina se deplasează înainte, iar când apăsați pedala stângă mașina încetinește. Aceasta este esența ascunderii informațiilor. Totul unui program' „interiorurile” sunt ascunse utilizatorului. Astfel de informații sunt de prisos sau inutile pentru utilizator. Utilizatorul are nevoie de un rezultat final, nu de un proces intern. De exemplu, să aruncăm o privire laClasa vehiculului :

public class Vehicle {

   public void gas() {

       /* Some complicated things happen inside a car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside a car.
       As a result, it slows down */
   }

   public static void main(String[] args) {

       Vehicle vehicle = new Vehicle();

       // How everything looks to the user

       // Press one pedal, the car moves
       vehicle.gas();

       // Press the other pedal, the car brakes
       vehicle.brake();
   }
}
Acesta este modul în care implementarea este ascunsă într-un program Java. La fel ca în viața reală: utilizatorului i se oferă o interfață (metode). Într-un program, dacă aveți nevoie de o mașină pentru a efectua o acțiune, apelați pur și simplu metoda dorită. Ceea ce se întâmplă în cadrul acestor metode este de prisos. Ceea ce contează este că totul funcționează așa cum trebuie. Aici am vorbit despre ascunderea implementării. Java are, de asemenea, ascunderea datelor. Am scris despre asta în lecția despre getters și setters, dar un memento nu va strica. De exemplu, avem o clasă Cat :

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
Poate îți amintești dintr-o lecție trecută care este problema cu această clasă? Dacă nu, să ne amintim. Problema este că datele (câmpurile) sale sunt deschise oricui. Un alt programator ar putea crea cu ușurință o pisică fără nume cu o greutate de 0 și o vârstă de -1000 de ani:

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
În această situație, puteți urmări cu atenție dacă unul dintre colegii dvs. creează obiecte cu stare invalidă, dar ar fi mult mai bine să eliminați chiar și posibilitatea de a crea aceste obiecte nevalide. Principiile încapsulării - 4Realizăm ascunderea datelor cu ajutorul:
  1. modificatori de acces ( privat, protejat, implicit pachet );
  2. getters şi setters.
Le folosim pentru a verifica dacă cineva încearcă să-i dea pisicii o vârstă negativă. După cum am spus mai devreme, autorii diferitelor articole despre încapsulare se referă de fapt la încapsulare (combinând date și metode) sau ascunderea informațiilor, sau la ambele. Java are ambele mecanisme (nu este neapărat cazul în alte limbaje OOP), deci ultima opțiune este cea mai corectă.

Încapsularea ne oferă câteva avantaje importante:

  1. Monitorizarea stării corecte a obiectului. Am dat exemple în acest sens mai sus: datorită setterului și modificatorului privat , ne-am asigurat programul împotriva pisicilor cu o greutate de 0.

  2. Interfață ușor de utilizat. Lăsăm doar metodele expuse utilizatorului. Utilizatorul trebuie pur și simplu să-i sune pentru a obține un rezultat. Și nu este nevoie să aprofundăm detaliile modului în care funcționează.

  3. Modificările codului nu afectează utilizatorii. Facem toate modificările în cadrul metodelor. Acest lucru nu afectează utilizatorii: au scris vehicul.gas() pentru a aplica gazul și asta vor continua să facă. Faptul că am schimbat ceva în cadrul metodei gas() rămâne invizibil: ca și înainte, pur și simplu obțin rezultatul dorit.