OOP: Enkapsulacija [Objašnjena]

Saturday, March 19, 2016


Kada pričamo o Objektno-Orijentisanom Programiranju (namjerno sve velikim slovima) i njegovim ključnim konceptima neophodno je spomenuti Enkapsulaciju, kada bih morao da odgovorim sa samo jednom rečenicom enkapsulacija u OOP bi bila: proces kombinovanja i zaštite atributa i funkcija u jedinstvenu jedinicu zvanu klasa (o kojima sam pričao u prošlom blog postu link je ovdje).

Ono čemu enkapsulacija rezultira je to da podaci nisu dostupni direktno preko objekata, nego da bi smo podacima tj. atributima pristupili (kako bi smo ih čitali ili editovali) potrebno je da imamo nešto što se naziva getter i setter funkcija... po samom imenu manje-više je jasno šta te funkcije rade. Getteri nam služe da nam vrate podatke iz klase, a settere koristimo kako bi smo promjenili stanje naših podataka u klasama. Atributi klase se pri tome čuvaju privatno, a preko javnih gettera podatke dohvaćamo dok preko settera se kroz unaprijed definisana pravila mjenja stanje u klasi.

Kao primjer enkapsulacije ja ću navesti možda najpopularniji primjer a to je vožnja automobila, kada se vozite da li je potrebno da poznajete kako radi svaki dio vašeg vozila ponaosob (motor, alternator, mjenjač, itd ...). Naravno da ne, sve što treba je da znate kako da upravljate sa volanom, da kočite kada je to potrebno ili da ubrzavate i u osnovi automobil to i jeste, pomoć vama kako bi ste se kretali od tačke A do tačke B.

Također kao jedan od primjera enkapsulacije u programiranju su ugrađene funkcije koje nam služe kako bi smo lakše rješavali zadatke sa kojima se susrećemo u našoj App npr:

int x = 712;
String s = x.ToString();

Šta tačno funkcija ToString u sebi kao mehanizam ima, kako bi uradila ono što i radi puno me i nije briga sve dok ona obavlja zadatak kako treba. E takav slučaj je i sa našim korisnički definisanim klasama u kojima imamo ulaz i izlaz šta se unutar toga dešava ne treba da bude vidljivo.

Zašto je Enkapsulacija korisna?

Enkapsulacija nam pomaže da pišemo čistiji i modularniji kod, pri tome nam omogućava da podaci i mehanzimi u klasama budu zaštićeni i dostupni samo preko javnih getter i setter funkcija. Uvođenjem enkapsulacije klasa preuzima potpunu kontrolu nad podacima koji se smještaju u njoj.

Da bi smo primjenili osnovna pravila enkapsulacije potrebno je da naše klase imaju slijedeće:
  • privatne (private) atribute
  • javne (public) getter i setter metode
Enkapsulacija kao što i ime govori je učahurivanje klase i podataka, samim tim to predstavlja na neki način i sigurnost naše aplikacije pa tako npr. ako zamislimo mini app za vođenje bankovnog računa i klasu pod imenom banovni račun, koja ima određene atribute i funkcije:


Kao što sam i na slici prikazao enkapsulacija zabranjuje direktan pristup našim atributima i izmjeni istih, pristup, pregled i izmjenu naših atiributa radimo preko odgovarajućih funkcija članica, te preko već nekoliko puta spomenutih getter i setter metoda.

Ako bi smo na klasičan način željeli promjeniti stanje nekog atributa u našem objektu to bi radili na slijedeći način:

BankovniRačun prvi = new BankovniRačun();
prvi.stanjeRačuna = 712;

Na prvi pogled ništa čudno i neobično, ali ako se malo zapitamo da li smo mi uradili ikakve provjere koje bi rezultirale tome da se stanje računa promjeni, da li smo provjerili da li je račun još važeći itd.. Na slici sam ovaj način (direktni pristup) označio kao nepravilnim i netačnim, dok sa druge strane imamo funkcije članice sa kojima možemo na siguran i provjeren način raditi sa našim bankovim računima i tako npr: prije funkcije Isplata() možemo da provjerimo da li je korisnik autorizovan da radi sa stanjem tog računa kroz neke provjere u vidu login-a, nakon toga u funkciji Isplata() da provjerimo da li korisnik ima dovoljno sredstava na svom računu prije nego što isplatimo sredstva i promjenimo stanje na računu ... itd.

Mogu reći da nam Enkapsulacija pruža osnovni i prvi stupanj sigurnosti u našim aplikacijama, kasnije na višim slojevima mi možemo da to mnogo više unaprijedimo, ali enkapsulacija je osnova svega i prvi korak ka boljem održavanju sistema.

Jako često pitanje je: "Ako sam ja developer moje App, žašto ja moram išta sakrivati od sebe?" Odgovor je jako jednostavan: U enkapsulaciji nije stvar o nekom sakrivanju koda da bi se na "teži" način dolazilo do njega nego o praktičnosti i modularnosti klasa i same aplikacije, pa tako promjena jednog dijela ili jedne funkcije klase se automatski primjenjuje na svim mjestima na kojima koristimo tu funkcije bez da ručno moramo na hiljadu mjesta mijenjati naš kod kako bi app radila ispravno.

Ako me pitate koliko treba atributa stavljati na private kratko i jasno: "što više to bolje" i zadovoljan sam ako sam vam objasnio i približio osnovne stvari koje su bitne za enkapsulaciju i njenu primjenu. Prava primjena i prednosti enkapsulacije ćemo vidjeti u slijedećem blog postu kada ću pisati o OOP konceptu a to je Nasljeđivanje.

Nadam se da sam bio jasan i precizan u onome što sam mislio da napišem, a želja mi je da što bliže približim osnove OOP kroz ovaj mini serijal postova na mom blogu.

Pozdrav! Almir Vuk | AV Development | http://almirvuk.blogspot.ba/

You Might Also Like

1 comments