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
Pored navedeni modifikatora obavezno trebate obratiti pažnju i na:
  • 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?

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 smeštaju u njoj.

Da bi smo primenili osnovna pravila enkapsulacije potrebno je da naše klase imaju sledeć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 aplikacije za vođenje bankovnog računa i klasu pod imenom bankovni račun, koja ima određene atribute i funkcije:


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".

Last modified: Thursday, 10 October 2019, 11:03 PM