You are on page 1of 7

Uvod u objektno orijentisano programiranje

Objektno orijentisano programiranje – Pri učenju novog jezika uvek se najveća pažnja
posvećuje učenju sintakse tog jezika i specifičnostima vezanim za taj jezik. Međutim, jako je
bitno razumeti principe i metodologiju koji stoje iza tog jezika. Pošto je tema ovog teksta
objektno orjentisano programiranje, podrazumeva se da govorimo o jezicima koji su ili
potpuno objektno orjentisani ili to nisu, ali podržavaju OOP pristup programiranju. Ovde
ćemo konketno pisati o c# programskom jeziku, ali treba naglasiti da je sve napisano, u stvari
uopšteni OOP princip, koji je nezavisan od programskog jezika.

U OOP-u se teži pisanju delova koda koji su laki za održavanje i ponovno upotrebljivi (code
reuse), a sa druge strane omogućavaju izvršavanje kompleksnih zadataka. Kompletna
struktura objektno orjentisanih programa veoma se razlikuje od strukture programa napisanih
u nekom proceduralnom jeziku i daje programu intuitivnu, prirodnu stukturu.

Televizor, ulica, drvo, kuća, knjiga su samo neki od objekata koje susrećemo u
svakodnevnom životu. Ideja objektnog programiranja je da se taj model objekata iz realnog
života prenese i na programiranje. Tako je u programiranju objekat svaki element koga treba
predstaviti programu, podrazumevajući pod tim i „žive“ objekte odnosno ljude i životinje.
Uopšte OOP i njegova analogija sa objektima i događajima iz svakodnevnog života, nam
omogućava drugačiji pristup programiranju – nama lakše razumljivi i prirodniji način, kao i
mogućnost razbijanja programa na manje celine, čime obezbeđujemo lakše upravljanje. OOP
principi su zasnovani na primeni koncepta crne kutije. Koncept crne kutije podrazumeva
korišćenje nekog objekta, bez konkretnog znanja o načinu funkcionisanja tog objekta. Kao
primer možemo navesti televizor. Svako od nas zna šta je i kako da ga koristi, ali se ne
zamaramo time kako on radi. Takođe zamena televizora drugim modelom podrazumeva neke
razlike između modela, ali suština i osnovna namena televizora ostaje ista, kao i standardi
kako ga priključujemo na električnu struju, gde priključiti antentu itd.

Klase i kreiranje objekata

U programiranju klasa predstavlja definiciju ili šablon na osnovu koje kreiramo objekat. Klasa
se sastoji iz članova klase. Članovi klase su svi elementi koji sačinjavaju tu klasu i koristeći
c# terminologiju to su najčešće metode i polja. Često korišćen sinonim za metode u drugim
jezicima je funkcija. Pričajući o objektima, pravili smo analogiju sa televizorom, i rekli da svi
znamo „kako se koristi“, ali ne ne znamo „kako radi“. Najčešće nam metode obezbeđuju
funkcionalnost „kako se koristi“, a celokupna klasa sa svim njenim članovima nam
obezbeđuje „kako radi“.
Na slici 1 možete videti definiciju klase Imenik. Dodavanje, brisanje i pretraživanje
predstavljaju metode klase. Korišćenjem datih metoda korisnici mogu da manipulišu sa
poslovnim imenikom, a polje kontakti (List<string> kontakti) sadrži potrebne podatke sa
kojima se radi. Kao što možete primetiti ispred definicije svakog člana klase stoji, u našem
slučaju private ili public i to je takoznani modifikator pristupa. Modifikatori pristupa služe da
odrede koji će članovi klase biti vidljivi ostatku sveta, a koji će biti vidljivi samo u datoj klasi
i biti njeni interni članovi. Modifikator private uz polje kontakti označava da će ovo polje biti
vidljivo samo u klasi imenik, dok su public metode dodavanje, brisanje i pretraživanje biti
vidljive i van klase.

Klasa predstavlja šablon na osnovu koga ćemo kreirati objekat. Uobičajeni naziv za kreiranje
objekta je instanciranje.

Objekat objectImenik smo kreirali na osnovu klase Imenik. U sledećem redu smo startovali
metodu dodavnje, objekta objectImenik.

Metode i promenjive

Metode se sastoji iz potpisa i tela metode. Pod potpisom podrazumevamo modifikator


pristupa o kome je bilo reči, zatim povratni tip, naziv same metode i ulazne parametre. Telo
metode sadrži samu funkcionalnost metode, odnosno egzaktni posao koji ona odrađuje.
Napomenimo da c#, c++ i java koriste tipizirane podatke. To znači da neka promenjiva ne
može da sadrži bilo koji tip podatka, kao na primer u shell programiranju ili u php-u već je
svaka promenjiva određenog tipa i shodno tome sadrži podatke samo određenog tipa (string,
int, float itd). Povratni tip je rezultat koji metoda vraća. Na slici 1 povratni tip za sve tri
metode je bio void, što znači da metoda ne treba da vrati nikakvu vrednost. Ulazni parametri
su podaci koje prosleđujemo metodi, pri njenom pozivanju, ali metoda ne mora sadržati
nijedan ulazni parametar što je i slučaj na slici 1.

Jedna od objektno orjenitsanih mogućnosti koju implementiraju c++, c#, java itd je takozvano
preopterećenje metoda (overload), odnosno situacija da nekoliko metoda nazovemo istim
imenom, a da imaju drugačije potpise.

Preopterećenje metoda često koristimo u situaciji kada trebamo da izvršimo istu operaciju,
sabiranje u našem slučaju, ali broj ulaznih parametara varira. Tako prva metoda kao ulazne
parametre uzima dve celobrojne (int – integer) vrednosti, a kao rezultat vraća celobrojnu
vrednost zbira ulaznih vrednosti. Druga metoda prima tri celobrojna broja kao argumente i
vraća njihov zbir, a treća metoda prima četiri celobrojne vrednosti kao ulazne parametre, a
povratni tip je njihov zbir.

Osnovni principi objektno orjentisanog programiranja

Osnovni principi objektno orjentisanog programiranju su:

 Apstrakcija
 Enkapsulacija
 Modularanost
 Polimorfizam
 Nasleđivanje

Enkapsulacija i apstrakcija su pojmovi koji se međusobno nadopunjuju i teško ih je do kraja


razdvojiti. Apstrakcija predstavlja proces zapažanja osobina i ponašanja objekata, a
enkapsulacija se fokusira na implementaciji koja će dovisti do takvog ponašanja. Najprostije
rečeno, na primeru našeg televizora s početka, apstrakcija bi bila gledanje televizora iz ugla
korisnika – odnosno šta radi, a enkapsulacija bi bila konkretna implementacija – kako radi. Pri
tome bitan faktor enkapsulacije je skrivanje unutrašnje strukture klase i prikazivanje
korisnicima samo onog dela koji treba da vide.

Jedan od fundamentalnih aspekata OOP-a je nasleđivanje. Postoji više vrsta nasleđivanja –


nasleđivanje implementacije i nasleđivanje interfejsa. Takođe zavisno od programskog jezika
i njegove OOP implementacije nasleđivanja, može se podeliti na jednostruko ili višestruko.
Ali da vas ne bi zbunjivali ovim podelama, neka suštinska definicija nasleđivanje je da ono
predstavlja vezu između klasa u kojoj jedna klasa nasleđuje strukturu i ponašanje druge klase
– jednostruko nasleđivanje ili više klasa – višestruko nasleđivanje. Jedan od OOP jezika koji
podržava sistem višestrukog nasleđivanja je c++, dok recimo c# podržava samo jednostrano
nasleđivanje. Klasa koja se nasleđuje naziva se baznom ili osnovnom klasom, a klasa koja je
nasleđuje naziva se izvedenom klasom. Dakle, nasleđivanje je hijerarhijska organizacija klasa,
gde jedna klasa nasleđuje drugu i zadržava kompletan sadržaj klase koju nasleđuje i taj
sadržaj može proširiti ili redefinisati.

U direktnoj vezi sa nasleđivanjem je i polimorfizam – verovatno jedno od najmoćnijih


svojstava objektno orjentisanog programiranja. To je svojstvo da objekat izvršava operaciju
na način svojstven izvedenoj klasi kojoj pripada, mada mu se pristupa kao objektu osnovne
klase. Više o polimorfizmu i kako ga implementirati možete pročitati na
http://msdn.microsoft.com/en-us/library/ms173152.aspx

Modularnost se odnosi na postupak razbijanja programa na manje delove koji mogu


autonomno funkcionisati. Modularnost se primenjuje kako bi se omogućila višestruka
upotreba softverskih komponenti, odnosno takozvana ponovna upotreba koda (code reuse).

OSNOVA OBJEKTNO ORIJENTISANOG PROGRAMIRANJA (OOP-a)

OOP je način pristupa realizaciji softvera kao modelu realnog sveta. Objektno orijentisano
programiranje predstavlja sasvim nov način razmišljanja u odnosu na tzv. tradicionalno algoritamsko
programiranje. Problemi se identifikuju kao objekti koji nešto rade i apstrakcije koje predstavljaju
skupove objekata istih svojstava. Kod ovakvog načina programiranja mnogo više vremena se troši na
projektovanje, a manje na samo programiranje, što je bio slučaj kod običnog (tradicionalnog)
programiranja. OOP u centar rada postavlja problem koji rešava, a ne pitanje konkretnog
programskog rešenja. Akcenat je na objektima (delovima sistema) koji nešto rade, a ne na
algoritmima tj. na tome kako nešto radi. OOP pruža nekoliko bitnih koncepata, a to su: klase, objekti,
enkapsulacija, metode i svojstva, kontruktori i destruktori, nasleđivanje i polimorfizam

1.Klasa je osnovna organizaciona jedinica programa u objektno orijentisanom jeziku. Klasa


predstavlja tip, skup objekata istih svojstava. Klasa je tip, a objekat je primerak klase. Klasa
predstavlja neki apstraktni tip koga definiše korisnik jezika. Kao što u nekom jeziku postoje ugrađeni
tipovi – int, char, real, ovde nam je dozvoljeno da definišemo proizvoljan broj promenljivih svog tipa i
da iskoristimo potpuno ravnopravno. Uočavanje zajedničkih svojstava bitnih za funkcionisanje
sistema i izdvajanje skupa entiteta koji imaju zajednička svojstva se naziva asptrakcijom. Klasa ima
određene atribute (osobine) i operacije (akcije) koje se mogu vršiti nad objektima klase. Atributi
najčešće predstavljaju unutrašnjost klase tj. njenu realizaciju, dok operacije predstavljaju ono što se
spolja može raditi sa objektima klase. Svojstvo definisanja proizvoljno mnogo promenljivih nekog
apstraktnog tipa se naziva svojstvom višestrukih primeraka. Klasa predstavlja tip za koji se mogu
kreirati primerci. Primerci klase se zovu objekti.
Klase se u Visual Basic .NET-u prave korišćenjem naredbe Class. Osnovna šema izgleda ovako:

[Public | Private | Protected | Friend | Protected Friend | Shadows ]


[ MustInherit | NotInheritable ] Class nazivKlase
'ovde ide implementacija
End Class

Značenje ključnih reči:

Public - Klasa je javno dostupna.


Private - Klasi je moguće pristupiti samo iz programskog modula u kojoj je deklarisana.
Protected - Klasi je moguće pristupiti samo iz klase koja je sadrži ili iz tipova izvedenih iz te klase.
Friend - Klasa je dostupna samo iz ovog programa.
Protected Friend - Klasa je dostupna samo iz programa ili tipova izvedenih iz klase koja je sadrži.
Shadows - Klasa je senka neke identično imenovane klase.
MustInherit - Ovo je apstraktna klasa i članove klase mora da implementira klasa koja je nasleđuje.
NotInheritable - Klasa ne može da se nasleđuje

2.Objekat. Objekat je predstavljanje nečega što postoji. Kako je klasa tip, objekat predstavlja
promeljivu toga tipa u programu. Svaki objekat ima sopstvene elemente koji su navedeni u deklaraciji
klase, a takođe ima i svoje karakteristike: identitet, stanje i ponašanje.
Kako to funkcioniše? Setimo se programa za video klub koji bi sada trebalo da ištampa račun za
izdate filmove članu kluba. Za ovo su nam potrebni objekat pod nazivom 'Račun' i objekat pod
nazivom 'Izdanje'. Objekat Izdanje predstavlja osnovnu delatnost kluba, tačnije samo izdavanje
filmova članu. Ovaj objekat će konsultovati objekat Član koji će mu dati podatke o samom članu koji
je došao da iznajmi filmove, ali će konsultovati i objekat Film koji će mu dati podatke o izdatom filmu.
Objekatu Izdanje je potrebna i mogućnost da generiše račun. Objekat Račun bi predstavljao primerak
računa za člana u kome bi bili upisani detalji računa, a takođe bi mogao i da se odštampa. Veoma je
bitno zapaziti da objekat ima inteligenciju da proizvede aktivnosti koje se na njega odnose (objekat
Izdanje može da generiše račun). Tada objektu Izdanje možemo jednostavno reći 'Napravi račun.', a
objektu Račun možemo reći 'Odštampaj se'. Ovo su primeri ponašanja objekta. Veliki je značaj
objekta u tome što ih može koristiti i neko ko ne razume kako su oni sastavljeni.

3.Enkapsulacija je osnovni koncept na kome počiva objektna orijentisanost. Ona predstavlja


sakrivanje detalja realizacije nekog tipa, gde tip opisuje ista svojstva celog skupa primeraka. Korisniku
određenog tipa je potrebno precizno definisati samo šta se s tipom može raditi, dok se način kako se
to tačno radi sakriva od korisnika. Jedan objekat u programu može da koristi samo one delove drugog
objekta koje je taj drugi objekat proglasio za vidljive. Nema načina da jedan objekat pristupi
unutrašnjosti drugog, osim ako mu to nije specijalno dozvoljeno. Ovakav princip u velikoj meri
smanjuje verovatnoću grešaka u programu jer je sigurno da se niko spolja ne oslanja na detalje
realizacije, prosto zato što ne može da ih vidi. Enkapsulacija znači da objekte možemo posmatrati kao
crne kutije. Uz osnovno znanje o tome šta kutija radi, nama nije potrebno da ulazimo u detalje i
razumevanje kako ona zapravo radi kada joj zadamo da uradi nešto. U primeru štampanja računa
članu video kluba, onaj ko iznajmljuje filmove članovima, ne mora da zna na koji način će se obaviti
radnja 'Napravi račun', njemu je samo bitno formiranje računa radi njegove štampe.

4. Metode i svojstva. Na objekte utičemo kroz metode i svojstva. Metode predstavljaju nešto što
zadamo objektu da radi. U tom smislu, pokretanje metoda je analogno pozivanju funkcija. Svojstvo je
nešto što opisuje osobinu i stanje objekta. Ako bi trebalo da štampamo račun, trebalo bi da nađemo
metod koji ovo radi. Kada pokrenemo metod, pretpostavlja se da sam objekt razume šta treba da
uradi da bi zadovoljio zahtev. Nas ne zanima šta on zapravo radi, mi samo kažemo 'Štampaj račun'. Sa
druge strane, ako bi trebalo da štampamo neki drugi račun, možemo podesiti svojstvo računa. Ako
želimo da štampamo račun broj 5 a ne 7, podesićemo svojstvo broja računa na vrednost 5. Takođe
moguće je menjati svojstvo tip ili veličinu fonta, kao i mnoga druga. Objekat je odgovoran za
reagovanje na ovaj zahtev i mi ne treba da brinemo o tehničkim stvarima kroz koje objekat prolazi da
bi ispunio naš zahtev.

5.Kontruktori. Objekat predstavlja složeni sistem koji ima neko svoje unutrašnje stanje. To stanje
treba uspostaviti na određen način na početku života objekta. Zato u programu treba obezbediti
mehanizam da se objekat automatski po nastanku dovede u ispravno početno stanje što se postiže
procesom inicijalizacije. Da bi se to obezbedilo, u klasi se definiše posebna funkcija članica koja se
poziva automatski pri kreiranju objekta. Ova funkcija se naziva konstruktorom i nosi isto ime kao i
sama klasa. Izgled samog konstruktora je stvar interne realizacije klase. Kada se definišu objekti neke
klase, potrebno je navesti stvarne argumente poziva konstruktora. Kada se u toku izvršavanja
programa naiđe na definiciju objekta, poziva se konstruktor sa navedenim argumentima. Tada se
izvršava telo konstruktora, čime je objekat doveden u početno stanje onakvo kakvo je predvideo
projektant klase.
U Visual Basic .NET-u konstruktori predstavljaju funkcije članice koji se pozivaju sa New.

6.Destruktori. Moguće je definisati funkciju članicu klase (metodu) koja će se automatski pozvati
kada objekat prestaje da živi. Ova funkcija se naziva destruktor. Njena sintaksa je sledeća:

tacka(); // konstruktor
∼tacka(); // destruktor

Destruktor ne vra≤a vrednost i ne može imati parametre

Slijedeći primjer treba da ilustruje da se destruktor poziva automatski


kada se napuxta blok u kome su definisani objekti. S tim ciljem je predvi±eno ispisivanje poruke
Redoslijed uklanjanja je po LIFO

Jedna od dobrih stvari koje je jeste prikupljanje đubreta (Garbage Collection, GC) koje se odvija u
pozadini i prikuplja reference objekta koji se ne koriste, što nas oslobađa potrebe da ih sami
uništavamo. Međutim, kako je ovo proces koji se odvija u pozadini, mi ne možemo tačno znati kada
je proces pozvan.

7.Nasleđivanje je najvažniji koncept OOP-a. To je relacija između klasa: Ako je klasa B jedna vrsta
klase A, tj. ako objekti klase B imaju sve osobine klase A i još neke, onda je klasa B naslednik klase A.
Nasleđivanje se realizuje izvođenjem klasa. Kada jedna klasa predstavlja jednu vrstu druge klase, kaže
se da je ona izvedena klasa iz te druge klase, koja se naziva osnovnom klasom. Pri kreiranju objekta
izvedene ili nasleđene klase, najpre se izvršava kostruktor osnovne klase koji inicijalizuje podobjekat
osnovne klase, zatim konstruktor članova izvedene klase, i najzad telo konstruktora izvedene klase.
Kada se kreira objekat izvedene klase koji u sebi sadrži i članove nasleđene iz osnovne klase,
potrebno je inicijalizovati i taj nasleđeni deo. To se vrši automatski, pozivom konstruktora osnovne
klase pre nego što se izvrši telo konstruktora izvedene klase.

8. Polimorfizam u prevodu znači pojavljivanje u više oblika. To je svojstvo koje obezbeđuje


izvršavanje verzije funckije članice svojstvene izvedenoj klasi, iako se objektu pristupa kao pripadniku
osnovne klase. Funkcije članice koje će u izvedenim klasama imati nove verzije nazivaju se virtuelnim
funckijama. To su funkcije čija se definicija odlaže za izvedene klase. Virtuelna funkcija deklariše se
navođenjem reči virtual ispred deklaracije funkcije unutar deklaracije klase.

You might also like