Objektno programiranje
Objektno Programiranje
Predavanja
2

4
Problemi strukturirane metodologije
Strukturirano programiranje je imalo takoreći
„ugrađenu naprslinu“. Ovakav način dekompozicije je u
stvari dekompozicija alogoritma, ali se onda postavlja pitanje šta je sa strukturama podataka? Ova metodologija
to ne rešava. To je u stvari osnovni problem ove metodologije, to što se bavi samo dekompozicijom
alogoritama. Iz toga proističe poblem
kompatibilnosti. To je problem koji nastaje kada neki tim radi na
rešavanju problema i jedan programer pravi ulazni potprogram ( npr. unos matrice i mora da je sažme da bi
stala u memoriju ), a neki drugi programer koji radi sa drugim potprogramom ne koristi istu strukturu podataka
( npr. inverziju kompletne a ne sažete matrice ) i tu nastaje problem. Ovaj problem se vidi tek kod velikih
projekata kada i mali problem može da ima katastrofalne posledice. Tj u o
pštem slučaju nema garancije da će se
za različite potprograme koristiti iste strukture podataka.
Drugi problem jeste problem kontinuiteta ( proširivosti ). Svaki softver se vremenom proširuje i
nadograđuje
da bi opstao na tržištu. Strukturirano programiranje
ne garantuje da će softver biti proširiv tj. ne
rešava ga uopšte jer je vrlo teško raditi izmene kod alogoritamsko orijentisanih programa, za razliku od unosa
izmena u strukturu podataka.
Treći problem je problem
mo
gućnosti višestruke upotrebe. On nastaje kada hoćemo neke potprograme
da koristimo uvek kada nam zatrebaju tj. hoćemo da oni budu univerzalni. Načini na koji su organizovane
biblioteke potprograma je postao ograničenje u radu sa potprogramima. Zahtev za vi
šekratnom upotrebom je
zahtevao i određene izmene i proširenja potprograma kada hoćemo da ih koristimo. Ovo dvoje se jednim
imenom naziva modularnost
. Ona se pojavljuje na svakom koraku programiranja. Naročito se to primećuje kod
korisničkog interfejsa jer
sva dugmad su 99% ista po izgledu koda, tj. suštinski se razlikuje samo njihova funkcija.
Zato mi samo kod dugmadi u stvari menjamo njihovu funkciju jer bi njihovo pravljenje piksel po piksel bilo
veoma teško.
Objektno programiranje
Zbog predhodnih problema
moralo je doći do izmena u metodologiji
i to u obliku objektne metodologije i
objektnog programiranja. Ono je mnogo savršenije od predhodne dve vrste i bazira se na logici ljudskog uma.
Neki smatraju da je ono počelo 1967. sa člankom Dahla u knjizi „Strukturirano programiranje“. Stvarni početak
je odložen do kraja 70-
ih godina kada ne njegovo uvođenje bilo neminovno.
Objektni programer počinje sa softverskim modelovanjem. Prvo se ustanovi domen problema kome
pripada naš problem i pravi se njegov model. Problem sata koji uvek radi je karakteristika objektnog
programiranja i samo ono nudi rešenje tog problema. O programer uočava
entitete i povezuje ih u klase
entiteta
i tek onda ih softverski modeluje. U problemu Ax=b uočavamo tri entiteta: A,b,x. Sada se
modeluju ove
klase entiteta ( primer je dat na ad-hok jeziku ):
Naziv: Matrica
Podaci: m,n,P
Operacije:
Učitati
Invertovati
Prikazati
Transponovati
Pomnožiti SL ( vektorom )
Pomnožiti SD ( vektorom
)
Naziv: Vektor
Podaci: k,V
Operacije:
Učitati
Prikazati
Moduo
.
.
.
Matrica A;
Vektor x,b;
A.Učitati
b.Učitati
A.Invertovati
X=A.Pomnožiti SD ( b )
x.Prikazati
Ključni deo objektnog programiranja je da u podacima ne stoje samo osobine entiteta već i operacije nad
tim entitetom. Kada se završi rad sa jednom k
lasom počinje rad na drugoj klasi i tek kada ovo sve završi
programer se vraća na početni proble
m
. Ova kratkoća glavnog programa ( treća kolona u primeru ) je u stvari
karakteristična za objektno programiranje. Znači ovde osim podataka uviđamo i operacije. Objektno
programiranje je podešeno tako da više nikada ove klase nećemo pisati već ih možemo uve
k koristiti.
5
Nasleđivanje
je mehanizam C++ kojim omogućava dopunjavanje i prilagođavanje klasa našim potrebama tj.
možemo klase da prilagodimo našim potrebama bez da remetimo izvorni kod te klase. Kod objektnog
programiranja objekti međusobno vrše interakc
iju. Deo klase naziva se objekat ili instanca klase. U
predhodnom primeru objekti su A i x,b. Klasa i objekat stoje u istom odnosu kao i tip i promenljiva.
Temelji objektnog programiranja
Objektna metodologija kao i svaka druga metodologija stoji na određenim principima tj. ima određene
osnove. Ona se zasniva na nekoliko osnovnih principa koji su bili poznati čak i pre objektnog programiranja
u
rudimentalnom obliku, samo što tada nisu igrali bitnu ulogu u izradi softvera. Osnovni elementi objektnog
programiranja su: apstrakcija i skrivanje informacija, inkapsulacija i modularnost
, polimorfizam, veze između
klasa a posebno nasleđivanje.
Apstrakcija ili apstrahovanje je veoma opšti postupak, na kome je zasnovana naša logika, poznat i
hiljadama godina pre nast
anka objektne metodologije i predstavlja izdvajanje odnosno uočavanje
bitnog i
zanemarivanje nebitnog
. Postoji i u strukturnom programiranju gde svaki obučen programer vidi potprograme
kao apstraktne elemente.
Skrivanje informacija je odavno jedan od klj
učnih principa objektnog programiranja.
Razlog skrivanja
informacija je smanjivanje kompleksnosti koju programer mora da razume.
Takođe ovaj princip podrazumeva
da klijentu ne moraju biti poznati detalji realizacije programa i time smanjuje kolicinu informacija koju programer-
klijent mora da drzi u glavi.
Inkapsulacija
je tehnika kojom se pri realizaciji objedinjavaju deskriptivne i dinamičke osobine modela
entiteta ( u našem slučaju objekata ) poštujući pri tome princip skrivanja informacija.
Modularnost je tehnika razlaganja složenog softverskog sistema u domenu implementacije na
jednostavnije elemente koje imaju unutrašnju logku. Ona je bila poznata i kod procedurnog programiranja kao
skup servisa namenjenih korisnicima ( biblioteke ). Sama modularnost p
redstavlja mogućnost proširivosti i
višekratne upotrebe i to je ključna stvar u objektnom programiranju.
Polimorfizam ( poli – više, morfe – oblik )
je osobina, ili pak mogućnost, da se softverska komponenta
ponaša zavisno od konteksta ili okolnosti. Tako se polimorfno mogu ponašati objekti, promenljive pa i funkcije.
Tako se na primer ponaša C-ova znakovna promenljiva kada se pojavljuje u kontekstu ’a’+1 i tada se ponaša kao
celobrojna promenljiva. Za ostvarenje polimorfizma uvek mora postojati određen pre
duslov koji je u
prethodnom slučaju ugrađen u C, tj. znakovna promenljiva je podtip celobrojnog tipa.
Veze između klasa su jedan od bitnih elemenata, jer vrlo retko klase postoje kao izolovane, već su veoma
česte veze sa drugim klasama
. Vezama se ostvaru
je uređenje apstrakcija. Najveću važnost ima nasleđivanje
tj.
izvođenje klase iz klase. Nasleđivanje predstavlja prenošenje osobina jedne klase na drugu uz mogućnost
dopune i modifikacije bez izmene izvornog koda prve klase. Ono omogućuje npr. da osnovnoj
funkciji tastera,
koja je ista za sve, dodamo i novu, nama potrebnu, funkciju bez menjanja njegovog koda.
Objekat i klasa
Postoji mnogo de
finicija i klasa i objekata ali jedno što im je zajedničko jeste da kažu da su klasa i objekat
u stvari pojmovi. Pojam je po svojoj prirodi misao o bitnim karakteristikama predmeta kojih mi u realnosti
prepoznajemo. To je ono što mi u stvari modelujemo. Najbitniji pojmovi u programiranju jesu pojam za stvar,
proces, osobinu i na kraju pojam za odnos. Takođe veoma bitna stvar jesu i odnosi među pojmovima. Pojam
može biti individualni ili opšti ( klasni ) pojam.
Logika se bavi opštim, bitnim osobinama problema, ali mi sa stanovišta programiranja ih možemo
posmatrati konkretnije jer ih vezujemo samo za pitanje problema i ne idemo ka univerzalijama. Od problema do
problema mi posmatramo druge karakteristike koje su nam u tom trenutku relevantne. Tako se svi autori slažu
da su najbitnije osobine objekta: indentitet, stanje i ponašanje.

7
3.
Svaki objekat poseduje sopstvenu memoriju sastavljenu od drugih objekata ( i drugih
promenljivih u hibridnim jezicima ). Objekti ne smeju deliti memoriju. Pokazivači npr. utiču na
deljenje memorije od strane objekata.
4.
Svaki objekat pripada nekoj klasi.
5.
Svi objekti iste klase primaju iste poruke. Ovaj princip
potiče iz definicionog zahteva da svi objekti
iste klase imaju isto ponašanje.
Programski jezik C++
Programski jezik C++ se pojavio u periodu između 1980 i 1984 godine, kao o
bjedinjeno proširenje, ili kako
neki kažu
pojačanje programskog jezika C. Bjarne
Stroustrup je u stvari tvorac C++. Stvaranje ovog programskog
jezika imalo je i retroaktivno dejstvo na C, tako da C i C++ fakt
ički predstavljaju jedan jezik.
Definisanje klase u C++
Kada je u pitanju objektno programiranje najvažniji pojam oko koga se sve vrti jeste pojam klase i njihova
izgradnja. C++ za stvaranje klase ima posebnu naredbu
class
koja je
slična
struct
naredbi. Ovaj primer
pokazuje uopšten prikaz izgleda definicije klase:
D
efinicija se deli na dva dela, sastoji se od zaglavlja i tela modula tako
da se deklaracija funkcija-
članova nalazi u zaglavlju,
a definicija u
telu.
Bitno je napomenuti da po završetku deklarisanja klase mora
da stoji
„;“
inače nam kompajler neće prijaviti grešku vezanu za
tu
liniju već
spisak grešaka u linijama koje slede. Takođe postoji i jedno
pravilo da se imena funkcija, klasa i objekata pišu takozvanom kamel
notacijom tj da se ime svake nove reči u nazivu piše velikim slovom
pazeći pri tome
da je početno slovo za sva imena malo osim
za ime
klase koje počinje velikim početnim slovom.
Ova notacija je u Javi
obavezna dok je u C++ stvar navike.
Definisanje klase pokazaćemo sada na primeru dekartove tačke. Pravimo
klasu Point i tokom njenog definisanja mi tražimo način da je napravimo što
univerzalnijom da bi je i posle nas
programeri mogli koristiti ukoliko im zatreba.
Kao prvo osobine tačke jesu njene koordinate pa njih definišemo kao prodatak
-
član. Ali pored ovog
deskriptivnog dela objektni programer definiše i operacije nad tom tačkom. Pri pisanju metoda mi imamo
potpunu slobodu ali moramo da pazimo da repertoar bude dovoljan tj ni premali ni preveliki. Jer ako je metoda
premalo naićićemo na
problem da će nam neka operaci
ja u
sklopu rada sa tačkom zatreba
a mi je nećemo imati
tada na raspolaganju. Ovo shvatanje koliko metoda nam je potrebno dolazi sa iskustvom. Prvo zadajemo
vrednost za x i y tj objekat
dovodimo u neko početno stanje. Objekat je sintaksno vrlo sličan promenljivoj
. Kada
naredba u programu Point a,b počne da se izvršava zauzimaju se memorijske lokacije za objekte a i b sa po dve
double promenljive. Metoda
setPoint se vrši nad objektom i postavlja određene vrednosti za promenljive x i y.
Sledeća metoda getX služi da se očita abscisa. Ona vraća kao rezultat x koordinatu. Analogno tome funkcioniše i
funkcija getY. Sada sledi metoda distance koja je u stvari prototip funkcije koja je definisana van klase.
Takođe
dodela objekta objektu kao b=a je moguća između objekata iste klase.
class ImeKlase {
//podaci-
članovi
//objekti-
članovi
//funkcije-
članovi
};
ImeKlase::imeFunkcije {
//telo funkcije
}
Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti