Professional Documents
Culture Documents
yu
Bilo koji sistem se može posmatrati kao skup međusobno povezanih objekata. Pod
objektima u nekom sistemu se podrazumevaju fizički objekti, koncepti, abstrakcije, bilo šta
što ima jasne granice i jasno značenje, što se jasno razlikuje od drugih objekata u sistemu. U
realnom sistemu, objekti i način ostvarivanja njihovih veza mogu da budu veoma raznovrsni.
U nekoj vrsti modela realnog sistema svi ti raznovrsni objekti i njihove veze pretstavljaju se
sa određenim (malim) brojem precizno definisih koncepata. U softverskom inženjerstvu, ovi
koncepti treba da posluže, s jedne strane, za formiranje jasnog, preciznog i potpunog
modela realnog sistema (njegove specifikacije), a sa druge za implementaciju toga modela na
računaru. Ovde se nadalje definišu osnovni konceti modela u objektno orjentisanim (OO)
pristupima.
2.1. Objekat
U OO pristupima pod objektom se podrazumeva entitet koji je sposoban da čuva svoja stanja
i koji stavlja na raspolaganje okolini skup operacija preko kojih se ta stanja prikazuju ili
menjaju. Pod stanjem objekta se podrazumeva skup informacija o njegovoj prošlosti i
sadašnjosti koji je dovoljan da odredi njegovo buduće ponašanje (buduća stanja) pod
dejstvom definisanog skupa njegovih operacija. Drugim rečima neki objekat se opisuje
preko skupa operacija i skupa stanja koja čuvaju efekte tih operacija.
www.puskice.co.yu 3
www.puskice.co.yu
Operacije
Zapamti starost()
Prikaži starost()
Koračaj()
Igraj()
Skači()
Veze između objekata u sistemu se mogu tretirati kao stanja sistema, pa se i njima, u
učaurenom objektu, može pristupiti samo preko operacija.
Sa tačke gledišta njegovog korišćenja objekat se može tretirati kao “crna kutija”, samo preko
njegovog interfejsa - operacija. Međutim, u razvoju objektno orjentisanih sistema neophodno
je opisati i njegovu “unutrašnjost”, njegova stanja, odnosno atribute i veze sa drugim
objektima, kao i način implementacije njegovih operacija.
Isto tako, u jednom složenom sistemu postojaće mnoštvo objekata, pa bi i njihov direktan opis
bio veoma složen. Zbog toga je neophodno uvesti apstrakciju klasifikacije i definisati pojam
klase objekata kao skupa objekata sličnih karakteristika: atributa, veza sa drugim objektima i
operacija (ponašanja). U daljem tekstu se uvodi pojam klase, atributa, veza i načina izvođenja
operacija.
2.2. Klase
Kao što je rečeno klasa pretstavlja skup objekata sličnih karakteristika. Opisivanjem
(specifikacijom) klase opisuju se i svi objekti koji joj pripadaju. Imajući to u vidu može se
reći da je klasa definicija, odnosno “mustra” (temlejt) koja omogućava da se kreira novi
objekat koji joj pripada. Zbog toga klasa opisuje kako je objekat interno struktuiran, koji su
njegovi atributi i veze, a ne samo koje se operacije sa objektom mogu izvesti. Ponekad se
pojam klase i pojam tipa objekta izjednačuju. Kao što je ranije rečeno apstratktni tip objekta
se specifikuje samo preko operacija koje se sa njim izvode. Klasa, međutim, definiše i
unutrašnju strukturu objekta, pa se zato klasa može tretirati kao jedna (od više mogućih)
implementacija tipa objekta.
Objekat koji pripada nekoj klasi naziva se pojavljivanje klase. Ako se klasa tretira kao
“generator” sličnih objekata, pojavljivanje je objekat koji je kreirala neka klasa. Zato su
pojamovi pojavljivanja i objekta sinonimi.
www.puskice.co.yu 4
www.puskice.co.yu
Na Slici 2.1. prikazan je najednostavniji dijagram objekata i dijagram klasa koji prikazuje
odnos klase i njenih pojavljivanja (objekata).
Kao što se sa slike vidi klase se prikazuju pravougaonikom, pojedinačni objekti zaobljenim
pravougaonikom. U prikazu pojavljivanja objekta navodi se naziv klase u zagradi i naziv
objekta. Može postojati i objekat koji je anonimno pojavljivanje neke klase.
2.3. Atributi
Pod atridutom se podrazumeva osobina klase koja opisuje neku vrednost (stanje, informaciju)
koju će sadržavati svaki objekat posmatrane klase. Na primer, atributi klase Osoba su Ime,
Starost, Težina i slično.
Svako ime atributa je jedinstveno u okviru klase. Drugim rečima i klasa Osoba i klasa
Preduzeće mogu imati atribut Adresa.
Atribut treba da bude “čist podatak” koji nema svoj identitet, a ne objekat (koji ga ima). Na
primer sva pojavljivanja celog broja 17 su ista, nerazlučuva, pa samim tim nisu objekti.
www.puskice.co.yu 5
www.puskice.co.yu
Svaka operacija ima “pozvani” objekat kao implicitni argument. Ponašanje operacije zavisi
od klase kojoj “pozavni” objekat pripada. Objekat “zna” svoju klasu, pa samim tim i način
implementacije posmatrane operacije. Osobina da objekat poziva neku operaciju drugog
objekta ne znajući kojoj klasi ovaj objekat pripada naziva se polimorfizam. Drugim rečima,
operacija koja se može primeniti na različite klase i koja u njima ima različit oblik naziva se
polimorfnom.
Pored “pozvanog” objekta koji je implicitni argumment, operacija može imati i eksplicitne
argumente. Isto tako se može definisati i tip rezultata koje ona daje. Svi argumenti i isti tip
rezultata se moraju pojaviti u svim metodama date operacije.
Operacije se navode u trećem delu pravougaonika za opis objekata. Iza imena operacije mogu
se navesti argumenti u zagradama i tip rezultata iza “:”. I za argumernte se mogu navesti
tipovi. Prazna lisata argumenata u zagrdama eksplicitno pokazuje da nema dodatnih
argumenata. Ako argimenti uopšte nisu navedeni, to znači da operacija još nije detaljno
specifikovana.
Na Slici 2.3. prikazni su primeri specifikacije klasa sa sva tri dela pravougaonika: (1) Naziv
klase, (2) Atributi i (3) Operacije.
www.puskice.co.yu 6
www.puskice.co.yu
Na slici 2.4. je data je ukupna notacija za klase, u sva tri dela njene grafičke predstave. U
prvi fazama razvoja nekog modela može se definisati samo naziv klase, zatim neki njeni
atributi samo sa imenima, bez ostalih detalja, zatim samo neke operacije, bez posebnih
detalja, a na kraju razvoja modela daju se svi detalji sa slike 2.4. Ako se ne pretstavlja atributi
i/ili operacije mopuće je na šemi prikazati pravouganik sa samo jedim ili samo dva dela, a
moguće je, u tim slučajevima, prikazati i sva tri, ostavljajući prazne pojedine delove.
Ime-klase
Neke druge vrste vidljivosti, kao što je implemetaciona u C++ se mogu opisati preko iskaza
osobina. Iskaz osobina je izraz u nekom korisnički definisanom jeziku za iskazivanje osobina
www.puskice.co.yu 7
www.puskice.co.yu
Postoje dve osnovne vrste odnos između objekata, odnosno klasa u sistemu: asocijacija i
generalizacija.
2.6.1. Asocijacija
Pod pojmom “veza” (link) podrazumeva se fizička ili konceptualna veza pojavljivanja
objekata. Na primer, Bora radi u “Razvoju”. Veza se formalno definiše kao n-torka,
odnosno uređena lista pojavljivanja.
Asocijacije pretstavljaju dvosmerne veze. Po pravilu, asocijaciji se daje samo jedno ime
koje izražava vezu u jednom smeru, inverzno ime se podrazumeva, a mogu se koristiti oba
smera asocijacije. (U nekim implementacijama, ako se asocijacija implementira preko
pokazivača, ostvaruje se samo jednosmerna veza. Međutim u specifikaciji sistema ona se
ovek posmatrana kao dvosmerna). Ne moraju asocijacije, odnosno veze imati naziv ako je ta
asocijacija jedina asocijacija posmatranih klasa i ako je naziv asocijacije očigledan.
Na Slici 2.5. dat je primer asocijacije i odgovarajućih veza. Jedna zemlja ima jedan i samo
jedan glavni grad, a jedan glavni grad je glavni grad jedne zemlje.
www.puskice.co.yu 8
www.puskice.co.yu
Na Slici 2.6. prikazane se asocijacije i veze tipa više-više. Model pretstavlja odnos linija i
njihovih presečnih tačaka. Jedna linija može da ima nula, jednu ili više presečnih tačaka, a
jedna tačka je presečna tačka barem 2 ili više linija.
Mogu se prikazivati ne samo binarne, nego i višestruke asocijacije klasa, odnosno veze
objekata. Međutim, ovakve vrste asocijacija se mnogo teže razumevaju (crtaju i
implementiraju), pa ih treba izbegavati. Na Slici 2.7. prikazan je primer ternarne asocijacije,
koja pokazuje koje je programske jezike, za koje projekte koristio neki programer. Simbol za
višestruke asocijacije i veze je romb (diamond).
www.puskice.co.yu 9
www.puskice.co.yu
Postoje i grafičke oznake za određenu vrstu multipliciteta. Zvezda (*) označava “više”, što
znači nula, jedan ili više. Linija bez ikakvog simbola za multiplicitet označava vezu “jedan
prema jedan”, iako bi po pravilu trebalo staviti 1 sa obe strane asocijacije. Multiplicitet se
upisuje uz klasu na koju se odnosi, odnosno uz klasu čija se pojavljivanja pridružuju jednom
pojavljivanju druge klase.
Atributi veza. Atribut veze može da posluži da iskaže osobine veze koja je pojavljivanje
posmatrane asocijacije. Svaki atribut veze ima vrednost za svaku vezu. N a Slici 2.8.
prikazan je atribut veze za asocijaciju Može-da-prisatupi tipa “više prema više” između klasa
Fajl i Korisnik. Atributi veza imaju smisla prvenstveno za asocijacije “više prema više”.
Moguće ih je definisati i za asocijacije tipa “jedan prema više” (Slika 2.9), pa i za asocijaciuje
“jedan prema jedan”. Međutim, očigledno je da se u ovim slučajevima atributi mogu
pridružiti jednoj od klasa (klasi koja ulazi u asocijaciju sa multiplicitetom 1), kako je to
ilustrovano na Slici 2.10. Međutim, u tom slučaju se gubi semantika u modelu, a i
eventualne promene u multiplicitetu asocijacije više nisu moguće.
www.puskice.co.yu 10
www.puskice.co.yu
Asocijacija kao klasa. Ponekad je korisno asocijaciju modelirati kao klasu. Pojavljivanja ove
klase su veze (linkovi) između objekata. Ako se želi da asocijacija ima svoje sopstvene
operacije i da sa drugim klasama formira nove asocijacije, tada posmatranu asocijaciju treba
modelirati kao klasu. Na slici 2.11. prikazan je način modeliranja asocijacije kao klase.
Korisnik može da bude autorizovan na više radnih stanica. Svaki korisnik na nekoj radnoj
www.puskice.co.yu 11
www.puskice.co.yu
stanici ima određene privilegije i prioritet. Korisnik ima svoj direktorijum na svakoj za njega
autorizovanoj radnoj stanici i može da pokreće neke sesije sa podacima u tim
direktorijumima. Preko ovog koncepta pogodnije je prikazivati višestruke asocijacije nego na
način prikazan ranije.
Uloga objekata u asocijaciji. Naziv asocijacije dve klase obično jasno definiše ulogu svakog
objekta u odgovarajućoj vezi. Međutim ponekad, posebno kod većeg broja asocijacija između
istih klasa i kod rekurzivnih asocijacija (asocijacija koje pretstavljaju apstrakciju veza između
objekata iste klase), za potpuno razumevanje je neophodno naznačiti i ulogu obejkta u
asocijaciji. U svakoj binarnoj asocijaciji definišu se dve uloge. Formalno, uloga pretstavlja
naziv preslikavanja sa jedne klase objekata na drugu, u posmatranoj asocijaciji klasa. Na
slikama 2.12 i 2.13 ilustrovan je koncept uloge i prikazan način njenog pretstavljanja na
dijagramu klasa.
www.puskice.co.yu 12
www.puskice.co.yu
Uloga se može takođe tumačiti i kao izvedeni atribut odgovarajuće klase, atribut koji uzima
vrednost iz druge klase objekata.
Kvalifikacija. Pojedine asocijacije se mogu kvalifikovati preko nekog atributa (koji se naziva
kvlifikator) i time smanjiti multiplicitet asocijacije i samim tim učiniti je semantički
bogatijom. Primer korišćenja kvalifikatora ilustrovan je na slici 2.14. Pretpostavlja se da
jedan direktorijum sadrži više fajlova i da se jedan fajl nalazi samo u jednom direktorijumu.
Sa kvalifikatorom “naziv fajla” uz Direktorijum tačno se referencira jedan fajl u direktorijumu
i time multiplicitet “više” redukuje na “multipliplicitet 1”. Na slici 2.15 pokazuje se kako se
preko atributa ID-pred, multiplicitet “više” svodi na “jedan” i time omogućava direktan
pristup preduzeću u okviru berze.
Slika 2.15.
Dva objekta koja se nalaze u vezi tipa agregacije imaju uloge sklopa i dela. Na slici 2.16 i
2.17 prikazani su primeri agregacije. Mali romb u asocijaciji tipa agegacije stoji uz klasu
koja ima ulogu sklopa. Postavlja se pitanje da li i kada treba koristiti koncept agregacije?
Dok ne postoje zajedničke osobine delova koje se mogu pridružiti sklopu (atributi i
operacije) ovaj koncept ne treba koristiti. Možda je uvek najpovoljnije koristite oblik tzv
“rekurzivne agregacije prikazan na slici 2.18. za primer entiteta koga nazivamo opštim
www.puskice.co.yu 13
www.puskice.co.yu
imenom Proizvod koji može imati podtipove Sklop i Prost deo. Sklop je agregacija drugih
Proizvoda, bilo sklopova ili prostih delova. (Ovde je korišćen koncept podtipa, odnosno
generalizacije koji će biti objašnjen docnije.
Mnoge klase imaju iste osobine (atribute i operacije). Na primer, bilo koji deo opreme u
preduzeću ima registarski broj, proizvođača, cenu i slično. Očigledno je da postoji potreba da
se zajedničke karakteristike nekih objekata različitih klasa skupe i pretstave jedinstvenom
klasom, a da polazne klase “naslede“ ove zajedničke atribute. Generalizacija je odnos klasa
www.puskice.co.yu 14
www.puskice.co.yu
koji ovo omogućuje. Klasa u kojoj su skupljene zajedničke osobine naziva se nadklasa, a
klase koje nasleđuju osobine nadklase i dodaju neke svoje specifične se nazivaju podklase.
Generalizacija se često naziva i “is-a” odnos klasa, jer pokazuje da pojavljivanje podklase
istovremeno i pojavljivanje nadklase.
www.puskice.co.yu 15
www.puskice.co.yu
www.puskice.co.yu 16
www.puskice.co.yu
www.puskice.co.yu 17
www.puskice.co.yu
www.puskice.co.yu 18
www.puskice.co.yu
Metaklase i deskriptori klasa. I sam klasa se ponekad (u nekim programskim jezicima) može
tretirati kao objekat, odnosno kao pojavljivanje neke druge klase. Ta “klasa klasa” naziva se
metaklasa. Ona ima svoje atribute i svoje objekte. U nekim OO jezicima postoji samo jedna
meta klasa i sve druge klase su pojavljivanje ove klase. U drugim, svaka klasa ima svoju meta
klasu.
Umesto pojma metaklasa neki jezici dozvoljavaju tzv. deskriptore, odnosno atribute klasa i
operacije nad klasama. Atributi klase su atributi jedinstveni za sve objekte u klasi. Operacije
klase su operacije nad samom klasom, a ne nad njenim pojavljivanjima. Očigledno je svaka
klasa mora imati operaciju new ili create za kreiranje novog pojavljivanja date klase. Atributi
i operacije koji se standardno navode u opisu klasa su atributi i operacije nad pojavljivanjima
te klase. Zbog toga je deskriptore potrebno u opisu klase posebno označiti (sa oznakom, $, ili
podvlačenjem, što je preporuka UML-a) Na slici 2.24. dat je primer opisa klase sa
deskriptorima.
2.7. Ograničenja
Pod ograničenjima se podrazumeva ograničenja na vrednosti koje neki entiteti (objekti, klase,
atributi, veze, asocijacije) u OO modelu mogu da dobiju. Na primer: Plata radnika ne može da
bude veća od plate njegovog rukovodioca. Cilj je da se ograničenja iskazuju deklarativno,
prikažu na OO modelu i kasnije, po mogućstvu automatizovano, prevedu u procedure za
implementaciju pojedinih operacija.
Dobar OO model treba da ima relativno malo dodatnih ograničenja jer je najveći deo
semantike sistema obuhvaćen njegovom strukturom.
Mogu se definisati različite vrste ograničenja. Ranije je, na slici 2.4., dat način prikazivanja
ograničenja na atribute. Nadalje se prikazuju neka složenija ograničenja. Za sve njih važi
opšte pravilo da se ograničenja daju kao iskaz osobina (u nekom korisnički definisanom
jeziku za iskazivanje osobina pojedinih koncepata) u velikim zagradama.
www.puskice.co.yu 19
www.puskice.co.yu
Ograničenja na veze. Multiplicitet je jedna vrsta ograničenja - ograničava broj objekata jedne
klase koji se pridružuje jednom objektu druge klase u datoj vezi. Pored toga kao ograničenje
na vezu koristi se i uređenje, preko ključnje reči ordered. Ako drugačije nije navedeno,
podrazumeva se hronološko uređenje, po redosledu kreiranja.
Opšta ograničenja. Pod opštim ograničenjima podrazumevaju se ograničenja koja vezuju više
entiteta modela (više klasa, asocijacija ili slično). Za tu vrstu ograničenja pogodno je povezati
posmatrane linije na modelu crtkastom linijom i uz nju napisati iskaz ograničenja (Slika 2.27).
Ako nije pogodno povlačiti crtkastu liniju ograničenje se može samo odgovarajućim iskazom
u kome su navedeni entiteti na koje se ograničenje odnosi (u jeziku za definisanje iskaza
osobina).
Izvedeni objekti, veze i atributi. Ponekad je na samom OO modelu pogodno pretstaviti neke
izvedene koncepte, pogotovo ako oni pretstavljaju semantički značajne entitete realnog
sistema. Izvedeni koncepti se označavaju kosom (dijagonalnom) linijom, a samo izvođenje se
definiše preko iskaza ograničenja. Na slici 2.28. Na slici 2.29 prikazani su izvedena
asocijacija UkupniOtklon i izvedena klasa Otklon. Pretpostavlja se da je mašina sastavljena
od sklopova i da je za svaki sklop dat otklon u odnosu na koordinatni sistem u kome se
definiše položaj mašine. Isto tako, svaki sklop se sastoji od delova, a njihov položaj je dat u
odnosu na koordinatni sistem sklopa. Klasa Otklon daje ukupni otklon svakog dela u odnosu
na položaj mašine.
Osoba
datum ro| Datum
/starost
starost=Datum - datum_rođć
www.puskice.co.yu 20
www.puskice.co.yu
U sledećem delu će se razmotriti način realizacije nekih osnovnih OO koncepata. Kao tipičan
predstavnik OO jezika će se koristiti jezik C++, a primer na kome će se ilustrovati način
realizacije OO koncepata je model za uprošćen grafički editor.
Na slici 2.30 je prikazan objektni model za uprošćen grafički editor. Grafički editor
omogućava izradu crteža koji se sastoji od pravougaonika i krugova. Editor omogućava
kreiranje novih simbola kao i brisanje i pomeranje selektovanih simbola. Selekcija simbola se
vrši pozicioniranjem kursora u okviru željenog simbola. Moguće je selektovati više simbola
istovremeno sa posebnom komandom za uključivanje simbola u selekciju, tj . dodavanje u
skup trenutno selektovanih simbola.
www.puskice.co.yu 21
www.puskice.co.yu
Crtez
duzina
sirina
dodaj_krug
dodaj_pravougaonik
dodaj_u_selekciju
iscrtaj
izbrisi_selekciju
pomeri_selekciju
selektuj_simbol
Simboli Selekcija
Simbol
x
y
izabran
izbrisi
nacrtaj
pomeri
prikazi
Pravougaonik Krug
sirina poluprecnik
visina izabran
izabran prikazi
prikazi
class Crtez
š
public:
// konstruktor ima isto ime kao i klasa
Crtez(int duz, int sir);
// destruktor ima isto ime kao i klasa;
čCrtez()
void dodaj_krug(int pozX, int pozY, int r);
void dodaj_pravougaonik(int pozX, int pozY, int sirina, int visina);
void iscrtaj_crtez();
void selektuj_simbol(int kursorX, int kursorY);
void pomeri_selekciju(int deltaX, int deltaY);
void izbrisi_selekciju();
private:
int duzina;
int sirina;
void dodaj_u_selekciju(Simbol *s);
ć
U C++ atributi i operacije (metode u C++ terminologiji) neke klase se nazivaju članovima
date klase i njihova imena moraju biti jedinstvena. Posebne metode za kreiranje i uništavanje
objekta date klase, tzv. konstruktor i destruktor, moraju imati isti naziv kao i klasa.
www.puskice.co.yu 22
www.puskice.co.yu
Svi atributi u ovom primeru su privatni jer proizvoljna izmena atributa crteža nije dozvoljena.
Uopšteno govoreći, dobra je programerska praksa držati atribute privatnim a pristup njima
obezbediti preko operacija, jer se time sprečava da oni koji koriste datu klasu postanu zavisni
od detalja implementacije klase. Sve operacije u prethodnom primeru su javne, izuzev
operacije dodaj_u_selekciju koja se koristi u implementaciji ostalih javnih metoda.
U primeru je izostavljana deklaracija veza koje klasa crtež ima sa drugim klasama.
Implementacija veza se razmatra u posebnom odeljku.
OO jezici kreiraju objekat na jedan od dva načina. Neki jezici, kao npr. Smalltalk, klase
tretiraju kao punopravne objekte. U njima, specijalna operacija nad objektom klasom kreira
novi objekat (instancu) date klase. Drugi jezici, kao npr. C++, nemaju klase kao objekte. U
njima postoje posebne jezičke naredbe (operatori) za kreiranje objekata.
Prilikom kreiranja objekta, mora se alocirati memorijski prostor za vrednosti atributa objekta
kao i dodeliti jedintven identifikator objekta, bilo da je to adresa alociranog memorijskog
prostora bilo indeks u tabeli kreiranih objekata. OO jezici oslobađaju programera svih ovih
detalja oko alociranja memorijskog prostora za objekte.
Objekti koji više nisu potrebni se uništavaju i tom prilikom se vrši oslobađanje alociranog
memorijskog prostora. OO jezici koriste dva stila (strategije) za uništavanje objekata. U
nekim jezicima programer eksplicitno sa posebnom operacijom zahteva uništavanje objekta.
U tom slučaju, programer mora voditi računa da ne postoje reference (pokazivači) u drugim
objektima na uništeni objekat. Obzirom da je kod ovog načina vrlo lako napraviti grešku, neki
jezici imaju tzv. skupljač smeća (garbage collector) koji automatski uništava sve objekte koji
više nisu potrebni, bez eksplicitnog zahteva od strane programera.
U C++ postoji posebna operacija, tzv. konstruktor, koja vrši inicijaliziaciju kreiranog objekta
neke klase. Naziv ove metode je isto kao i naziv klase. Na primer, konstruktor klase Crtež je:
Crtez::Crtez(int duz, int sir)
š
duzina = duz;
sirina = sir;
ć
U C++ je moguće imati višestruke konstruktore, koji se međusobno razlikuju po broju i tipu
argumenata (ovo je primer tzv. prepunjavanja operacija- overloading). Na primer, mogli smo
definisati i sledeći konstruktor:
Crtez::Crtez()
š
duzina =50; // difolt duzina
sirina = 30; // difolt sirina
ć
Konstruktor se izvršava svaki put kada se kreira nova instanca klase, tj. objekat. U vreme
kreiranja objekta, programer može specificirati koji konstruktor se koristi za inicijalizaciju
objekta.
www.puskice.co.yu 23
www.puskice.co.yu
C++ poseduje tri vrste memorijske alokacije za objekte: alokacija od strane kompajlera u
fiksnoj globalnoj memoriji (tzv. statična alokacija), alokacija na staku (automatska alokacija)
i alokacija iz slobodnog memoriskog prostora (dinamička alokacija).
Lokalne promenljive u okviru funkcija (deklarisane bez static ključne reči) koriste automatsku
alokaciju. Po ulasku u funkciju, na staku se alocira memorija za sve lokalne promenljive date
funkcije. Po završetku izvršavanja funkcije alociran memorijski prostor na staku se oslobađa.
Zbog toga, ne smeju postojati reference (pokazivači) na automatski alocirane objekte u
objektima čiji životni vek traje duže od izvršavanja pozvane funkcije. Deklaracija lokalnih
promenljivih je ista kao i za globalne, samo što se deklariše unutar tela funkcije.
Svaka klasa poseduje jedan destruktor. Destruktor je operacija koja vrši neko “pospremanje”
neposredno pre nego što će se dati objekat uništiti. Ova operacija nema argumenata, a u svom
nazivu ima prefiks č (tilda) ispred naziv klase:
Crtez::čCrtez()
š
// npr. zatvori prozor na ekranu, jer crtez vise ne postoji
ć
Po završetku zadnje naredbe funkcije (tj. u trenutku izlaska iz funkcije), destruktor za svaku
lokalnu promenljivu se automatski poziva. Nakon toga se prostor za alocirane promenljive
oslobađa i stak se inicijalizuje na pređašnje stanje.
Dinamički alociran objekat može nadživeti funkciju iz koje je kreiran. Ovakav objekat može
biti uništen samo na eksplicitan poziv operatora delete kome se kao argument prosledjuje
pokazivač na objekat. Operator delete prvo poziva destruktor, a zatim oslobađa memorijski
prostor za dinamički alociran objekat:
delete pokazCrtez;
U većini OO jezika, svaka operacija ima jedan implicitan argument, ciljni objekat nad kojim
se data operacija izvršava. Operacije mogu ali ne moraju imati dodatne argumente. Argumenti
mogu biti samo za čitanje (prenosi se vrednost) ili za ažuriranje (prenosi se referenca).
www.puskice.co.yu 24
www.puskice.co.yu
Dodatni argumenti operacije mogu biti drugi objekti, vrednosti ugrađenih tipova (int, float,
char, ...) ili korisnički definisanih tipova.
Kada se naziv atributa ili operacije koristi kao identifikator u okviru C++ metode,
podrazumeva se da se oni odnose na atribute i opercije objekta čije je to metoda. U sledećem
primeru X i Y su atributi objekta klase Simbol:
Simbol::pomeri(int deltaX, int deltaY)
š
x = x + deltaX;
y = y + deltaY;
ć
Implicitan argument this sadrži referencu na ciljni objekat (on se obično predeje kao argument
drugim operacijama). Prethodni kod se mogao napisati i na sledećei način:
Simbol::pomeri(int deltaX, int deltaY)
š
this->x = this->x + deltaX;
this->y = this->y + deltaY;ć
U većini jezika, deklaracija klase podrazumeva i listu nadklasa od kojih se nasledjuju atributi i
operacije. U C++ podklasa se naziva još i izvedena klasa. C++ kod za deklarisanje klase
Simbol i njenih podklasa Pravougaonik i Krug je sledeći:
class Simbol
š
public:
void izbrisi() = š prikazi(BOJA_POZADINE); ć
virtual Boolean izabran(int lokacijaX, int lokacijaY) = 0;
void nacrtaj() = š prikazi(NORMALNA_BOJA); ć
void pomeri(int deltaX, int deltaY);
virtual void prikazi(Boja boja) = 0;
protected:
int x;
int y;
ć
www.puskice.co.yu 25
www.puskice.co.yu
Metode deklarisane u nadklasama se takođe nasledjuju. Ako metoda može biti prejahana
(overridden) od strane podklase, onda ona mora biti deklarisana sa ključnom reči virtual. Na
primer metoda prikazi klase Simbol može biti prejahana od strane podklasa. Metoda
Simbol::prikazi je takođe i inicijalizirana na 0. Ovo označava tzv. čistu virtuelnu funkciju
(pure virtual function), tj. apstraktnu metodu koja nema implementaciju. Klasa koja ima bar
jednu čistu virtuelnu funkciju je apstraktna klasa i ne može se instancirati direktno. Kompajler
proverava da li su sve konkretne podklase implementirale apstraktne operacije. Virtuelene
operacije se pozivaju na isti način kao i nevirtuelne.
Nadklase neke klase se mogu deklarisati kao javne ili privatne. Ukoliko je nadklasa privatna,
onda korisnici klase ne mogu koristiti nasledjene operacije i atribute, već isključivo operacije
i atribute date klase. Korisnici klase ne vide da je to zapravo podklasa i da nasledjuje atribute i
operacije (nasledjivanje je privatna stvar date klase). Sakrivanje nasledjenih operacija može
poslužiti da se definiše nasledjivanje zbog čisto implementacionih razloga, tamo gde stvarna
generalizacija objekata ne postoji. Ovo se ne preporučuje i smatra se lošom praksom.
C++ podržava višestruko nasledjivanje, specificiranjem više klasa u listi nadklasa. Upotreba
konfliktnih imena atributa i operacija iz nadklasa nije dozvoljena.
Atribut koji implementira vezu u smeru kardinalnosti “jedan” se realizuje prosto kao
pokazivač na povezani objekat. Atribut u smeru kardinalnosti “više” mora sadržati reference
www.puskice.co.yu 26
www.puskice.co.yu
na više objekata i on se realizuje kao skup pokazivača na objekte ili eventalno kao niz
pokazivača, ako je veza uredjena (sortirtana). Skup pokazivača se najčešće implemntira preko
neke standardne klase za kolekciju objekata koja je definisana u standardnoj biblioteci klasa
datog programskog jezika. Ove standardne klase su najčešće parametrizovane, ako dati
programski jezik podržava definisanje parametrizovanih klasa (klasa u kojima tip atributa ili
tip argumenta operacije može biti parametar). Na taj način se može definisati atribut kao skup
elementa tačno odredjenog tipa, a da se ne moraju implementirati operacije za rad sa skupom.
Ukoliko u programskom jeziku ne postoje parametrizovane klase, tada se ili koristi uopšteni
skup bilo kojih elemenata (što stvara probleme kod rada sa takvim skupom) ili se mora svaki
put implementirati konkretan skup u celosti.
U imlementaciji veze se javlja još jedan dodatan problem. Obzirom da se veza implementira
preko dva atributa (ako izuzmemo slučaj jednosmernih veza), povezivanje i razvezivanje
preko veze zahteva istovremeno ažuriranje oba ova atributa. Ovo u stvari zahteva narušavanje
principa učaurenja objekata, jer se mora dozvoliti ažuriranje atributa jednog objekta od strane
operacije onog drugog kojom se održava veza. Naravno, može se atribut definisati kao javan,
ali tada bilo koji objekat može pristupati takvom atributu. Zbog toga, neki jezici, kao što je
npr. C++, dozvoljavaju relaksaciju principa učaurenja koristeći konstrukciju friend (prijatelj).
Klase ili operacije kojima se želi dozvoliti pristup privatnim atributima neke klase se definišu
kao prijatelji date klase. Konkretno za slučaj implemetacije veze, operacija koja održava vezu
se u takvim jezicima definiše kao prijatelj klase koja poseduje vezni atrubut.
Primer implementacije veze Simboli izmedju klasa Crtez i Simbol za naš primer grafičkog
editora u jeziku C++ izgleda ovako:
class Simbol
š
// definicije atributa i operacija kao i pre
private:
// implementacija veze Simboli u pravcu Simbol -> Crtez (kardinalnost “jedan”)
Crtez * crtez;
// prijateljske operacije klase Crtez kojima se odrzava veza
friend void Crtez::dodajSimbol(Simbol * s)
friend void Crtez::izbaciSimbol(Simbol *s)
public:
Crtez * DajCrtez() š return crtez; ć;
ć
class Crtez
š
// definicije atributa i operacija kao i pre
private:
// implementacija veze Simboli u pravcu Crtez ->Simbol (kardinalnost “vise”)
SkupSimbla * simboli;
// implementacija operacija za povezivanje i razvezivanje
void dodajSimbol(Simbol *s);
void izbaciSimbol(Simbol *s);
SkupSimbola * dajSimbole() š return simboli; ć
ć
www.puskice.co.yu 27
www.puskice.co.yu
Operacije dodajSimbol i izbaciSimbol mogu da ažuriraju privatni atribut crtez klase Simbol jer
su deklarisane kao prijateljske operacije.
Klasa SkupSimbola koja se koristi za definiciju atributa simboli u klasi Crtež je u stvari
stnadradna klasa za kolekciju objekata. U C++ bi se ona mogla prosto definisati preko
standardne parametrizovane klase Set kao:
typedef Set<Simbol> SkupSimbola;
Nad ovim klasom Set su definisane operacije add i remove koje su korišćene u implementaciji
operacija dodajSimbol i izbaciSimbol.
www.puskice.co.yu 28
www.puskice.co.yu
Objektne baze pokušavaju da navedene probleme reše na taj način što će se formirati baza
poidataka kao skup "perzistentnih objekata" objekata koji se ni po čemu ne razlikuju od
objekata ostalih delova programskog sistema, osm što imaju karakteristiku perzistentnosti,
odnosno postoje (u bazi podataka) i posle okončanja izvršenja programskog sistema.
Slika 2.31 ilustruje razliku između RSUBP-a i OSUBP-a pri obradi složene strukture
podataka. U relacionom sistemu, baza podataka je skup tabela, aplikacija i baza podataka
komuniciraju preko tabela, pa je u okviru same aplikacije neophodno izvršiti transformaciju
strukture u tabele pri ažuriranju baze, odnosno skupa tabela u strukturu, pri korišćenju objekta
iz baze. Očigledno je da tih promblema u objektnim bazama nema: komunikacija je direktna,
pošto su strukture i persistentnog objekta i "prolaznog" ("aplikativnog") iste.
Aplikaciona struktura
podataka
Prenos
Prenos sa
transformacijom
RDBMS ODBMS
Međutim, postoje još mnogu nerešeni problemi ODBMS-a i od kojih su sledeća dva ključna:
Koncept objekta i načina stvarivanja veza između objekata u objektnim modelima nije
pogodan za realizaciju upitnih jezika. Pod upitnim jezikom se podrazumeva
neproceduralni (deklarativni) jezik kojim se korisnik direktno, van unapred
definisanih aplikacija, obraća bazi podataka. Naravno, i same aplikacije treba da
koriste jednostavne upitne jezikae za pristu bazi podataka. Relacioni modeli su
www.puskice.co.yu 29
www.puskice.co.yu
Zbog svega ovoga očigledno je da je pored čisto relacionih i čisto objektnih SUBP-a,
neophodno razvijati i relaciono-objektne sisteme koji će objediniti dobre osobine oba
pristupa. Na Slici 2.32 ilustuju se osnovne razlike dva pristupa i potreba za objedinjenim
razvojem.
Objektne baze
Bez upitnog Sistem datoteka
podataka
jezika
Slika 2.32. Prikaz odnosa RDBMS i ODBMS prema upitnim jezicima i kompleksnim
strukturama podataka.
Bazični koncepti objektnog modela su objekat i literal. Definicija objekat je ista kao i ranije,
a pod literalom se podrazumeva podatak (vrednost).
U objektnim bazama podataka se insistira na razlici koncepata tipa i klase objekata. Zbog
toga se uvodi i pojam interfejsa. Naime, pod tipom se podrazumeva kategorija objekata ili
literala koji imaju isti skup stanja (ili preciznije koordinata stanja). Neki konkretan objekat
se tretira kao pojavljivanje tipa. Tip objekta se definiše sa dva aspekta: (1) kao jedan
interfejs preko koga se definišu spoljne karakteristike objeketa toga tipa i (2) kao jedna ili više
klasa koje pretstavljaju različite implementacije datog tipa.
www.puskice.co.yu 30
www.puskice.co.yu
U OSUBP se uvodi pojam proširenja (extents) tipa. Proširenje tipa je skup svih njegovih
pojavljivanja. U RSUBP se kao proširenje realacije može tretirati tabela i ona se uvek čuva u
bazi podataka. Za razliku od RSUBP u OSUBP projektant može da odluči da li će se
automatski formirati i čuvati u bazi proširenje datog tipa. Kada se kreira proširenje, moguće
ga je ubacivati i iz njega izbacivati pojavljivanja. Isto tako, nad proširenjem je moguće
kreirati indekse, za potrebe ubrzavanja pretračivanja.
Život objekta definiše kako se memorija pridružje nekom objektu. Život objekta može biti:
(1) Transient (prolazan), kada se objektu pridružuje memeorija kojom upravlja program.
To znači da objekat postoji samo za vreme obavljanja programa u kome je definisan. (2)
Persistent (persistentan, stalan) je pridružen memoriji (i spoljnoj) kojom upravlja SUBP. On
nastavlja da egzistira i posle okončanja programa koji ga koristi. Važno je naglasiti da jedan
tip može imati neka pojavljivanja koa persistentne, a neka pojavljivanja kao prolazne objekte.
U OSUBP postoji koncept atomskog objekta, koje uvek definiše korisnik opisivanjem
njegovog imena, svojstava i operacija. Pored atomskog definiše se i koncept objekata
kolekcije (colection objects). Objekti kolekcije su predefinisani i mogu biti:
Set<t>, neuređeni skup elemenata, bez duplikata,
Bag<t>, neuređeni skup elemenata sa mogućim duplikat
List <t>, uređena kolekcija elemenata
Array<t>, uređena kolekcija fiksnog broja elementa, u kome se
definiše položaj elementa
Literali se od objekata razlikuju samo po tome što nemaju svoj identifikator. Mogu da budu:
www.puskice.co.yu 31
www.puskice.co.yu
Kao što je rečeno, stanje objekta, odnosno svojstva objekta su atributi i veze (Relationships).
Vrednost atributa je ili literal (na primer string za atribut ime) ili identifikator objekta, (na
primer Odelenje za atribur Radi_u). Međutim, treba imati u vidu da je atribut apstrakcija koja
se realizuje bilo preko strukture podataka, bilo preko operacija (metoda). Primer definisanja
atributa je:
interface Lice š
attribute short starost;
attribute string ime;
attribute Odelenje Radi_u;
attribute set<Brojevi_tel> telefoni;
ć;
Model u OSUBP podržava samo binarne veze. Podrazumeva se da je veza obostrana. Ako se
u opisu jednog objekta definiše veza(preslikavanje) prema nekom objektu, u drugom se mora
pmoću ključne reči inverse definisati inverzna veza (preslikavanje). Na primer,
intreface Nastavnik š
.........
relationship Set <Predmet> predaje
inverse Predmet :: predavan;
.......
ć;
intreface Predmet š
.........
relationship Nastavnik predavan
inverse Nastavnik :: predaje;
.......
ć;
Primer objektne baze. Na Slici 2.33 dat je Objektni model jednog Sistema, a zatim je
delimično dat opis šeme baze podataka u OSUBP.
www.puskice.co.yu 32
www.puskice.co.yu
www.puskice.co.yu 33
www.puskice.co.yu
interface Radnik
( extent radnici
keys mlbr )
š
attribute String mlbr;
attribute String ime;
void zaposli_se ();
void otpusti_se () raises (nema_takvog_radnika);
ć;
interface Student
( extent studenti
keys broj_ind )
š
attribute String broj_ind;
attribute String ime ;
relationship Set <Sekcija> upisan
inverse Sekcija :: slušaju;
Boolean registrovanje_za_kurs (In Usigned Short predmet, In Unsigned Short
sekcija) raises (nema-uslova, popunjena_sekcija, popunjen_predmet);
void ispiši_se (In Usigned Short predmet) reises (nije_upisan);
ć;
Upitni jezik. I pored toga što nije najprirodnije i za objektne modele se može definisati upitni
jezik. Upitni jezici u objektnim modelima zasnovani su na upitnim jezicima nad
nenormalizovanim (NFNF ) relacijama. Jedan takv jezik je detaljnije objašnjen u materijalu
za Prošireni model objekti-veze. U odnosu na relacioni model, pored promenljivih koje
www.puskice.co.yu 34
www.puskice.co.yu
SELECT
FROM
WHERE
SELECT x.ime
FROM Student x
WHERE x.broj_ind = '22/97';
odnosno nenormalizovana tabela sa imenima studenata, opisima svih sekcija koje student
sluša i imenima svih nastavnika koji drže svaku pomenutu sekciju. (Rezultat je SET ako se
koristi klauzula DISTINCT, a BEG ako se ona ne koristi).
Napomenimo, još, da se operacije ažuriranja baze ne izvode kroz upitni jezik, već
proceduralno preko operacija navedenih uz pojedine objekte.
Relacije (tabele) koje čine konvencionalnu realcionu bazu podataka su normalizocane (ravne
strukture), sa jedostavnim predefinisanim tipovima podataka nad kojima su definisani njihovi
atributi. Ovakva struktura relacionih tabela značajno ograničava i usložnjava kompleksnije
upite i kompleksniju obradu podataka. Da bi se ovaj nedostatak otklonio, u objektno-
relacionim sistemima se uvodi:
www.puskice.co.yu 35
www.puskice.co.yu
Upit "Prikaži imena radnika koji staniju u krugu prečnika 1km od definisanog radnika (Ace)
može se napisati na sledeći način:
SELECT r.ime
FROM radnik r, radnik j
WHERE j.ime = 'Aca' AND
(j.koord_x - r.kkord_x) ** 2 + (j.koord_y - r.kkord_y) ** 2 < 1;
Ovakav upit je relativno teško napisati i mnogi ga korisnici ne bi razumeli. Umesto toga bi
se moglo postupiti na jednostavniji način koristeći se pojmom "proširenih tipova podataka".
Proširene tipove podataka može korisnik sam da definiše, ili oni postoje u biblioteci tipova u
nekim objektno relacionim bazama podataka. Na primer u paketu Illustra (koji se može
tretirati koa objektno proširenje Informix-a) postoje neki tipovi podataka i njima pridružene
funkcije i operacije i pristupne metode za tzv "DataBlade modules" ("oštrica", kao metafora
za ove module, "brijača" koji je metafora za bazu podataka). Postoji DataBlade modul za 2-D
geometrijske oblike i u okviru njega tip "point" (dve koordinate) nad kojim je definisana
operacija "distance". Ako se u relaciju, umesto kolona koor_x i koord_y ubaci kolona
lokacija tipa point, onda se gornji upit može napisati na sledeći način:
SELECT r.ime
FROM radnik r, radnik j
WHERE j.ime = 'Aca' AND
distance (j.lokacija, r.lokacija) < 1;
Kada se definiše neki apstraktni (prošireni) tip, tada se može, u nekoj tabeli, definisati atribut
nad tim tipom:
www.puskice.co.yu 36
www.puskice.co.yu
ime varchar(30),
podaci moj_tip);
Za apstraktne tipove potrebno je definisati funkcije u kojima oni mogu da budu argumenti i
operatore koji se na njih mogu primeniti.
Ako se umesto SQL izraza koristi ime fajla, podrazumeva se da se u tom fajlu nalazi program
(u nekom jeziku) koji vraća zahtevani rezultat.
Nad apstraktnim tipom se može definisati i skup operatora. Operator se definiše sledećom
opštom sintaksom:
CREATE OPERATOR
BINDING ime_operatora
TO ime_funkcije;
SELECT e.ime
FROM Radnik e, Radnik j
WHERE e.ime = 'Aca' AND e.plata PribližnaPlata j.plata;
www.puskice.co.yu 37
www.puskice.co.yu
copmposites (records)
sets
references
Composite je tip podatka koji definiše rekord kao u sledećem primeru:
Odvajanje definicije tipa od definicije tabele omogućuje da se za jedan tip kreira više tabela i
time, kako će se videti kasnije ostvari nasleđivanje.
Moguće je takođe definisati atribut neke tabele nad definisanim kompozitnim tipom kao
domenom:
Set je takođe konstruktor tipa. Iskazom SETOF(t) formira se ovaj tip podataka, odnosno skup
elemenata tipa t.
Takođe je veoma korisno da se podži tip pokazivača (reference). Iskaz REF(t), gde je t tip
podatka, takođe je tip podatka.
Očigledno je da je tabela Organizacije veoma složena tabela. Za nju i slične tabele neophodno
je definisati:
1. Korisničke funkcije čiji su argumenti i rezultat kompozitni tipovi;
2. Funkcija koja vraća kompozitni tip može da se pojavi u FROM delu SQL
upita;
3. "Kaskadna tačkasta notacija", slična onoj u objektnim bazama, može se
upotrebiti za referisanje atributa kompozitnog tipa.
www.puskice.co.yu 38
www.puskice.co.yu
SELECT e.ime
FROM vanr_stud_t e
WHERE preplaćen (e);
www.puskice.co.yu 39
www.puskice.co.yu
CWnd
CStatic
CEdit
CButton
CListBox
CComboBox
Osnovna klasa koja modeluje prozor na ekranu je CWnd klasa. Ovo je apstraktna klasa i ona
predstavlja nadklasu za sve ostale elemente interfejsa koji se prikazuju na ekranu. CDialog je
podklasa koja predstavlja ekransku formu u kojoj se nalaze ostali elementi, tzv. kontroli preko
kojih se prikazuju i unose podaci, okida izvršavanje operacija i slično. Svaki kontrol je takođe
podklasa klase CWnd i on se modeluje sa apstraktnom klasom CControl. Vezom Controls
izmadje CDialog i CControls se definiše koji kontroli su u sastavu ekranske forme. Svaki
konkretan kontrol za pojedinu vrstu elementa grafičkog interfejsa se modeluje kao konkretna
podklasa nadklase CControls. Na slici su prikazane klase za neke osnovne elementi interfejsa
kao što su:
- CStatic - statički tekst (labela) koja se prikazuje na formi
- CEdit - polje na formi u kome se prikazuje i unosi neki podatak
- CButton- dugmić preko koga se aktivira neka operacija
- CListBox - element interfejsa u kome se može prikazati lista (skup) podataka sa
mogućnošću skrolovanja ukoliko cela lista ne može da se vidi na ekranu.
- CComboBox - element interfejsa koji omogućava izbor jednog podataka iz
liste(skupa) podataka.
www.puskice.co.yu 40
www.puskice.co.yu
Mada je moguće kreirati interfejs kroz programski kod (operacijama za kreiranje objekata i
njihovo povezivanje), u OO razvojnim okruženjima postoje posebni alati koji razvoj
korisničkog interfejsa automatizuju. Ovi alati omogućuje da se interfejs prvo definiše (nacrta),
a zatim i da se generiše kod koji će formirati željeni interfejs na ekranu korisnika.
www.puskice.co.yu 41