1. Problemi kompatibilnosti, kontinuiteta i ponovnog korienja
Problem kompatibinosti je osnovni problem struktuirane metodologije koja se bavi dekompozicijom algoritma. Problem nastaje kada razliiti timovi realizuju razliiti podprograme jednog programa, kada jednu vrstu podataka definiu razliitim strukturama podataka, pa se takvi podprogrami ne mogu implementirati u jedinstven program. Ovaj problem se vidi tek kod velikih projekata kada i mali problem moe da ima katastrofalne posledice. Da bi izbegli ovakav problem, potrebno je na poetku definisati i napraviti sve strukture podataka pa tek onda prisupiti izradi. Problem kontinuiteta svaki softver se vremenom proiruje i nadograuje kako bi opstao na tritu. Struktuirano programiranje ne garantuje da e softver biti proiriv, vrlo je teko raditi izmene kod algoritamsko orijentisanog programa za razliku od unosa izmena u strukturu podataka. Problem ponovnog korienja, odnosno mogunost vietruke upotrebe, radi se o tenji da se jednom napisan i testiran softver u celini ili delimino koristi u razliitim projektima, dakle kad god se pojavi potreba za njim. Ponekad se zahteva i promena ili dopuna programa to je ne mogue ostvariti u algoritamskom programu.
2. Odnos algoritama i strukture podataka Objektni programer se koncentrie ne na analizu reenja, ve na analizu problema, zadravajui se to je mogue due u domenu problema. Cilj analize je identifikovanje elemenata (entiteta) i njihovih veza u domenu problema. Potom se pristupa modelovanju pojedinanih elemenata i veza da bi se traeni program, po pravilu algoritamski kratak, realizovao tek na kraju. Objektno orijentisan postupak, za razliku od sturktuiranog ne polazi od pitanja ta program treba da radi? nego se njime faktiki zavrava. Elementi domena problema (entiteti) modeluju se grupisanjem u klase i opisom klasa kroz naziv, bitne osobine (atribute) i repertorar operacija primenljiv na primene klase koji nose naziv objekti. Klase se realizuju jedan jedini put, a zatim u prevedenom obliku, dakle bez korienja izvornog koda, koristi gde god je to potrebno, ak uz mogunost modifikacije i proirivanja bez intervencija u izvornom kodu. Svaki objekat predstavlja celinu za sebe i ima jasnu logiku barijeru koja ga odvaja od drugih objekata. Kako u pogledu strukture podataka tako i u pogledu algoritama. Ovim problem kompatibilnosti nestaje jer ne postoji nekakva zajednika struktura podataka koja bi stvarala nekompatiblinost. Problemi kontinuiteta i ponovnog korienja softvera reavaju se uz pomo mehanizma nasleivanja koje omoguuje da se objekat menja i proiruje bez upotrebe izvornog koda. Odnosno: - Prvo se ustanovi domen problema kome pripada na problem i pravi se njegov model. - Objektni programer uoava entitete i povezuje ih u klase entiteta i tek onda ga softverski modeluje. - Kljui deo objektnog programiranja je da u podacima ne stoje samo osobine entiteta, ve i operacije nad tim entitetom. - Kad se zavri rad na jednoj klasi poinje rad na drugoj i tek kada se sve ovo zavri 2
programer se vraa na poetni problem. - Kratkoa glavnog programa je karakteristina za C++ - Jednom napisana klasa se vise ne mora menjati ve se ona koristi uz dodavanje osobina sa upotrebom mehanizma nasleivanja. Objektna metodologija se zasniva na nekoliko osnovnih principa: Apstrakcija predstavlja izdvajanje, odnosno uoavanje bitnog i zanemarivanje nebitnog. Skrivanje informacija, podrazumeva da klijentu ne moraju biti poznati detalji realizacije programa, time smanjuje koliinu informacija koju programer i klijent moraju drati u glavi. Razlog skrivanja informacija je smanjivanje kompleksnosti koju programer mora da razume, takoe, ne moraju biti poznati detalji realizacije programa. Inkapsulacija, sredstvo za objedinjavanje strukture i funkcionalnosti. To je tehnika kojom se pri realizaciji objedinjuju deskriptivne i dimanike osobine modela entiteta potujui pri tome princip skrivanja informacija. Modularnost je tehnika razlaganja sloenog softverskog sistema u domenu implementacije na jednostavnije elemenete koji imaju unutranju logiku. Modularnost predstavlja mogunost proirivosti i viekratne upotrebe. Polimorfizam je mogunost da se softverska komponenta ponaa zavisno od konteksta ili okolnosti. Polimorfno se mogu ponaati objekti, promenljive i funkcije. Veze izmeu klasa su jedan od bitnih elemenata, gde se vezama ostvaruje ureenje apstrakcija. Najveu vanost ima nasleivanje, tj. izvoenje klase iz klase, a ono predstavlja prenoenje osobina jedne klase na drugu uz mogunost dopune i modifikacije bez izmene izvornog koda prve klase.
3. Definicija klase i objekta, svojstva objekata Najbitnije osobine objekta su: identitet, stanje i ponaanje. U objektnom sistemu svaki objekat je jedinstven. Identitet predstavlja osobinu objekta da se izdvaja od ostalih objekata i po kome je prepoznatljiv. Stanje je deo prolosti i sadanjosti objekta. Neophodan je za odreivanje njegovog budueg ponaanja. To ponaanje sadri i promenu stanja. Ponaanje je reakcija na pobudu i ono je odreeno operacijama. Iz ovih objanjenja izvodimo definiciju objekta: Objekat je softverski model individualnog pojma za stvar ili proces zasovan na stanjima i koji sadri osobine relevantne za domen problema. Objekat kao sastavni deo moe da ima i druge objekte, odnosno objekti sadre podatke o sebi kao i podobjekti. Objekat zajedno sa svojim podobjektima i njihovim podobjektima ini strukturu objekata. Svi objekti jedne klase imaju istu strukturu i isto ponaanje. Klasa je softverski model klasnog pojma za stvari ili procese zasnovane na stanjima i koja sadri osobine relevantne za dati domen problema. Klasa se sastoji od tri stvari: 1) podatak- lan, 2) objekat-lan, 3) funkcija-lan. 3
Objekat-lan i podatak-lan se jednom reju zovu polje. Od deskriptivnih osobina objekti imaju samo atribute. On otvara problem jer svako tvrdi da je neto drugo. Tako je atribut nekada polje, nekada podatak-lan, nekada i sama metoda. Atributi nisu objekti jer nemaju sopstveni identitet, semantiki su nestabilni i dobijaju smisao samo u sklopu objekta u kome egzistiraju. Aktiviranje funkcije-lanice zovemo slanje poruke ili poruka. Za korisnika klase uvodi se pojam klijent. Principi objektnog programiranja: 1) Sve je objekat u program nema nieg drugog osim objekta, nema podprograma, nema funkcija pa ak ni konstanti. Kod C++-a nije tako jer je on hibridni jezik i kod njega postoje slobodne funkcije. 2) Program je skup objekata koji zadaju poslove jedan drugom, putem slanja poruka, objektni nain razmiljanja je komunikacija objekata. 3) Svaki objekat poseduje sopstvenu memoriju, sastavljenu od drugih objekata (i drugih promenljivih). Objekti ne smeju deliti memoriju. 4) Svaki objekat pripada nekoj klasi. 5) Svi objekti iste klase primaju iste poruke.
4. Deklarisanje klase u C++-u Najvaniji pojam u objektnom programiranju je klasa. C++ za stvaranje klase ima posebnu naredbu class. Definicija klase: class ImeKlase { // podaci-clanovi // objekti-clanovi // funkcije-clanovi }; ImeKlase :: ImeFunkcije { // telo-funkcije } Definicija se deli na dva dela, sastoji se od zaglavlja: tela modula tako da se deklaracija funkcija-lanova nalazi u zaglavlju, a definicija u telu. Definicija klase se zavrava znakom ;. Imena funkcija, klasa, objekata se piu tzv. kamel notacijom (ime svake nove rei u nazivu se pie velikim slovom, poetno slovo za sva imena je malo osim za ime klase koje poinje velikim poetnim slovom). Kao podatak-lan definiemo osobine onoga to modelujemo, a zatim definiemo operacije nad tim to modelujemo. Pri pisanju metoda treba da pazimo da ih ne bude ni premalo ni previe. Ako je metoda premalo naii emo na problem da e nam neka operacija zatrebati a mi je neemo imati na raspolaganju. Metoda set vri se nad objektom i postavlja odreene vrednosti za promenljive. Metoda get slui da se oita promenljiva i ona vraa kao rezultat ba tu promenljivu. Metode koje su u potpunosti definisane unutar klase nazivaju se UMETNUTE ili INLINE metode. Unutar umetnutih funkcija mogu da stoje same naredbe dodele, a ne neke komplikovane naredbe, poput petlji. Detalji realizacije programa treba da budu skriveni, a to znai da delovi klase moraju da budu 4
skriveni. Podaci-lanovi su u najveem broju sluajeva zatvoreni da bi se njihova izmena vrila pod kontrolom. Kontrola promene sadraja podataka lanova je glavni razlog zatvaranja podataka-lanova. Objekti-lanovi se mogu ostaviti otvorenim ili se mogu zatvoriti. Funkcije- lanovi (metode) se uvek otvaraju. Zatvoreni deo poinje slubenom reju private, dok otvoreni poinje reju public. Otvorenost ili zatvorenost traje sve dok se ne pojavi suprotna labela ili do kraja klase. Obino se prvo definie zatvoreni deo. Zatvoreni deo poinje nekad i slubenom reju protected koji omoguava pristup samo nasledniku klase. Referenca ili upuiva u programskom jeziku C++ je alternativno ime za neki podatak. Reference nisu podaci, ne zauzimaju prostor u memoriji, pa se ne moe traiti njihova adresa. Reference se pridruuju nekom podatku koji se ve nalazi u memoriji. One ne mogu da promene vrednost, sve izvrene operacije nad referencama deluju na originalne podatke.
5. Definicija i vrste apstrakcije. Princip skrivanja informacija Apstrakcija je radnja kojom izostavljamo pojedinano, sluajno, sporedno, a zadravamo opte, bitno, nuno, vano. Kada objektno programiramo mi u stvari modelujemo stvari i pri tome se koristimo apstrakcijom. Model je apstrakcijom uproena slika onoga to modelujemo. Od svih apstrakcija, najbitnije su dve: Apstrakcija entiteta je model neke konkretne stvari. Ovu vrstu imamo kada zadravamo samo bitne osobine nekoga entiteta. Objekat i klasa predstavljaju apstrakciju entiteta. Stavljanje u drugi plan detalja realizacije, detalji realizacije su proglaeni za nebitne. Postoje jo i apstrakcija akcije, klasa obezbeuje skup operacija iste kategorije, apstrakcija virtuelne maine, skup operacija nieg niova zamenjuje se jednom operacijom vieg nivoa apstrakcije, sluajna apstrakcija, klasa koja objedinjuje stvari koje nisu meusobno povezane. Princip skrivanja informacija, detalji realizacije ne samo da treba da budu razvojeni od interfejsa, nego treba da budu skriveni od korisnika. Ukoliko ovaj princip nije potovan, program koji smo napisali nita ne valja. Sve to je realizacija treba da bude nedostupno klijentima. Prednost skrivanja informacija je i ta da korisnik i ne oseti kada mi promenimo neku metodu, tj. kada nadogradimo softver.
6. Pojam inkapsulacije i realizacija u C++-u. Pravilo inkapsulacije Inkapsulacija je sredstvo za objedinjavanje strukture, ponaanja u softversku celinu tako da bude ostvarena kontrola pristupa. U C++-u strukturu ine polja, a ponaanje ine metode. Inkapsulacija u C++-u je sredstvo za objedivanjanje podataka-lanova, objekata-lanova i funkcija-lanica u jednu celinu. Nju ine naredba class, zatim ako se metode ne nalaze u klasi, koristi se ::, kontrola pristupa se vri labelama private i public, ili labelom privilegovanog pristupa protected, gde public otvara, a private zatvara lanice klase, dok protected omoguava pristup samo nasledniku klase. Pravilo inkapsulacije: klasu (objekat) treba koristiti disciplinovano u skladu sa dokumentacijom proizvoaa. 5
7. Pojam modula i primena u objektnom programiranju Modul je svaka softverska komponenta koja se realizuje, projektuje, kodira i testira autonomno. Osnovna svrha modula je viekratna upotreba (klasa zahteva viekratnu upotrebu i zato su moduli i klase u jakoj vezi). Modul predstavlja skup servisa namenjen svakom klijentu. U C++-u ulogu modula igra biblioteka. Sastoji se od interfejsa (ekstenzija .hpp) i tela modula (ekstenzija .cpp). Moduli se ne mogu samostalno izvravati, ali slue za smetanje klasa tako to se u interfejsu modula smeta naredba class, zajedno sa eventualnim inline metodama, dok se u telo modula smetaju definicije ostalih metoda. Odnos klase i modula: Klasa se nalazi u modulu, nikad se ne nalazi u glavnom programu. Ova injenica je diktirana Meyer-ovom jednakou klasa=modul, znai svaka klasa se nalazi u sopstvenom modulu. U C++-u ovo nije mogue zbog velikog broja klasa pa je ova jednakost zamenjena Mayer-ovom inkulzijom klasa je podskup modela, to znai da se vie klasa moe nai u istom modelu. U modelu se nalaze klase koje su po nekoj logici srodne.
8. Klasifikacija operacija nad objektima (*) Kod objektnog programiranja sve, ukljuujui i definisanje, je operacija. Klasifikacija operacija se odnosi samo na tipine, a ne na sve mogue metode. Metode klasifikujemo u 5 grupa koje nisu sasvim disjunktne, to su: Konstruktori i inicijalizatori Konstruktori su metode koje imaju zadatak da uestvuju u kreiranju objekata ili promenljive, i mogu, ali ne moraju da sadre njihovu inicijalizaciju. Inicijalizator je operacija kojom se objekat iskljuivo dovodi u neko poetno stanje. U C++ ovaj postupak uglavnom radi konstruktor, koji zauzima prostor u memoriji i pozivaju se implicitno naredbama za definisanje podataka. Destruktori i terminatori Destruktori su specijalne metode koje ili direktno unitavaju ranije kreiran objekat ili uestvuju u toj operaciji. Sama operacija unitavanja promenljive ili objekta podrazumeva oslobaanje njihovog memorijskog prostora, a koriste se kad imamo dinamiko zauzimanje memorije. Terminator prevodi objekat u neko zavrno ili tanije zamrznuto stanje. Razliku izmeu destruktora i terminatora je u tome to posle primene destruktora objekat postaje nedostupan (praktino mu se oduzima identitet), dok ga terminator ostavlja u nekom od stanja iz kojeg se opet moe inicijalizovati bez promene identiteta. Selektori i indikatori su operacije kojima se pristupa sadraju. Selektori vre odabir nekih podataka (tipian selektor u C++-u je .). Indikatori su obine metode kojima se oitavaju obini podaci. Skup indikatora mora biti takav da pomou njih mora biti odreeno stanje objekta esto imaju prefiks get daju informacije o stanju objekta ili o vrednosti promenljive. Modifikatori su metode kojima se menja stanje objekta ili vrednost promenljive. esto imaju prefiks set, oni mogu da budu u klasi, a i van nje. Praktino, nema klase bez modifikatora budui da je u prirodi objekta da bude aktivan. Iteratori su grupa operacija koja se vezuje za sloene tipvoe i klase. Iterator je operacija koja ostvaruje (omoguava) pristup svim delovima kompozitne (sloene) promenljive ili 6
objekta u odabranom redosledu. U C++-u naredba for je iterator za niz. Iterator ima tri elementa: startovanje, prelazak na sledei element i provera kraja.
9. Konstruktori i destruktori u C++-u Svaka klasa mora imati jedan ili vise konstruktora. Konstruktor je metoda za kreiranje objekta iz klase tj. instanciranje klase. Konstruktori su specijalne metode na koje programer ima uticaj. Inicijalizaciju objekta najee radimo u sklopu konstruktora. Osobine konstruktora su sledee: - konstruktor nosi ime klase, svi konstruktori se zovu identino kao i klasa u kojoj se nalaze - konstruktor nema nikakav tip. (Isti je kao i tip klase) - nain poziva je razliit od poziva ostalih metoda (nije z.Complex nego je Complex.z) U klasi iza labele public uvek se prvo piu konstruktori, zatim destruktori, a zatim i ostale metode. Svaka klasa ima bar dva konstruktora, iako ih mi ne napiemo. To su ugraeni konstruktori. Jedan je konstruktor objekta, a drugi konstruktor kopije. Ako napiemo konstruktor ugraeni se vie ne koristi. Ugraeni konstruktor ima ulogu samo u zauzimanju memorije. Podrazumevani konstruktor je konstruktor bez parametara. Ako u klasi ima mnogo konstruktora prilikom implicitnog poziva poziva se podrazumevani konsturuktor. Zato klasu esto tako piemo da napiemo i podrazumevani konstruktor da bih u pomenutom sluaju on bio pozvan. Podrazumevane vrednosti parametara se ne vezuju iskljuivo za konstruktore ve i za slobodne funkcije i metode. Konstruktor kopije slui za pravljenje kopije objekta. Pojavljuje se u kontekstu prenoenja argumenata po vrednosti. On je zaduen da ceo objekat kopira na stek, on postoji u svakoj klasi (ugraen). Konstruktor treba da bude otvorena metoda. Destruktor ima zadatak da uniti objekat. Po njegovoj primeni objekat nije vise na raspolaganju. Pre njega se ne navodi nikakav tip jer je podrazumevani tip void. On se poziva specijalnim znakom ~ (tilda) i nikada nema nikakve parametre. Svaka klasa ima samo jedan destruktor. U sluaju da ima bar jedan podatak-lan koji je u dinamikoj memoriji (heap-u) obaveno moramo samostalno definisati destruktor koji e pri unitavanju objekta osloboditi svu zauzetu memoriju. Destruktor se najee sam poziva kada objekat izae iz opsega. Nema argument, ali moe imati telo u kojem se nalaze naredbe koje se izvravaju prilikom izvravanja destruktora.
10. Kooperativne (prijateljske) funkcije, friend Za kooperativne funkcije se esto koriste jo dva izraza kao to su prijateljske ili friend funkcije. To su slobodne funkcije, koje imaju pristup svim elementima klase (osim polju *this koji je pokaziva objekta na samog sebe) bilo da su public ili private. Ova funkcija nije fiziki lan te klase nego je logiki tesno vezana za tu klasu i nalazi se u istom modulu sa klasom. Dodavanjem identifikatora friend ispred deklaracije funkcije, proglaavamo tu funkciju prijateljskom funkcijom klase u kojoj se nalazi. Prilikom proglaavanja funkcija za prijateljske, princip skrivanja informacija ne sme biti naruen. Da se to ne bi desilo klasa proglaava funkciju prijateljskom. I klase se mogu proglasiti prijateljskim, a takoe i metode jedne klase u 7
drugoj. Izgled: friend opisi_tipa ImeFunkcije(niz argumenata); Korienjem prijateljskih funkcija dobijamo poveanu brzinu izvrenja funkcije, jedna funkcija moe pristupiti lanovima nekoliko klasa. Koriste se kod preklapanja operatora.
11. Pojam i vrste polimorfizma Polimorfizam je konteksno, zavisno ponaanje (odreene kategorije se u zavisnosti od okolonosti ponaaju drugaije). Tako se ponaaju promenljive, objekti i funkcije. 1) Univerzalni polimofizam, jedna kategorija se ponaa razliito u zavisnosti od okolnosti. Imamo dve podvrste: - parametarski polimorfizam funkcije je osobina funkcije da podeava svoje ponaanje prema tipu podataka. Klase i tipovi koji iskazuju osobine ovog polimorfizma su generike klase i generiki tipovi. - inkluzioni polimorfizam je osobina promenljive da moe istovremeno pripadatai veem broju tipova (npr. char koji je i int) 2) AD HOC polimofizam, prividni polimorfizam, jedna oznaka za vise srodnih kategorija koje se razliito ponaaju. Imamo dve podvrste: - preklapanjeje polimorfizam kada u jednoj klasi mogu da se nau funkcije sa istim imenom i operatori sa istim znakom. - koercitivni (prinudni) polimorfizam, promenljiva biva prinuena da se ponaa kao neka druga promenljiva ili kao promenljiva drugog tipa, odnosno prinuena je da promeni svoj tip. Razliito ponaanje iste kategorije.
12. Preklapanje funkcija i operatora u C++-u Mehanizam preklapanja funkcija je jednostavniji od mehanizma preklapanja operatora. Preklapanje funkcija C++ dozvoljava da dve razliite metode u dve klase nose isto ime jer kod poziva datih metoda ne moe da doe do zabune jer se tano vidi na koji se objekat koja funkcija odnosi. Metode ili slobodne funkcije koje u klasama rade isti posao treba da nose isto ime. Samo ime i broj argumenata identifikuju funkciju. Pravilo ouvanja semantike: funkcije koje imaju isto ime treba da rae isti posao tj. da imaju istu semantiku. Preklopljene funkcije se moraju razlikovati po ulaznim parametrima. Preporuuje se da se kod funkcija koje se 8
preklapaju ne koriste parametri na podrazumevanim vrednostima. Deklaracija: double f(double, double) double f(double) Pozivanje: f(x,y), f(x) Preklapanje operatora Svrha preklapanja je olakani rad sa vrednostima i pisanje operacija koje su blie logici. Vai zakon o odravanju semantike, koji kae da prilikom biranja operatora koji preklapamo mi biramo operator koji je po osobinama isti kao na ili bar veoma slian. Samo operatori iz C-a mogu da se preklope, poto preklapamo ve postojee operatore zadravaju se sve osobien osnovnih operatora. Sve klase moemo u dve grupe: 1) Metodski orijentisane klase, nemaju preklopljenih operatora sem operatora dodele = ili relacionih operatora == i !=. 2) Operatorski orijentisane klase, nemaju metoda i preteno se sastoje od prekloljenih operatora i friend funkcija. One su specijalna vrsta. Preporuka: ako operator menja stanje operanda onda ga preklapamo metodom, a ako ne menja stanje operanda onad je kandidat friend funkcija, ali opet se moe preklopiti i metodom. Svaki objekat ima polje *this i ono predstavlja pokaziva objekta na samog sebe. Ovo polje se moe pojavljivati samo u metodama. Preklapanje osnovnog operatora dodele: - najvaniji oblik preklapanja - vri se iskljuivo metodom Complex &operator=(const Complex &z) { r=z.r; i=z.i; return *this; } Preklapanje operatora +=, -=, *=, /= - ove operacije se preklapaju isklju;ivo metodama jer one menjaju stanje objekta Complex &operator+=(const Complex &z) { r+=z.r; i+=z.i; return *this; } Preklapanje relacionih operanada ==, != - ove operande preklapamo iskljuivo slobodnim prijateljskim funkcijama class Complex { . friend int operator==(const Complex &, const Complex &) };
Preklapanje aritmetikih operanada +, -, *, / - preklapa se slobodnim prijateljskim funkcijama Complex operator+(const Complex &z1, const Complex &z2) { Complex w; w.r=z1.r+z2.r; w.i=z1.r+z2.r; return w; } Preklapanje inkrementa i dekrementa ++ - ovo su unarni operatori i menjaju stanje objekta, s toga i preklapamo metodama 1) prefiksni oblik Complex &operator++() { ++r; ++i; return *this; } 2) sufiksni oblik Complex &operator++(int x) { Complex w(r.i); r++; i++; return w; } Preklapanje operatora () - preklapanje ovog operatora omoguuje parametrizovan pristup objektu i njegovo pobuivanje. Preklapa se kao metoda. Preklapanje operatora indeksiranja [ ] - operator indeksiranja preklapamo kada se u private delu klase nalazi skriven neki niz. Preklapa se kao metoda.
13. Konverzija tipova u C++-u Konverzija u C++-u je drugi naziv za prinudni ili koercitivni polimorfizam. Potreba je prinuditi neki objekat da se ponaa kao objekat druge klase. Postoje dve vrste konverzije: automatska ili implicitna (npr. sabiranje double i int tipa) i eksplicitna (npr. (mt)y koju programer definie). Konverzija u klasu ovde spadaju konverzije iz tipa u klasu i iz klase u klasu, gde se konverzija tipa u klasu obavlja preko konstruktora. Konverzija iz klase kada konvertujemo tip iz klase K u klasu A, dodeljujemo konstruktor klasi A, oblika A(K&K) {}. Konverzija iz klase u tip se obavlja preklapanjem operatora typecast i pie se metoda operator tip(){}. Ako hoemo da konvertujemo objekat u tip pisaemo (tip)k.
10
14. Tipovi veza izmeu klasa Veza je model odnosa izmeu pojmova ili klasa. Veze izmeu klasa se dele na: klijentske veze i nasleivanje (najvanija veza). Tipine vrste klijentskih veza su: - Asocijacija povezivanje semantiki nezavisne klase bez posebnih pravila
- Agregacija modeluje odnos celina-deo - Kompozicija odnos celina-deo, ali je ivotni vek dela sadran u ivotnom veku celine, ona predstavlja najvru vezu. - Veze zavisnosti sadre mnogo veza koje nemaju veze meusobno, predstavlja aroliku grupu veza.
15. Agregacija Ova veza izmeu klasa modeluje odnos celina-deo. U objektnim jezicima ne postoje posebna sredstva za njenu realizaciju. Postoje dva tipa koja se razlikuju po vrstini veze: Kompozicija (veza po vrednosti) vrsta veza, ako je klasa A komponovana od klase B, tada je objkat klase B objekat-lan klase A i oni dele istu memoriju. ivotni vek objekta klase B sadran je u ivotnom veku objekta klase A. Ovo je najvra veza izmeu klasa. Svaka veza se snabdeva kardinalitetom koji predstavlja odnos instance. Svakoj vezi se moe dodati ime.
, jedna du sadri dve krajnje take ista agregacija (veza po referenci) objekat ija je klasa A komponenta neke druge klase B moe da postoji pre objekta ija klasa sadri njegovu tj. ivotni vek objekta klase A ne zavisi od ivotnog veka objekta klase B. Veza moe da se realizuje pomou niza ili liste. 11
, jedan fakultet sadri 0 ili vie odseka
16. Definicija i osobine nasleivanja Nasleivanje modeluje odnos izmeu dve klase. Sa jedne strane predstavlja vezu generalizacija-specijalizacija ili opte-pojedinano (npr. veza budilnik-sat)
Sa druge strane nasleivanje je bitno kao sredstvo kojim se obezbeuje viekratna upotreba. Definicija: Nasleivanje predstavlja preuzimanje kompletnog sadraja neke druge klase uz mogunost dodavanja lanova svih vrsta i modifikacije metoda.
Osobine nasleivanja: - Izvoenje klase B iz klase A ne zahteva pristup njenom izvornom kodu. - Klasa B preuzima sve to sadri klasa A, s tim da moe jo sadraja da se doda. U klasi B se mogu dodati nova polja ili metode. - Mogunost modifikacije metoda. Isti posao u klasi A i klasi B se ne izvrava istom metodom. Modifikacija metode se zove redefinisanje, jer nema drugog naina da metodu promenimo nego da je ponovo napiemo pod istim imenom. - Tranzitivnost ako klasa C nasleuje klasu B, a ona nasleuje klasu A, onda klasa C nasleuje klasu A. - Viestruko nasleivanje nasleivanje kod koga klasa nasleuje dve ili vie klasa.
12
17. Demetrin zakon i zakon supstitucije Demetrin zakon povezuje nasleivanje i inkapsulaciju. Npr. imamo klase A i B i klijenta x. Odnos izmeu A i B je mnogo vri nego izmeu B i x. Metode klase B imaju pristup public delu klijenta x. Meutim metode iz klase B mogu da pristupaju i private delu klase A.
Demetrin zakon: Metode klase ne smeju ni na koji nain da zavise od strukture neke druge klase osim neposrednog pretka. Zakon supstitucije (povezuje nasleivanje i inkluzivni polimorfizam): Ako za svaki objekat s klase S postoji objekat t klase T takav da se proizvoljni program definisan nad klasom T ponaa isto kada se t zameni sa s, tada je S izvedena klasa od T. (Ako se predak zameni potomkom, u programu nita ne sme da se promeni. U ovom sluaju se potomak ponaa polimorfno jer se ponaa kao predak).
18. Realizacija nasleivanja u C++-u Postojanje nasleivanja oznaava se kao: class B: aA, gde apredstavlja kontrolu pristupa i moe da bude public, private ili nita. Kod nasleivanja na ovaj nain se regulie pristup metodama iz klase potomaka. Postoji i trea vrsta komande pristupa protected, a njoj imaju pristup sve klase koje nasleuju tu klasu, ali ostale klase nemaju. Tabela pristupa:
Nasleivanje lanovi osnovne (bazne) klase a public protected private public public protected private protected protected protected private private private protected private
Ne nasleuju se: konstruktor, destruktor, operator dodele i prijateljske funkcije. Redefinisanje metode izvodi se tako to se metoda ponovo napie u klasi potomka. Nova metoda ne mora da ima iste parametre, niti tip parametara, sve moe da se razlikuje sem imena.
19. Inkluzivni polimorfizam u C++-u Vrsta polimorfizma u kojoj se neka promenljiva ponaa kao da menja tip (primer: tip char kao podtip int-a ima sve njegove osobine, ali i neke sluajne dodatne). Opte pravilo inkluzivnog polimorfizma: potomak moe zameniti pretka, a obrnuto ne. Jedan objekat zbog logike moe da pripada samo jednoj klasi, ali on moe u operaciji da bude tipa klase ili tipa nekog od svojih predaka. Inkluzivni polimorfizam se javlja u dva oblika: - operacija dodele imamo dva razliita memorijska prostora. Posle izvrene operacije dodele oba objekta se ponaaju kao i pre. Potomak se ponaa polimorfno. 13
- prenos argumenata posle dodele pPr pokazuje na isti objekat. Sada po izvrenju dodele pozivamo metodu m() iz pPr i bie pozvana metoda pretka.
Dodela vrednosti izmeu predka i potomka se vri pokazivaima: 1) Pr = Po , 2) *pPr = *pPo , 3) pPr + pPo
20. Virtuelne funkcije
Poetni problem: metoda m() je napisana u vreme formiranja pretka. U njoj se nalazi poziv metode k(), takoe iz pretka. U potomku je redefinisana metoda k(). Posle se u program poziva metoda m(), ali ona poziva metodu k() iz pretka, a ne redefinisanu metodu k() iz potomka. Da bi se to reilo, trebalo je modifikovati prevodilac kod poziva metoda, pa se metode vie ne pozivaju kao ostale funkcije. Svaka klasa snabdeva se jednom tabelom koja se naziva V-tabela. U njoj se nalazi veliina objekta i adrese virtuelnih metoda. U V-tabeli izvedene klase nalazi se adresa redefinisane virtuelne metode (virtuelnost se ne nasleuje) i iz nje e se pozvati odgovarajua metoda k() iz potomka. Prijateljske funkcije ne mogu biti virtuelne, ni konsturktor ne moe biti virtuelna metoda. Funkcije se deklariu dodavanjem modifikatora virtual ispred njihove deklaracije u osnovnoj klasi i on se ne mora ponovo pisati pri ponovnim 14
deklaracijama u izvedenim klasama. Deklaracije virtuelnih metoda u osnovnoj i u svim izvedenim klasama moraju biti istovetne po imenu, tipu koji vraaju i broju i tipu parametara. Virtuelna metoda koja nije definisana u osnovnoj klasi naziva se apstraktnom metodom (virtuelnoj dodamo =0). Praksa je da se za virtuelne metode proglaavaju metode za koje se oekuje da e kasnije biti redefinisane, a naroito apstrakne metode i destruktori (da bi se svaka nasleena klasa unitila svojim destruktorom).
21. Viestruko nasleivanje Viestruko nasleivanje je nasleivanje od vie predaka. Ono podrazumeva da se nasleuje iz vie klasa. Klasa X nasleuje sve od A i sve od B.
Sutinski problem: u domenu problema ne postoji mnogo situacija gde moemo koristiti viestruko nasleivanje. Pojavljuje se i problem pogrenog izvoenja (npr. pegaz, ne moemo izvesti od konja i ptice). Tehniki problem: Klase A i B od kojih se nasleuje mogu imati metode sa istim imenom. C++ preputa programeru da rei problem. Programer prvo uoi koja mu metoda treba pa redefinie metodu pozivajui tu koja mu treba iz prethodnih klasa. Ponovno nasleivanje Klasu P nasleuju dve klase i njih mogu da nasleuju druge klase. Znai postoje dve grane nasleivanja koje vode od P. Ako se pojavi neka nova klasa X koja nasleuje po jednog predstavnika iz obe grane nastae problem jer X dva puta nasleuje osobine P. Ovo se reava virtuelnim nasleivanjem.
22. Generike klase Generike klase su klase koje imaju druge klase kao parametre (parametrizovan polimorfizam). Parametrizovane su nazivima klasa. One omoguuju odnos opte-pojedinano i realizuju parametraski polimorfizam. Mehanizam za izvoenje generinosti su template. 15
Primer generike klase je stek. template<argument, argument, , argument> opis gde argument mogu oznaavati tipove ili konstante. U opisu se nalazi definicija klase ili definicija funkcije: template<class T, int k> class VKT { .. };
23. Veza asocijacije Veza asocijacije je veza izmeu dve semantiki nezavisne klase. Ovakva veza je veoma znaajna u projektovanju baza podataka.
Kada ustanovimo da veza postoji onda je bitno odrediti kardinalitet. Asocijacija moe biti i viestruka.
Kardinalitet pokazuje koliko objekata jedne klase moe biti u vezi sa jednim objektom iz druge klase. U ovom primeru jedan ili vie profesora (1..*) predaje jedan ili vie predmeta (1..*). Veza se realizuje preko pokazivaa, pa se moe predstaviti listom ili nizom (za nastavnika napraviti listu predmeta koje predaje ili obrnuto, kad se predmet unitava kao objekat mora se iskljuiti iz nastavnikove liste).
16
24. Veze zavisnosti Veze zavisnosti predstavljaju najrazliitije veze izmeu objekata dveju klasa. (zavisnost objakata klase A od objekata klase B). Ako objekat klase A zavisi od objekta klase B, on ne moe da funkcionie ako se pre toga ne konstruie objekat klase B. Treba izdvojiti samo jednu pod imenom veza korienja.
Ova veza se pojavljuje kada u najmanje jednoj metodi klase A figurie formalan parametar iz druge klase B.
25. Izuzeci Izuzetak je namerno izazvan dogaaj ija je svrha predupreivanje otkaza i koji ostavlja program u zakoenom stanju. Obavezno je praen pojavom nestanka. Incident je vidljiva manifestacija otkaza. Sistem za rukovanje izuzecima je upravo zasnovan na vidljivoj manifestaciji incidenta. Izuzetak je namerno izazvan incident s namenom spreavanja pojave incidenta jer je izuzetak u stvari kontrolisan. ak ako klijent ne eli da reaguje na izuzetak, dolazi do havarijskog prekida programa, tj. jednom reju preko izuzetka se jednostavno ne moe prei ili drugim reima on ne moe ostati neprimeen. Izuzetak u sebi objedinjava havarijski prekid programa i korienje rezultata podprograma kao koda uspenosti. Izuzeci se ne mogu simulirati zbog postojanja treeg kanala za razmenu podataka izmeu metode i klijenta. Prvi kanal slui za slanje podataka u metodu, preko drugog se vraa rezultat dok trei kanal slui za slanje poruka o izuzecima. On se ne vidi i prva dva ostaju slobodna za standardne prenose pa se tim reava problem izraunavanja rezultata. C++ ima dva naina za rukovanje izuzecima, u zavisnosti kako se modeluju, tj. izuzeci se mogu softverski realizovati kao objekti ili kao vrednosti. Generisanje izuzetaka i njegovo prosleivanje klijentu se vri naredbom trow. Prihvatanje i obrada se vri posebnom nardbom try. U sklopu try bloka nalaze se rukovaoci pozivima, svi nose naziv catch, a u zagradi se nalaze kvaziparametri jer tu moe da stoji pravi parameter ili samo tip parametra. Potom slede naredbe C++-a. Moe biti vie catch naredbi i stavljaju se jedna iza druge. Deo koda u try se normalno izvrava. Bilo gde da se naie na izuzetak izvravanje koda klijenta se prekida i prelazi se na deo sa rukovaocima izuzetaka. Ispituje se koji od njih moe da prepozna tip 17
izuzetka i pristupa se prvom na koji se naie, a da moe da primi taj izuzetak.
26. Rukovanje izuzecima kao vrednostima U ovom sluaju izuzetak je obino enumeracija jer sa tim obezbeujemo da znamo u emu je greka. Kada se generie izuzetak funkcija ne mora da vraa vrednost. Kod koji moe da sadri rizine izuzetke se nalazi u try bloku pa kad se naie na izuzetak pozove se rukovalac izuzecima. Meu svim rukovaocima postoji jedan poseban koji se zove univerzalni rukovaoc izuzecima, on je posebna vrsta rukovaoca koji prihvata sve izuzetke. On se stavlja na kraj, tj. posle svih ostalih rukovaoca. enum ErrorCode {underflow, overflow}; T top() { if (t<0) throw underflow; return s[t]; } void push (T el) { if(t==capacity-1) trow overflow; s[++t]=el; } // u klijentu je try { . } catch (ErrorCode err) { switch(err) { case underflow : cout<<Stack underflow<<endl; break; case overflow : cout<<Stack overflow<<endl; } }
27. Izuzetak kao objekat Programer formira sopstvene klase sa izuzetcima. Npr. mogli bi da napravimo jednu klasu underflow, a drugu overflow. Ovde je zgodno to to reakciju moemo da ugradimo u klasu. Kada su neke klase izvedene, kod rukovaoca, rukovaoc potomkom mora da se nae pre rukovaoca pretka. Ovde emo ove dve klase izvesti iz abstraktne klase StackException. Sve e bti isto osim to emo umesto dve imati samo jedu catch naredbu.
18
class StackException { public: virtual void action()=0; }; class StackUnderflow: public StackException { public: void action() { cout<<Stack underflow<<endl; } }; class StackOverflow: public StackException { public: void action() { cout<<Stack overflow<<endl; } }; // u klijentu je: try { // rizicne naredbe } catch (StackException &ex) { ex.action(); }
28. Propagacija izuzetaka
Ukoliko doe do izuzetaka u mk njen rad je prekinut. Izuzetak se pojavljuje i u mk-1 (i svaka prethona) moe da pristupi na tri naina. Kao prvi nain ona moe da ignorie izuzetak. Princip je da izuzetak ne sme da proe neprimeen. Ovde on ne prolazi neprimeen jer bi sva odgovornost bila samo na klijentu, ve samo mk prosledi izuzetak dalje. Drugi nain je da se propagacija zaustavlja kod naredbe try gde se izuzetak obrauje i onda se rad zaustavlja. Trei nain je kombinacija prva dva. Neka neka funkcija ima try obradu izuzetaka, ali samo ga delimino obradi i prosledi dalje.