You are on page 1of 11

Osnove objektnog modela

Uvod Softverski sistemi su odavno postali toliko kompleksni da jedan ovek vie nema nikakve anse da se sa njima izbori sam. Ova kompleksnost ima nekoliko uzroka. Prvo, domen problema je uglavnom kompleksan sam po sebi i esto ga je vrlo teko razumeti u meri koja garantuje njegovo uspeno modelovanje. Ozbiljan problem je i to to se eksperti iz razliitih domena npr. iz domena problema i domena projektovanja softvera esto ne razumeju dovoljno dobro.

Uproeni prikaz tradicionalnog reavanja problema Drugo, tekoe u upravljanju procesom razvoja su vrlo velike. Dananji softverski sistemi dostiu veliinu od nekoliko stotina hiljada, pa i miliona redova (linija) koda i mogu da imaju na hiljade modula. Zbog toga je koordinacija projektantskog tima i dobra podela posla od velike vanosti. Tree, diskretni sistemi, a softverski sistemi su upravo takvi, ponaaju se razliito od analognih sistema. Kod ovih drugih, male promene ulaza uvek proizvode male promene izlaza, dok kod diskretnih sistema mala promena ulaza moe sistem odvesti u potpuno drugaiji smer, u stanje kardinalno razliito od prethodnog. Kompleksni sistemi mogu imati izuzetno veliki broj stanja. I konano, pristup koji je korien u analizi i projektovanju takvih sistema, nije mogao da se nosi sa tolikom kompleksnou. Sve je to dovelo do krize softvera, iz koje je jedini izlaz bio uspostavljanje modela sa potpuno razliitim pristupom razvoju softvera. Reenje je pronaeno u objektno-orijentisanom modelu. Njegovi osnovni koncepti su: apstrakcija, enkapsulacija, modularnost i

hijerarhija.

Objektno-orijentisani pristup reavanju problema Apstrakcija Apstrakcija je jedan od fundamentalnih principa pomou koga se ljudi bore sa kompleksnou. Sutina apstrakcije je u uoavanju sutinskih karakteristika objekta koji se posmatra i njegovom razlikovanju od ostalih objekata na temelju uoenih osobina. Ona se fokusira na spoljanji izgled objekta, zanemarujui potpuno njegovu unutranjost, tj. implementaciju.
U U U U

Naravno, osobine koje se uoavaju zavise od samog posmatraa i od njegovih namera. Na primer, veterinar e posmatrajui neku ivotinju, recimo kunog ljubimca maku, zapaati njene osobine koje su povezane sa njenim zdravljem, dok e neko drugi na toj istoj ivotinji posmatrati osobine koje su povezane sa njenom lepotom.

Zadatak projektanta softvera na samom poetku razvoja softverskog sistema jeste da uoi i jasno denie osnovne apstrakcije iz domena problema. Ova faza je od vitalnog znaaja za naredne etape projektovanja.
U U

U objektnim programskim jezicima (misli se na jezike kao to su Java, Smalltalk i C++), svakoj apstrakciji iz domena problema odgovara po jedna klasa. Klase su prototip iz koga se kreiraju primerci (instance). Objekti u programskom jeziku su primerci klasa, i do njih se dolazi instanciranjem (stvaranjem primerka klase).
U U U U

Enkapsulacija Enkapsulacija je koncept potpuno komplementaran apstrakciji. Apstrakcija se fokusira na zapaanje osobina i ponaanja objekata, a enkapsulacija se fokusira na implementaciju koja e dovesti do eljenog ponaanja.
U U U U

Bitan aspekt enkapsulacije je i sakrivanje nebitnih osobina klase, tj. sakrivanje strukture klase. Svaka klasa ima dva dela: interfejs i implementaciju. Interfejs klase obuhvata samo spoljanji izgled klase i preko njega se ustanovljava da li apstrakcija ima eljeno ponaanje. Sa druge strane, implementacija obuhvata realizaciju svih mehanizama koji dovode do tog eljenog ponaanja.
U

U programskim jezicima, implementacija obuhvata kreiranje klasa koje su u prethodnom postupku, tj. apstrakciji, identikovane. Svaka klasa ima svoje podatkelanove i svoje funkcije-lanice (jednim imenom, to su lanovi klase). Iz klasa se mogu, kao pomou svojevrsnog ablona, proizvesti instance (objekti), ijom se komunikacijom ostvaruje funkcionalnost celog sistema. Sama enkapsulacija se realizuje razdvajanjem javnih i privatnih delova klase (jezici obezbeuju jednostavne mehanizme za to). Javni delovi klase obino su funkcije lanice i one ine interfejs te klase ka okolini i mehanizam preko koga se pristupa instancama te klase. Privatni delovi (uglavnom podaci-lanovi koji izraavaju stanje objekta), obuhvataju implementacione detalje koji za korisnika klase nisu vani i stoga on za njih ne mora da zna.
U U U U U U U U U U U U

Ovakva podela vie predstavlja pomo u korienju klase nego li odbranu od njenog neispravnog korienja. Jer, zlonamerni korisnik e uvek moi, uz malo domiljatosti, da doe do privatnog dela klase i da na taj nain slomi njenu enkapsulaciju.

Modularnost Modularnost je koncept povezan iskljuivo sa samim programom, tj. domen problema vie ne igra nikakvu ulogu, a sastoji se u formiranju modula koji mogu da se prevode odvojeno, ali koji ipak imaju dobro denisane veze prema drugim modulima. U tradicionalnom strukturiranom dizajnu, modularizacija programa se uglavnom sastojala od grupisanja potprograma dok je u objektnom dizajnu problem malo drugaiji. Ovde je, naime, prvo potrebno uoiti logike celine koje ini izvestan broj klasa i onda formirati module.
U U

Opta struktura programa Razni jezici se vrlo razliito odnose prema modulima. Moduli C++ nisu nita drugo do fajlovi koji se odvojeno prevode. Interfejsi modula se stavljaju u tzv. header fajlove (kod C++ ekstenzija h) a njihova implementacija u odvojene (.cpp) fajlove. Moduli programskog jezika Ada jesu paketi (package) koji imaju specikaciju i telo. Slina je situacija i sa jezikom Java, koji takoe koristi pakete, s tim to je mogue i formiranje paketa u paketu. Hijerarhija I na kraju, postavlja se pitanje ta raditi kada je broj apstrakcija identikovanih u domenu problema toliki da je njima teko upravljati. Za to je potrebno novo logiko grupisanje apstrakcija - hijerarhija.
U U U U

Postoje dva osnovna naina grupisanja apstrakcija. Prva je ,,jeste hijerarhija (is a hierarchy) ili hijerarhija klasa, a druga je ,,deo od hijerarhija (part of hierarchy) ili hijerarhija objekata. Hijerarhija klasa se u programskim jezicima ostvaruje preko mehanizama nasleivanja (inheritance), a sastoji se u tome da jedna apstrakcija moe biti vrsta neke druge apstrakcije sa dodatnim osobinama. Na primer, ako smo u domenu problema identikovali apstrakcije koje emo nazvati ,,prevozno sredstvo, ,,insko vozilo i ,,brod, onda o druge dve apstrakcije moemo razmiljati kao o specinim vrstama prve. Opravdanje za to nalazimo u injenici da insko vozilo i brod jesu prevozna sredstva. Klase koje odgovaraju ovim apstrakcijama povezane su na taj nain to su klase koje odgovaraju inskom vozilu i brodu izvedene iz klase koja odgovara prevoznom sredstvu (tj. nasleuju njenu strukturu i ponaanje), nasleujui tako kompletnu funkcionalnost te klase i dodajui eventualno neke svoje osobenosti koje ih ine autonomnim entitetima.
U U U U

Naveemo jo jedan primer. Neka smo identikovali sledee apstrakcije u domenu problema: biljka, cvet, voe, jabuka. Jasno je da je cvet vrsta biljke i da njihove klase treba da budu u is a relaciji. Jabuka je vrsta voa, ali nije vrsta cvea. Sa druge strane, jabuka ima cvet.

Stoga, klase koje odgovaraju jabuci i vou su takoe u is a relaciji, ali klase jabuke i cveta nisu. Ove dve klase zapravo formiraju part of hijerarhiju, koja se ogleda u tome da svaka instanca klase jabuke sadri instance (po svoj prilici vie njih) klase cveta. Ovaj primer je bitan zbog jo jednog detalja. Naime, teko da emo doi u situaciju da instanciramo klasu koja odgovara biljkama generalno. Ovakva mogunost u programskim jezicima realizuje se pomou apstraktnih klasa klasa koje ne mogu imati instance.
U U

Tipiziranje Pored ova etiri osnovna koncepta istiu se jo tri koncepta objektnog modela. To su tipiziranje, konkurentnost i perzistentnost. Ovde emo razmotriti samo koncept tipa. Koncept tipa je prilino star i poznat je jo od prvih programskih jezika. Objektni jezici idu dalje tako to kod njih svaka klasa denie novi tip pa se klase kao koncept jezika i tipovi esto poistoveuju. Meutim, to nije ba sasvim tano. Tano je da svaka klasa uvodi jedan novi tip ijim se instanciranjem dolazi do objekata te klase, ali problemi nastaju kada se govori o jednakosti tipova. Ako se vratimo na gornji primer sa biljkama, videemo da svaka jabuka jeste biljka pa emo sa jabukom moi da uradimo sve ono to moemo sa biljkom generalno. Obrnuto ne vai, jer svaka biljka ne mora imati osobine jabuke, pa se ni tip koji uvodi klasa biljaka ne moe poistovetiti sa tipom koji uvodi klasa jabuka. U obrnutom smeru ove dve klase se mogu u potpunosti izjednaiti.
U U

Statiko vezivanje Sa pojmom tipa je u tesnoj vezi nekoliko veoma vanih koncepata objektnog modela. To su statiko i dinamiko vezivanje, kao i polimorzam.
U U U U

Statiko vezivanje podrazumeva da objekti odgovaraju na poruke koje im se alju shodno svojim tipovima koji su denisani u vreme kompajliranja. Dinamiko vezivanje podrazumeva da objekti odgovaraju na poruke prema svom tipu koji imaju u vreme izvravanja programa.
U

Priroda objekata Objekat bi mogao da se denie kao entitet koji modeluje neki deo realnosti i koji ima stanje, ponaanje i identitet. Struktura i ponaanje slinih objekata se deniu preko njegovih klasa. Stoga se izrazi instanca (primerak) klase i objekat mogu koristiti kao sinonimi.
U U U U

Prilikom modelovanja realnog problema, kao kandidati za objekte nameu se ne samo opipljive ili vidljive stvari ve i razne misaone konstrukcije. Stanje objekta obuhvata sve njegove osobine kao i trenutne vrednosti svake od tih osobina. Na primer, osobina bicikla jeste da ima mehanizam za promenu brzine. Ovo je statika osobina bicikla. Dinamika vrednost ove osobine jeste trenutna brzina u kojoj se mehanizam nalazi.

U objektnim programskim jezicima, stanje objekata izraava se preko promenljivih (varijabli) koje denie klasa objekta.
U U U U

Svaki objekat se ponaa na izvestan nain. Kada se nad njim preduzme neka akcija (u objektnoj terminologiji kae se i ,,kada mu se poalje poruka), on reaguje promenom svog stanja. Stoga se moe rei da stanje objekta predstavlja kumulativni rezultat njegovog ponaanja.
U U

Postoji dosta izraza koje razni jezici koriste za mehanizam preduzimanja neke akcije nad objektom. Smalltalk koristi izraz prosleivanje poruka objektu, C++ govori o pozivanju funkcija lanica objekta, dok se u jeziku Java radi o pozivanju metoda objekta. Svi ovi izrazi se odnose na isto poziv funkcije koja je denisana u klasi objekta. Nee poziv svake funkcije dovesti do promene stanja objekta, jer neke funkcije samo oitavaju trenutno stanje objekta, ne menjajui ga pri tome. U skladu sa ovim, esto se pravi podela metoda na:
U U U U

modikatore - to su metodi koji menjaju stanje objekta, selektore - metodi koji pristupaju stanju objekta ali ga ne menjaju, i iteratore - metodi koji pristupaju svim delovima objekta na unapred denisani nain.
U U

Posebnu vanost imaju funkcije koje se koriste za kreiranje i unitavanje objekata kada oni vie nisu potrebni (konstruktori i destruktori). U njima se deniu mehanizmi koji dovode do nastanka objekta, odnosno do pravilnog oslobaanja prostora koji je objekat zauzimao. Veze izmeu objekata Objekat koji je usamljen i ne sarauje sa drugim objektima ne znai gotovo nita. Tek kroz meusobnu saradnju objekata postie se eljena funkcionalnost. Veze izmeu objekata obuhvataju sve pretpostavke koje objekti ine jedan o drugom, kao i sve operacije koje pri tom mogu da izvre. Postoje dve vrste relacija (veza) izmeu objekata. To su linkovi i agregacije.
U

Linkovi obuhvataju sve zike ili konceptualne veze izmeu objekata. Kao uesnici u linku, objekti mogu da budu: aktivni objekti tj. oni koji operiu nad drugim objektima dok se nad njima nikad ne operie. serveri objekti koji nikad ne operiu nad drugim objektima, ve se uvek operie nad njima, i agenti objekti koji mogu da operiu nad drugim objektima ali se moe operisati i nad njima.

Reeno terminologijom programskih jezika, ove veze se ostvaruju kroz pozivanje metoda nad nekim objektom, pri emu se kao argument tog metoda prosleuje neki drugi objekat. Objekat koji se predaje kao argument ponaa se kao server. Objekat iji se metod poziva igra ulogu aktivnog objekta mada moe da bude i agent. Naravno, da bi jedan objekat poslao poruku drugom, njemu ovaj drugi objekat mora

da bude vidljiv. Postoji nekoliko naina na koji jedan objekat moe da bude vidljiv drugom. On moe da bude: globalan za svog klijenta, parametar neke od klijentovih operacija, deo klijentskog objekta ili lokalno deklarisan u nekoj od operacija klijenta

Agregacija podrazumeva da je jedan objekat deo drugog uestvujui na taj nain u formiranju njegovog sveukupnog stanja. Ovakva mogunost denie se tako to klasa objekta sadri podatak-lan tipa klase prvog od njih. Objekat koji sadri druge objekte esto se naziva agregatom ili kontejnerom, dok se objekti koje on sadri nazivaju njegovim atributima.
U U

Priroda klasa Pojmovi klase i objekta su tesno povezani. O objektima se ne moe govoriti bez osvrta na njihove klase. Dok objekat predstavlja konkretan entitet koji postoji u vremenu i prostoru, klasa predstavlja apstrakciju, tj. sutinu objekta, pa se moe rei da su klase skupovi objekata koji dele zajedniku strukturu i ponaanje.
U U

Dijagram relacije izmeu objekata i klasa Da biste koristili neki objekat sve to je potrebno je poznavanje njegovog interfejsa koji obezbeuje detalje vezane za metode i podatke koji su na raspolaganju programeru (tj. oni su deklarisani kao public).

Svaka klasa moe da se posmatra kao dvokomponentna celina. Te dve njene komponente jesu njen interfejs i njena implementacija.
U U U U U U

Interfejs klase ini njen spoljanji izgled sakrivajui strukturu klase i sastoji se od
U U U

deklaracija operacija koje mogu da se izvre nad instancama te klase. Treba napomenuti da u interfejs klase mogu biti ukljuene i deklaracije drugih klasa, varijabli ili konstanti koji kompletiraju posmatranu apstrakciju. Za razliku od toga, implementacija klase jeste njen unutranji izgled koji obuhvata tajne njenog ponaanja.
U

lanovi klase formiraju interfejs klase, odnosno njenu implementaciju u skladu sa specikatorima pristupa tim lanovima. Generalno, programski jezici deniu tri specikatora i to su javni (public), zatieni (protected) i privatni (private) specikator. Po pravilu, ono to je javno dostupno je svakoj klasi, klasama koje su izvedene iz nje i prijateljima klase (klasa sama denie koje klase smatra svojim prijateljima) a ono to je privatno dostupno je samo samoj klasi i njenim prijateljima.
U U

Veze izmeu klasa Veze izmeu klasa su veoma kompleksna tema koja je od velike vanosti za ekasno funkcionisanje programa. Postoji nekoliko vrsta veza, a programski jezici uglavnom obezbeuju podrku za sledee: Asocijacija Asocijacija jeste veza izmeu dve klase u kojoj jedna klasa koristi usluge druge klase na taj nain to sadri pokazivae ili reference na objekte druge klase. Veoma je vano da klasa ne sadri same objekte druge klase ve pokazivae na njih. Stoga objekti te druge klase postoje nezavisno od klase koja ih koristi. Ukoliko klasa sadri pokaziva na samo jedan objekat druge klase, radi se o jedan:jedan asocijaciji. U sluaju veeg broja pokazivaa radi se o jedan:vie asocijaciji, dok se u sluaju da obe klase sadre vei broj pokazivaa na objekte svake od njih radi o vie:vie asocijaciji.
U U

Na primer, klasa koja reprezentuje prodavnicu moe da sadri pokazivae na vei broj objekata klase koja reprezentuje proizvode. Sa druge strane klasa proizvoda moe da sadri pokaziva na samo jedan objekat klase prodavnica, jer jedan proizvod moe biti prodat u samo jednoj prodavnici. Nasleivanje

Nasleivanje je veza izmeu klasa u kojoj jedna klasa nasleuje strukturu i ponaanje druge klase (prosto nasleivanje) ili vie klasa (viestruko nasleivanje). Klasa iz koje se nasleuje se naziva superklasom (nadklasom) ili osnovnom klasom,
U U

dok se klasa koja nasleuje naziva izvedenom klasom ili subklasom (potklasom). Dakle, moe se rei da nasleivanje denie is a hijerarhiju izmeu klasa. Prilikom donoenja odluke da li klasa A treba da bude izvedena iz klase B uvek treba konsultovati pravilo: ,,ako A nije vrsta iz B tada A ne treba da bude izvedeno iz B.
U U

Izvedene klase mogu da nadgrade ili, to je ree, da redeniu ponaanje svoje osnovne klase. Klase koje formiraju hijerarhiju nasleivanja formiraju strukturu stabla u kojoj su najspecinije klase u listovima dok se generalnije klase nalaze u vorovima toga stabla. Klase u listovima mogu da se instanciraju za razliku od generalnih klasa kod kojih to nije uvek sluaj. Programski jezici uglavnom doputaju da se formiraju apstraktne klase koje obezbeuju zajedniki interfejs za skup klasa koje e iz njih biti izvedene pri emu nema smisla da se i one same instanciraju. U takvoj situaciji je dozvoljeno kreirati pokazivae ili reference na objekte izvedenih klasa iji e tip zapravo biti pokaziva na osnovnu, apstraktnu klasu.
U U

Upravo ova osobina, da pokazivai sa tipom ,,pokaziva na osnovnu klasu mogu ukazivati na objekte izvedenih klasa, omoguava jedan od najsnanijih mehanizama objektnog modela polimorzam, tj. svojstvo da objekat izvrava operaciju na nain svojstven izvedenoj klasi kojoj pripada, mada mu se pristupa kao objektu osnovne klase. Pokazivau na objekte osnovne klase se uvek moe dodeliti vrednost pokazivaa na objekte izvedenih klasa ali obratno nije mogue, jer e neminovno dovesti do gubitka informacija. Deo izvedene klase koji ne postoji u osnovnoj klasi bi nepovratno bio izgubljen pa jezici zahtevaju da programer uveri kompajler da upravo to eli. Ovo se postie uglavnom uz pomo tzv. cast operatora.
U U U U

Agregacija Agregacija je tip veze u kome jedna klasa sadri bilo same objekte (ziko sadravanje, sadravanje po vrednosti), bilo reference ili pokazivae na objekte druge klase (sadravanje po referenci). Bez obzira o kom se tipu agregacije radi, bitno je da ove dve klase formiraju celina/deo. Sadravanje po vrednosti ne moe biti unakrsno tj. obe klase ne mogu sadravati objekte tipa one druge klase, dok je u sluaju sadravanja po referenci ova mogunost sasvim regularna.
U U U U

Korienje Korienje oznaava injenicu da jedna klasa koristi usluge druge klase i to na taj nain to njeni metodi kao svoje argumente imaju objekte druge klase ili reference na njih.
U U

Pripremiod Dragan Markovi