You are on page 1of 39

www.puskice.co.

yu

2. OSNOVE OBJEKTNE ORJENTACIJE

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.

Bitna karakteristika objekata u OO pristupima je učaurenje (encapsulation), sakrivanje


informacijha (information hiding). U strogo objektnim pristupima jedini način da se pristupi
stanjima objekta ili da se ona promene je preko neke, iz skupa definisanih, operacija: jednini
vidljivi deo objekta su operacje i to ne način na koji su implementirane, već samo njihovi
efekti (specifikacija). Da bi se neki objekat koristio dovoljno je znati samo semantiku
operacija koje on nudi, a ne i način implementacije njegovih stanja i operacija. Koncept
učaurenja i sakrivanja informacija potiče od pojma apstarktnog tipa podatka koji je u
softversko inženjerstvo uveden ranije /1/ i koji je tretiran kao softverska komponenta koje se
može koristiti za razvoj složenih programa bez poznavanja načina njene implementacije -
samo na osnovu njegove specifikacije.

Učaurenje, odnosno sakrivanje informacija ima poseban značaj za razvoj i održavanje


složenih softverskih sistema. Učaurenje smanjuje složenost sistema na taj način što
omogućuje korišćenje objekata (komponenti softvera) bez poznavanja njihove moguće
veoma složene strukture. Promena implementacije objekta, uz zadržavanje semantike
korišćenih operacija, ima samo lokalni efekat.

Imajući u vidu učaurenje, objekat se definiše svojim nazivom (jedinstvenim


identifikatorom) i skupom svojih operacija. Na primer,
Aca

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.

Istovremeno se uvode i osnovna grafička notacija za tzv “dijagrame objekata”. Dijagram


objekata pretstavlja formalnu grafičku notaciju za prikazivanje objekata, kalsa i njihovih
međusobnih veza. Postoje dva tipa objektnih dijagrama: dijagrami klasa koji prikazuje klase
objekata i njihove međusobne veze i dijagrami pojavljivanja koji prikazuju neki poseban
skup objekata i njihove međusobne odnose. Očigledno je da se dijagrami klasa koriste za
modeliranje sistema, dok se dijagrami pojavljivanja pretežno koriste da prikažu primere koji
objašnjavaju delove dijagrama klasa.

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.

Još jednom naglašavamo da se uvođenjem pojma klase realizuje apstrakcija klasifikacije i


time značajno pojednostavljuje model sistema: jedinstvena definicija atributa i veza klase
memoriše se samo jednom, kod za operacije nad objektima jedne klase piše se samo jednom.

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

Slika 2.1. Klasa i objekti - njena pojavljivanja

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.

Atributi se prikazuju u drugom delu pravougaonika za prikazivanje klasa, a njihove vrednosti


se navode istim redosledom u prikazu pojavljivanja ili kao par <atribut, vrednost>. Iza naziv
atributa opciono može da slede neki detalji kao što su tip atributa, difolt vrednost, ograničenje
i slično.

Interni jedinstveni identifikator nije neophodno pretstavljati kao atribut klase, on se


podrazumeva, jer ga većina objektno-orjentisanih jezika automatski generiše za svako
pojavljivanje objekta. Eksterni identifikatori objekata, kao što su, na primer, Matični lični
broj, Registarski broj automobila i slično treba pretstavljati kao bilo koje druge atribute
objekata.

Sledi primer prikaza atributa klasa i njihovih vrednisti za pojavljivanja objekata.

www.puskice.co.yu 5
www.puskice.co.yu

Slika 2.2. Objekti sa vrednostima.

2.4. Operacije i metode


Dinamika sistema u OO pristupima se ostvaruje na taj način što jedan objekat šalje drugom
događaj, (poruku ili stimulaciju) kojom okida neku operaciju “pozvanog” (target) objekta. Svi
objekti u nekoj klasi imaju iste operacije.

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.

Pojam metode i pojam operacije se u OO pristupima često izjednačuju. Ovde će se pretežno


koristiti pojam operacije, a pod metodom će se podrazumevati implementacija neke
operacije u datoj klasi. Metode koje odgovaraju jednoj operaciji obavljaju isti zadatak (imaju
istu specifikaciju), ali mogu imati različit kod. Na primer operacija Print za neki fajl ima
različite metode za razne vrste falova (ASCII fajl, binarni fajl i drugo).

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.

Osoba File Geometrijski objekat


ime naziv fajla boja
starost veličina položaj
poslednje ažur
promeni_posao() štampaj() pomeri(delta:Vector)
promeni_adr() selectuj(p:tačka):Boolean
rotitaj(ugao)

www.puskice.co.yu 6
www.puskice.co.yu

Slika 2.3. Primeri specifikacije klasa

2.5. Pregled ukupne notacije za klase

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

vidljivost naziv-atributa-1: tip-podatka-1 = početna vrednost-1 šiskaz osobinać


vidljivost naziv-atributa-2: tip-podatka-2 = početna vrednost-2 šiskaz osobinać
.....................

vidljivost naziv-operacije-1 (lista-argumenata-1): tip-rezultata-1 šiskaz osobinać


vidljivost naziv-operacije-2 (lista-argumenata-2): tip-rezultata-2 šiskaz osobinać
....................

Slika 2.4. Opšti način specifikacije klase

Napomenimo da se se način specifikacije atributa i operacija može izmeniti i prilagoditi


nekom OO jeziku u kome će softver biti implementiran. Međutim, ovakva odluka može da
učini da specifikacija sistema postane implementaciona zavisna, što nije dobra praksa razvoja
IS.

U UML-u je opis atributa i operacija nešto opštiji:

Sintaksa za opis atributa je:

vidljivost naziv-atributa : tip = početna-vrednost š iskaz osobina ć

Sličana je sintaksa i za opis operacija:

vidljivost naziv-operacije (lista parametara) : tip rezultata š iskaz osobina ć

U oba slučaja vidljivost može da bude:

 + javna (atribut, odnosno operacija su svima dostupni)


 # zaštićena ( atribut, odnosno operacija su dostupni samo nekim objektima)
 - privatna (atribut i operacija su dostupni samo posmatranoj klasi, odnosno njenim
objektima)

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

pojedinih koncepata. Najčešće osobine su ograničenja koje se nameću na vrednosti pojedinih


atributa, kao i druge vrste ograničenja.

2.6. Odnosi između objekta, odnosno klasa

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.

Asocijacija pretstavlja grupu veza slične strukture i jedinstvene semantike. Veze su


pojavljivanja asocijacije. Sve veze u jednoj asocijaciji povezuje objekte iz istih klasa.
Asocijacija opisuje set potencijalnih veza, na isti način kao što klasa pretstavlja skup
potencijalnih objekata. Primer asocijacije je Radi koja pretstavlja veze objekte iz klase
Radnik i klase Organizacija.

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

Slika 2.5. Asocijacije i veze tipa 1 prema 1

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.

Slika 2.6. Asocijacije i veze tipa više prema više

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

Slika 2.7. Primer ternarne asocijacije i veze.

Multiplicitet (kardinalnost). Multiplicitet, odnosno kardinalnost definiše koliko se


pojavljivanja jedne klase može pridružiti jednom pojavljivanju druge klase u posmatranoj
asocijaciji. Multiplicitet je obično interval koji definiše najmanji, odnosno najveći broj
pojavljivanja (ili sve moguće brojeve pojavljivanja) koji se mogu pridružiti jednom
pojavljivanju u posmatranoj asocijaciji. Multiplicitet može biti “1” (tačno 1), “1..*”, jedan ili
više, “3..5”, (tri do pet, uključujući tri i pet), “2,4,18” (dva, tri ili 18).

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

Slika 2.8. Atribut veza za asocijaciju “više prema više”

Slika 2.9. Atributi veza za asocijacije tipa “jedan prema više”

Slika 2.10. Različite mogućnosti modeliranja atributa veze u asocijaciji


“jedan prema više”

Grafička oznaka za atribut asocijacije, sa praznim prvim odeljkom pravougaonika, koristi se


da bi se atributi veze stavili u isti odeljak kao i atributi klasa i da bi se iskazala razlika između
asocijacije sa atributima i koncepta “asocijacije kao klase”, čije objašnjenje sledi.

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.

Slika 2.11. Asocijacija kao klasa

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.

Slika 2.12. Definicija koncepta uloge

Slika 2.13. Ilustracija neophodnosti koncepta uloge

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.14. Kvalifikovana asocijacija

Slika 2.15.

Kvalifikacija ne redukuje uvek multiplicitet na “jedan”, već može samo da ga smanji.

Očigledno je da je kvalifikacija jedna vrsta indeksiranja (termin iz relacionih baza podataka)


asocijacija sa multiplicitetom “više” preko pogodno izabranog atributa druge klase u toj
asocijaciji.

Agregacija. Pod agregacijom se podrazumeva tzv “ deo-od (part-of) “, odnosno “deo-celina


(part-whole) veza između objekata, koja potiče iz pojma sastavnice proizvoda a ima druge
slične primene. Formalno, agregacija je asocijacija koja ima dodatne semantičke osobine:
 tranzitivnost: ako je A deo B, a B je deo C, tada je i A deo C;
 antisimetričnost: ako je A deo B, tada B nije deo A.

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.

Slika 2.16. Agregacija

Slika 2.17. Višenivoska agregacija

Slika 2.18. Rekurzivna agregacija

2.6.2. Nasleđivanje i generalizacija

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 može da bude višenivoska, odnosno podklasa u jednoj generalizaciji može da


bude nadklasa u drugoj. Zbog toga se umesto ova dva termina koriste i termini predak
(ancestor) i potomak (descendent) za nadklasu i podklasu, respektivno.

Generalizacija se često naziva i “is-a” odnos klasa, jer pokazuje da pojavljivanje podklase
istovremeno i pojavljivanje nadklase.

Na slici 2.19. prikazan je primer generalizacije. Generalizacija se prikazuje trouglom, sa


osnovicom prema podklasama, a temenom prema nadklasi. Pored trougla se može upisati tzv
“discriminator”. Discriminator je atribut sa nabrojivim domenom preko koga je izvršena
specijalizacija. Generalizacija i specijalizacija su dva inverzna aspekta iste veze između
klasa. Samo jedna osobina nadklase se može koristiti kao diskriminator.

www.puskice.co.yu 15
www.puskice.co.yu

Slika 2.19. Višenivosko nasleđivanje sa primerima pojavljivanja

Očigledno je da podklase nasleđuju atribute i operacije nadklasa. Termini nasleđivanje,


generalizacija i specijalizacija se svi odnose na isti koncept u OO pristupima i upotrebljavaju
se gotovo kao sinonimi. Međutim, pojam nasleđivanja je stariji od OO pristupa i vezan je i
sada najviše za ponovno korišćenje (reuse) koda u objektno-orjentisanom programiranju. Ovi
prezcizno definisani koncepti su još značajniji u fazi modeliranja (specifikacije) sistema.

www.puskice.co.yu 16
www.puskice.co.yu

Predefinisanje (overriding) je postupak kojim se menja neka nasleđena karakteristika klase u


podklasi. Mogu se predefinisati difolt vrednost atributa ili, znatno češće, metoda neke
operacije. Bez obzira na to kako se vrši predefinisanje metode, njen naziv, skup njenih
argumenata i tip rezultata ne može biti promenjen. Ovu mogućnost koja postoji u svim većini
OO jezika treba izbegavati, jer otežava razumevanje modela sistema.
Apstraktne klase su klase koje nemaju direktnih pojavljivanja. Idirektna pojavljivanja
apstraktne klase su pojavljivanja njenih podklasa. Konkretne klase su one klase koje imaju
direktna pojavljivanja ( koje se mogu “istancirati”). Konkretna klas može imati apstraktu
podklasu, a ove moraju imati konkretne potomke. Samo konkretne klase mogu biti listovi u
nekom generalizacionom stablu, kako je to prikazano na Slici 2.20.
Apstraktne klase služe da pogodno prikažu zajedničke osobine više klasa. Na primer, kada
više različitih klasa ima istu asocijaciju prema istoj klasi pogodno je kreirati apstraktnu klasu i
preko nje prikazati tu asocijaciju. Isto tako definiše da bi se uvela tzv “apstraktna operacija”.
Apstraktna operacija je operacija u apstraktnoj klasi za koju nije definisan metod (definisan je
samo protokol njenog korišćenja). Konkretne klase moraju imati svoju sopstvenu
implementaciju te apstraktne operacije. Na slici 2.21. dat je primer apstraktne operacije
“sračunaj platu” ( naznaka apstraktna u velikoj zagradi). Plate različitih vrsta radnika se
potpuno različito sračunavaju.

Slika 2.20. Model definicije apstraktne klase

www.puskice.co.yu 17
www.puskice.co.yu

Slika 2.21. Primer apstraktne klase i apstraktne operacije

Višestruko nasleđivanje. Kada definišemo novu klasu u kojoj želimo da koristimo


karakterristike dve ili više postojećih klasa, mogu će je naslediti karakteristike svih njih.
Višestruko nasleđivanje dozvoljava jednoj klasi da ima više nadklasa. Prednost ove
mogućnosti je u tome što se proširuje mogućnost nasleđivanja, a nedostatak što se gubi
jednostavnost modela i implementacije. Neophodno je naglasiti sledeća pravila višestrukog
nasleđivanja:
 Ako nadklase iz kojih posmatrana klasa višestruko nasleđuje osobine imaju jednog
zajedničko pretka po nekoj generalizacionoj hijerarhiji, jedna osobina se može
naslediti samo jednom;
 Generalizacija, odnosno specijalizacija mogu biti eksluzivne (neprekrivajuće –
nonovelalapping: jedno pojaavljivanje nadklase se može pojaviti kao pojavljivanje
samo u jednoj podklasi) i neeksluzivne (prekrivajuće - overlapping: jedno
pojavljivanje nadklase može se pojaviti u više podklasa). Do sada su svi primeri
podrazumevali eksluzivne generalizacije koje se pretstavljaju praznim trouglom.
Puni trougao pretstavlja neeksluzivnu generalizaciju. Jedna podklsa može višestruko
nasleđivati samo iz nezavisnih nadklasa različitih eksluzivnih generalizacija ili iz
nadklasa iste neeksluzivne generalizacije.

Na Slici 2.22 dat je primer višestrukog nasleđivanja iz neeksluzivne generalizacije, a na slici


2.23 višestrukog nasleđivanja iz nezavisnih nadklasa.

Slika 2.22. Višestruko nasleđivanje iz neeksluzivne generalizacije

Slika 2.23. Višestruko nasleđivanje iz nezavisnih nadklasa

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.

Slika 2.24. Klasa sa naznačenim atributima i operacijama klase

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 objekte. Definišu se uz opis klasa kako je prikazano na slici 2.25.

šplata  šef.platać šprioritet se ne povećavać

Slika 2.25. Ograničenje na objekte

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.

Slika 2.26. Ograničenja na veze

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

Slika 2.27. Opšta ograničenja

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

Slika 2.28. Izvedeni atribut

Slika 2.29. Izvedena asocijacija i klasa

2.8. Objektno orijentisani jezici


Objektno-orijentisani (OO) jezici predstavljaju prirodno implementaciono okruženje za
sisteme koji su objektno orijentisano specificirani. Oni direktno podržavaju OO koncepte i
zbog toga je u njima relativno lako implementirati neku OO specifikaciju.

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.

2.8.1. Primer grafičkog editora

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.

Na slici su prikazani atributi i operacije za svaku klasu. Apstraktne operacije su označene sa


oznakom abstract.

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

Slika 2.30 Dijagram klasa za grafički editor


2.8.2. Definisanje klasa

Osnovni korak u implemetaciji je definisanje klasa objekata. Svaki specificirani atribut i


operacija mora biti deklarisan kao deo odgovarajuće klase. Deklarisani atributi i operacije
mogu biti javni i privatni. Javni atributi i operacije su dostupni bilo kojoj drugoj operaciji, dok
privatni su dostupni samo operacijama iste klase u kojoj su i deklarisani.

Primer deklaracije klase Crtež u C++ je sledeći:

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.

2.8.3. Kreiranje objekata

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

Statička alokacija se postiže deklarisanjem promenljive izvan funkcija (tzv. globalna


promenljiva) ili korišćenjem ključne reči static uz lokalne promenljive. Na primer, sledeća
naredba deklariše globalnu promenljivu koja čuva iniciran objekat klase Crtež:
Crtez mojCrtez = Crtez(100, 50);

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čka alokacija se vrši iz slobodne programske memorije (tzv. heap) na eksplicitan


zahtev programera. Operator new alocira (kreira) objekat i vraća pokazivač na njega, koji se
može sačuvati u nekoj promenljivoj tipa pokazivač. Ovaj operator zahteva i specifikaciju
konstruktora koji se koristi, na primer:
Crtez * pokazCrtez = new Crtez(100, 50);

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;

Standardna implementacija C++ jezika ne poseduje skupljač smeća i dinamički alocirane


promenljive se moraju uništiti sa delete operatorom. Programer mora biti svestan opasnosti da
kod nekih objekata mogu ostati reference na uništeni objekat (tzv. “lutajući” pokazivači) ili
gubitka memorije zbog nedostupnih, a neuništenih objekata (tzv. “curenje” memorije).

2.8.4. Pozivanje operacija

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

U C++ operacije se deklarišu zajedno sa atrubitima u deklaraciji članova klase. Operacija se


poziva slično kao što se pristupa atributu: korišćenjem operatora “->“ za izbor člana
primenjenog na pokazivač na objekat:
Simbol *s;
s->pomeri(5, 3)

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;ć

2.8.5. Korišćenje nasledjivanja

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;
ć

class Pravougaonik : public Simbol


š
protected:
int sirina;
int visina;
public:
Pravougaonik(int lokacijaX, int lokacijaY, int sir, int vis);

www.puskice.co.yu 25
www.puskice.co.yu

Boolean izabran(int lokacijaX, int lokacijaY);


void prikazi(Boja boja);
ć

class Krug : public Simbol


š
protected:
int poluprecnik;
public:
Krug(int lokacijaX, int lokacijaY, int r);
Boolean izabran(int lokacijaX, int lokacijaY);
void prikazi(Boja boja);
ć

Atrubuti deklarisani u nadklasi se nasledjuuju i ne ponavljaju se u deklaraciji podklase. Njima


se može postupati iz operacija podklase, izuzev ako nisu dedlarisani kao privatni. Privatnim
atributima mogu pristupati jedino operacije date klase. Atributima koji su deklarisani kao
zaštićeni (protected) mogu pristupati i operacije podklasa, ali ne i operacije ostalih klasa.
Boolean Pravouganik::izabran(int pX, int pY)
š
return x<=pX && pX <= x + sirina && y <=pY && pY <= y + visina;ć

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.

2.8.6. Implementacija veza

Većina OO jezika ne podržava eksplicitno veze izmedju objekata, pa se veze moraju


implementirati kao atributi. Atrubuti se dodaju objektima koji učestvuju u vezi i definišu se
kao pokazivači. U mnogim slučajevima veza se obilazi samo u jednom pravcu, tako da
pokazivač treba da se doda samo jednom obejektu.

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

Implementacija opeacija za povezivanje i razvezivanje preko veze Simboli bi mogla da


izgleda ovako:

void Crtez::dodajSimbol(Simbol *s)


š
simboli->add(s);
s->crtez = this;
ć

void Crtez::izbaciSimbol(Simbol *s)


š
simboli->remove(s);
s->crtez = 0;
ć

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.

2.9. Objektne i objektno relacione baze podataka

Dva problema konvencionalnih relacionih modela i odgovarajućih RSUBP dovela su do


potrebe za razvojem objektnih sistema za upravljanje bazama podaraka OSUBP:

 "Nesaglasnost impedansi" relacionih jezika (SQL) i "jezika domaćina", odnosno


konvencionalnih programskih jezika (COBOL, FORTRAN, C i drugi) kao i jezika
četvrte generacije, u kojima se razvija softver nad jedinstvenom bazom podataka. Ova
nesaglasnost se ogleda u tome što je osnovni operand relacionih jezika tabela
(relacija ) koja se može, za ovu diskusiju tretirati i kao skup rekora, dok je osnivni
operad konvecionalnih jezika jedan rekord. "Nesaglasnost impedansi" se rešava
uvođenjem specifičnih koncepata, kao što su Cursor i slični, koji značajno otežavaju
razvoj složenih aplikacija na bazom podataka. Novi objektnio-orjentisani jezici i alati
za razvoj softvera ne rešavaju ovaj probem, već ga čine još izraženijim;

 Struktura relacione baze kao skupa normalizovanih tabela pogodnos je samo za


jednostavne poslovne obrade podataka: "poslovni objekti" (kupac, dobavljač, radnik
isli) obižno imaju jednostavnu "ravnu strukturu" koja se moče pretstaviti
noramlizovanom tabelom. Memorisanje i obrada složenih struktura podataka koje su
neophodne u "inženjerskim aplikacijama" u relacionim bazama podataka zahteva
složene transformacije i pri održavanju (ažuriranju) baze i pri preuzimanju podataka
iz baze u program.

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

Slika 2.31. Upoređenje primene relacionih i objektnih SUBP-a za obradu kompleksnih


struktura podataka

Međutim, postoje još mnogu nerešeni problemi ODBMS-a i od kojih su sledeća dva ključna:

 Nejasan je način na koji se ostvaruje koncept tronivoske arhitekture SUBP-a, odnosno


koncept, fizičkog, konceptualnog i korisničkog nivoa. Tronivoska arhitektura SUPB-a
ima za cilj da užini nezavisnim programe od baze podataka, odnosno da učini bazu
podataka jedinstvenim resursom za veći broj (sve) aplikacije u jednom sistemu. Čini
se da ODBMS, izjednačavanjem strukture aplikacionog i perzistentnog objekta, ovu
suštinski važnu osobinu SUBP-a izostavlja;

 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

vrednosno orjentisani modeli, u njima se veze između objekata (tabela) ostvaruju


preko vrednosti njihovih atributa. Objektni modeli su strukturno orjentisani, u njim
se veze između objekata ostvaruju direkno, preko pokazivača. Vrednosti modeli
pogoduju neproceduralnim jezicima. Neproceduralnim jezikom se može pristupiti
objektima čije vrednosti atributa zadovoljavaju neki uslov. Strukturne veze
omogućuju da se pristupi samo objektu samo preko pokazivača koji tu strukturu
ostvaruju.

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.

Relacione baze Objektno-relacione


Upitni jezik
podataka baze podataka

Objektne baze
Bez upitnog Sistem datoteka
podataka
jezika

Proste strukture Slo`ene strukture


podataka podataka

Slika 2.32. Prikaz odnosa RDBMS i ODBMS prema upitnim jezicima i kompleksnim
strukturama podataka.

Ovde će se ukratko dati prikaz objektnih i objektno-relacionih baza podataka.

2.9.1. Objektne baze podataka

U objektnim bazam podataka koriste se svi koncepti OO pristupa i OO jezika. Ovde će se


prvo dati definicija nekih dodatnih i delimično izmenjenih, a zatim prikazati jedan primer.

Bazični koncepti objektnog modela su objekat i literal. Definicija objekat je ista kao i ranije,
a pod literalom se podrazumeva podatak (vrednost).

Stanje objekta je određeno vrednostima njegovih atributa i asocijacija (veza) sa drugim


objektima. Ponašanje objekta se prikazuje preko operacija koje on izvršava ili trpi.

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

t označava tip objekta koji čini kolekciju.

Definišu se i dve opšte klaase Collection i Iterator, da bi se jedinstveno definisale opšte


operacije za sve vrste kolekcija

interface Collection: Object š


unsigned long cardinality ();
boolean is_empty ();
void insert_element(in any element);
void remove_element(in any element);
boolean containes_element(in any element);
iterarator create_iterator ();
ć;

interface Iterator: Object š


exeption Empty ();
exeption NoMoreElements ();
boolean not_done ();
void adsvances () raises (NoMoreElements);
any get_element() raises(Empty);
void reset();
ć;

Na osnovu definicije kolekcija očigledne su dodatne operacije koje se u njima obavljaju, pa se


neće prikazivati.

Literali se od objekata razlikuju samo po tome što nemaju svoj identifikator. Mogu da budu:

www.puskice.co.yu 31
www.puskice.co.yu

 atomski, standardni tipovi podataka (integer, float, string, boolean, itd);


 kolekcije, istih tipova kao i kolekcije objekata;
 strukture ( structured literal), agregacija fiksnog broja elemenata, od koji svaki
može da bude bilo literal ili objekat. Predefinisane strukture su Date, Interval,
Time, Timestemp.. Korisnički definisane strukture se defuinišu istom sintaksom
kao i objekat: Interface Struct.........

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

Slika 2.33. Objektni model za šemu baze podataka

ŠEMA BAZE PODATAKA


interface Predmet
( extent predmeti
keys ime, idpr )
š
attribute String ime;
attribute String idpr ;
relationship Set <Predmet> zahtevan
inverse Predmet :: zahteva_se_prethodno;
relationship Set <Predmet> zahteva_se_prethodno;
inverse Predmet :: zahtevan;
relationship List <Sekcija> sadrži;
inverse Sekcija :: je_sek;
Boolean drži_se (in Unsigned Short semestar) reises (već_ponuđen);
Boolean izostavjen (in Unsigned Short semestar) reises (nije_ponuđen);
ć;
interface Sekcija
( extent sekcije
keys idsek )
š
attribute String idesek;
attribute String opis;
relationship Predmet je_sek
inverse Predmet :: sadrži;
relationship Nastavnik drži_predavanje
inverse Nastavnik :: predaje;
relationship Asistent drži_vežbe
inverse Asistent :: vežba;

www.puskice.co.yu 33
www.puskice.co.yu

relationship Set <Studenti> slušaju


inverse Student :: upisan;
ć;

interface Radnik
( extent radnici
keys mlbr )
š
attribute String mlbr;
attribute String ime;
void zaposli_se ();
void otpusti_se () raises (nema_takvog_radnika);
ć;

interface Nastavnik : Radnik


( extent nastavnici)
š
attribute Enum Rang š red.prof, van.prof., doc ć rang;
relationship Set <Sekcija> predaje
inverse Sekcija :: drži_predavanje;
ć;

interface Asistent : Radnik, Student


()
š
relationship Set <Sekcija> vežba inverse Lekcija :: drži_vežbe;
ć;

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

uzimaju vrednosti iz posmatranog skupa objekata, neophodno je definisati i promenljive


preko "putanja", odnosno veza (preslikavanja) sa drugim objektima.

Upitni jezik prati osnovni iskaz SQL-a:

SELECT
FROM
WHERE

Promenljive se definišu u okviru FROM dela.

Kako se u osnovi radi o nenormalizovanim relacijama, očigledno je da se o okviru SELECT


dela može započeti novi upit sa klauzulom SELECT. To je način da se omogući i da i
rezultat upita bude nenormalizovana tabela, čime se ostvaruje homogenost ovog upitnog
jezika. (Homogenost se ogleda u činjenici da se nad rezultatom upita može ponovo postaviti
upit).

Primeri upita su:

SELECT x.ime
FROM Student x
WHERE x.broj_ind = '22/97';

SELECT DISTINCT x.ime, (SELECT y.opis, (SELECT z.ime


FROM y.drži_predavanje AS z
WHERE rang = 'doc')
FROM x.upisan AS y)
FROM Sudent x;

Rezultat gornjeg upita je struktura

SET <student.ime, BAG <Sekcija.opis, BAG <Nastavnik.ime>>>,

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.

2.9.2. Objektno-relacione baze podataka

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:

 mogućnost definisanja sopstvenih osnovni tipova podataka u tabelama;


 mogućnost definisanja složenih objekata.

www.puskice.co.yu 35
www.puskice.co.yu

Definisanje sopstvenih osnovnih tipova podataka. Pretpostavimo da je data seledeća tabela:

CREATE TABLE Radnik (


ime varchar(30),
plata int,
adresa varchar(35),
koord_x float,
koord_y float);

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;

Prošireni tip podataka se definiše na sledeći način:

CREATE TYPE moj_tip (


internallenght = 8,
input = mojtipUlaz,
output = mojtipIzlaz);

Intrenallenght definiše da će osam bajtova biti rezervisano za memorisanje pojavljivanja


ovoga tipa. Funncije MojtipUlaz i MojtipIzlaz definišu način koverzije tipa posataka iz i u
ASCII kod). Svaki tip podataka u bazi podataka ima svoj interni kod i svoj eksterni (ASCII)
kod. Za predefinisane tipove podataka transformacije iz jednog u drugi su date, a za nove
korisnički definisane ovo je neophodno definisati preko posebnih funkcija.

Kada se definiše neki apstraktni (prošireni) tip, tada se može, u nekoj tabeli, definisati atribut
nad tim tipom:

CREATE TABLE Moja_tabela (

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.

Sintaksa za kreiranje funkcija je:

CREATE FUNCTION ime_funkcije (ime_tipa_1, ime_tipa_2,....., ime_tipa_k)


RETURNS ime_tipa AS
(ime_fajla ili SQL izraz);

Na primer može se definisati sledeća funkcija, koristeći se prethodno definisanom tabelom


Radnik:

CREATE FUNCTION Poređenje_Acine_Plate (int)


RETURNS int
AS SELECT $1 - plata
FROM Radnik
WHERE ime ='Aca';

Sada se može pisati upit

SELECT Poređenje_Acine_Plate (e.plata)


FROM Radnik e
where e.ime = Mika;

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;

Na primer: CREATE OPERATOR


BINDING PribližnaPlate
TO Poređenje_plata;

CREATE FUNCTION Poređenje_ plata(int1, int2)


RETURNS boolean
AS SELECT ($1 - $2 < 30);

Na osnovu ovako definisanog operatora moguće je postaviti upit

SELECT e.ime
FROM Radnik e, Radnik j
WHERE e.ime = 'Aca' AND e.plata PribližnaPlata j.plata;

Složeni objekti. Za kreiranje složenih objekata koriste se sledeći konstruktori:

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:

CREATE TYPE Radnik-t (


ime varchar(30),
plata int,
adresa varchar(30));

Može se kreirati i tabela koja čuva pojavljivanje definisanog kompositnog tipa:

CREATE TABLE Radn OF TYPE Radnik_t;

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:

CREATE TABLE Poslovi (


opis_posl varchar(30),
radnici Radnik_t);

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.

Primer upotrebe konstruktora složenih objekata je:

CREATE TYPE organ_t (


orgime varchar(30),
sprat int,
brtel telefon_t,
kola setof(auto_t),
šef ref (radnil_t),
radnici setof(ref(radnik_t)));

CREATE TABLE Organizacije OF organ_t;

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.

Diskusija o ovim aspektima ne spada u obuhvat ovoga materijala.

Nasleđivanje. U objektno-relacionim bazama podataka definiše se nasleđivanje podataka i


nasleđivanje funkcija.

www.puskice.co.yu 38
www.puskice.co.yu

Nasleđivanje podataka se primenjuje na kompozitne tipove. Ono je čigledno iz sledećeg


primera:
CREATE TYPE osoba_t(
ime varchar(30));

Dodatni podtipovi mogu se kreirati na sledeći način:

CREATE TYPE radnik_t (


plata int,
starost int,
adresa varchar(30))
UNDER osoba_t;

CREATE TYPE student-t (


srednja_oc float)
UNDRER osoba_t;

CREATE TYPE vanr_stud_t (


zanim varchhar (30))
UNDER TYPE radnik_t, student_t;

Iz gornjih definicija je jasno kako podipovi (definisani deklaracijom UNDER) nasleđuje


atribute svojih nadipova. Moguće je i višestruko nasleđivanje (vanr_stud_t), sa istim
problemima kao i višestruko nasleđivanje u objektnom modelu. Očigledno je da je moguće
napisati upit

SELECT ime, plata, srednja_oc, zanim


FROM vanr_stud_t
WHERE plata >3000;

Pretpostavlja se da podtipovi nasleđuju i sve korisnički definisane funkcije. Na primer, ako je


za radnika definisana sledeća funkcija:

CREATE FUNCTION preplaće(radnik_t)


RETURNS Boolean as
RETURN $1.plata > (SELECT plata FROM radnik_t WHERE ime = Siniša):

Sada se može (zadobar ORDBMS) napisati upit

SELECT e.ime
FROM vanr_stud_t e
WHERE preplaćen (e);

Na kraju prikaza objektnih i objektno-relacionih baza podataka, očigledno je da oba pristupa


pokušavaju da ostvare isti cilj, delimično različitim pristupima. Performanse odgovarajući
softverskih sistema i prihvatljivost od strane korisnika biće osnovni kriterijumi za ocenu
prednosti i nedostataka ovakvih pristupa.

2.10. Objektno orijentisani interfejs

Komunikacija korisnika sa sistemom se ostvaruje kroz korisnički interfejs. Elementi


korisničkog interfejsa omogućuju izbor i pokretanje aplikacija, prikaz i unos podataka,

www.puskice.co.yu 39
www.puskice.co.yu

izvršavanje komandi i operacija i slično. U OO okruženju elementi korisničkog interfejsa se


takođe tretiraju kao objekti, tj. instance klasa kojima se modeluju elementi interfejsa.

U praktično svim OO razvojnim okruženjima ovi elementi interfejsa su standardizovani kroz


unapred definisan skup klasa. Na taj način, razvoj interfejsa se svodi na korišćenje već
gotovih klasa, odnosno njihovo prilagođavanje potrebama konkretne aplikacije njihovom
daljom specijalizacijom u konkretne podklase. Na primer, u MS Windows C++ okruženju
postoji preko 200 klasa definisanih u MFC (Microsoft Foundation Classes) biblioteci klasa.
Na sledećoj slici je prikazan deo ovih klasa koji se tiču ekranskih formi za dijalog sa
korisnikom:

CWnd

CDialog Controls CControl

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.

Obzirom da je CDialog apstraktna klasa, razvoj konkretne ekranske forme za dijalog


podrazumeva definisanje nove klase koja je podklasa CDialog-a. Konkretni elementi
interfejsa na formi se definišu kao instance neke od klasa za kontrole (ove klase su konkretne

www.puskice.co.yu 40
www.puskice.co.yu

i ne zahtevaju dalju specijalizaciju, iako je ona moguća). Na primer, ukoliko bi hteli da


napravimo ekransku formu koja prikazuje neko odeljenje i spisak radnika u tom odeljenju,
ekranska forma bi izgledala npr. ovako:

Na slici su označeni elementi interfejsa koji predstavljaju objekte, instance pojedinih


predefinisanih klasa za kontrole. Cela ekranska forma za podatke o odeljenju je definisana
kao podklasa apstraktne klase CDialog.

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

You might also like