Pojam klase. Enkapsulacija podataka.
Klase
Klase (classes) su opisi koji definišu kako će se generisati objekti i koje osobine i funkcionalnosti ti objekti poseduju. Klasa predstavlja strukturu u kojoj su grupisani podaci i funkcije, uključujući i druge klase. Klase predstavljaju opise tj. šablone za opis zajedničkih karakteristika grupe objekata. Klase se sastoje od članova (class members) različitog tipa. Podaci klasnih tipova predstavljaju primerke (instances) i nazivamo ih objektima (objects). Promenljiva klasnog tipa je pokazivač u statičkoj memoriji na objekat koji se nalazi u dinamičkoj memoriji.
Član klase može biti polje (field) za podatke, metoda (method) koje predstavljaju funkcije klase, konstruktor, destruktor, svojstvo, indekser, druga klasa ili događaj.
Deklaracija klase
class ime_klase : NazivOsnovneKlase
{
modifikator tip polje;
...
modifikator tip metoda(parametri);
...
}
Polje klase
imeTipa imePolja = početnaVrednost, imePolja2,..;
Klasom se definiše novi korisnički tip. Instance klase nazivaju
se objekti. Svaki objekat ima svoje sopstvene elemente koji su
navedeni u deklaraciji klase. Ovi elementi nazivaju se članovi
klase. Kreiranje objekata se vrši operatorom new,
članovima se pristupa preko operatora . (tačka):
objekat.clan
Unutar klase, tekućem objektu klase se
predstavlja ključnom reči this. Time se označava
da se pristupa članu tekućeg objekta:
this.clan
Za
pristup članu sopstvene klase može se koristiti samo ime člana
klase:
clan
Za pristup članovima se koristi modifikator koji može biti: public, private, protected, protected internal i internal.
Enkapsulacija
Enkapsulacija (učaurivanje) je bitna prilikom definisanja klase. Ideja je ta da program koji koristi klasu ne treba da brine kako klasa radi, program jednostavno kreira instancu klase i poziva metodu te klase. Enkapsulacija se nekad naziva sakrivanje podataka, podrazumeva kontrolisan pristup elementima objekta. Ona ustvari ima 2 svrhe:
-
da kombinuje metode i podatke unutar klase, drugim rečima, da podrži klasifikaciju
-
da kontroliše dostupnost metoda i klasa, drugim rečima, da kontroliše upotrebu klase.
Primer:
class Krug
{
private int r;
public Krug() // Podrazumevani konstruktor
{
r = 0;
}
public double Povrsina()
{
return Math.PI * r * r;
}
}***
Da se podsetimo od ranije (ako se ne sećate, a trebalo bi da znate):
Modifiers - modifikatori određuju rang delovanja promenjive, funkcije, strukture, metode i klase na nivou celog rešenja. Osnovni modifikatori pristupa su:
- Public – javan, bez restrikcija.
- Protected Internal – limitiran na program, klasu i izvedene klase
- Internal – limitiran na program i klasu
- Protected – limitiran na klasu i izvedene klase.
- Private – limitiran samo na klasu
- Static – omogućava da nam nije potrebno da instaciramo klasu kako bi smo pristupili članu klase
***
za one koji žele znati malo više ili ...
Ako ni ovo nije dovoljno jasno, u nastavku je detaljnije objašnjenje enkapsulacije
Kada pričamo o Objektno-Orijentisanom Programiranju i njegovim ključnim konceptima neophodno je spomenuti Enkapsulaciju. Ako bi se moralo odgovoriti sa samo jednom rečenicom enkapsulacija u
OOP bi bila: proces kombinovanja i zaštite atributa i funkcija u
jedinstvenu jedinicu zvanu klasa.
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 promenili stanje naših podataka u klasama.
Atributi klase se pri tome čuvaju privatno, a preko javnih gettera
podatke dohvatamo dok preko settera se kroz unapred definisana pravila
menja stanje u klasi.
Kao primer enkapsulacije je možda najpopularniji primer - 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đe, kao jedan od primera enkapsulacije u programiranju su ugrađene
funkcije koje nam služe kako bi smo lakše rešavali zadatke sa kojima se
susrećemo u našoj Aplikaciji, 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?
- privatne (private) atribute
- javne (public) getter i setter metode
Kao što sam i na slici prikazao enkapsulacija zabranjuje direktan pristup našim atributima i izmeni istih, pristup, pregled i izmenu 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 želeli promeniti stanje nekog atributa u našem objektu to bi radili na sledeć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 provere koje bi rezultirale tome da se stanje računa promeni, da li smo proverili da li je račun još važeći itd.. Na slici je ovaj način (direktni pristup) označen kao nepravilnim i netačan, dok sa druge strane imamo funkcije članice sa kojima možemo na siguran i proveren način raditi sa našim bankovim računima i tako npr: pre funkcije Isplata() možemo da proverimo da li je korisnik autorizovan da radi sa stanjem tog računa kroz neke provere u vidu login-a, nakon toga u funkciji Isplata() da proverimo da li korisnik ima dovoljno sredstava na svom računu pre nego što isplatimo sredstva i promenimo stanje na računu ... itd.
Možemo reći da nam Enkapsulacija pruža osnovni i prvi stepen sigurnosti u našim aplikacijama, kasnije na višim slojevima mi možemo da to mnogo više unapredimo, ali enkapsulacija je osnova svega i prvi korak ka boljem održavanju sistema.
Jako često pitanje je: "Ako sam ja developer moje Aplikacije, ž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 promena jednog dela ili jedne funkcije klase se automatski primenjuje na svim mestima na kojima koristimo tu funkcije bez da ručno moramo na hiljadu mjesta menjati naš kod kako bi aplikacija radila ispravno.
Ako se zapitate koliko treba atributa stavljati na private: kratko i jasno: "što više to bolje".