Presentation is loading. Please wait.

Presentation is loading. Please wait.

Oblikovanje programske potpore

Similar presentations


Presentation on theme: "Oblikovanje programske potpore"— Presentation transcript:

1 Oblikovanje programske potpore
MODULARIZACIJA I OBJEKTNO USMJERENA ARHITEKTURA 1. dio

2 Problemi u oblikovanju programske potpore
Ranjivost na globalne (ili široko dijeljene) varijable Klasični programski jezici kreiraju dijeljenje varijabli (blokovske strukture, globalne varijable). Nenamjerno otkrivanje interne strukture Vidljiva reprezentacija može se manipulirati na neželjen način. Prodiranje odluka o oblikovanju Jedna promjena utječe na mnoge module. Disperzija koda koji se odnosi na jednu odluku Vrlo je teško utvrditi što je sve pogođeno promjenom. Povezane odluke o oblikovanju Povezane definicije raspršuju odluke o oblikovanju (trebale bi biti lokalizirane - na jednom mjestu)

3 Rješenje problema u oblikovanju programske potpore
Rješenje: modularizirati sustav Modularizacija omogućuje bolje: Upravljanje sustavom (podijeli i vladaj). Evoluciju sustava (promjene jednog dijela ne utječu na druge dijelove). Razumijevanje (sustav se sastoji od razumno složenih dijelova). Ključno pitanje: Koje kriterije koristiti za modularizaciju (tj. što je to modul) ? Nekoliko najčešćih odgovora: Dio koda (to je najčešći ali vrlo ograničen pogled). Jedinica kompilacije, koja uključuje deklaracije i sučelje. D.Parnas, Comm. ACM, : “Jedinica posla.”

4 Povijest modularizacije
Glavni program i subrutine Dekompozicija u procesne korake s jednom niti izvođenja. Funkcijski moduli Agregacija (skupljanje) procesnih koraka u module. Apstraktni tipovi podataka (ADT - Abstract Data Types) Zatvaranje podataka i operacija, skrivanje predstavljanja. Objekti i objektno usmjerena arhitektura Procedure (metode) se povezuju dinamički, polimorfizam, generalizacija i nasljeđivanje. Komponente i Oblikovanje zasnovano na komponentama (CBD Component based design) Višestruka sučelja, posrednici, binarna kompatibilnost. vrijeme

5 Glavni program i subrutine

6 Glavni program i potprogrami (subrutine)
Obilježja: Hijerarhijska dekompozicija Temeljena na odnosu definicija – uporaba. Pozivi procedura su interakcijski mehanizam. Jedna nit izvođenja Potpomognuto izravno programskim jezikom. Hijerarhijsko rasuđivanje Ispravno izvođenje rutine ovisi o ispravnom izvođenju subrutine koja se poziva. Implicitna struktura podsustava Subrutine su tipično skupljene u (funkcijske) module.

7 Apstraktni tipovi podataka
Krajem 1960 dobri programeri su imali intuiciju: “Ako dobro definiraš strukture podataka ostatak programa je mnogo jednostavniji.” 1970: pojavljuje se intuicija o skrivanju informacija i apstraktnim tipovima podataka (ADT – abstract data types): Definicija: ADT je skup elemenata danog tipa i skup pridruženih operacija definiranih s matematičkom preciznošću neovisno o implementaciji. Skup elemenata je jedino dohvatljiv preko skupa operacija. Skup operacija se često naziva sučelje (engl. interface). Programski jezici mogu po volji i različito implementirati ADT. To je temeljna ideja koja je zaživjela kasnije u objektno usmjerenoj arhitekturi programske potpore.

8 Apstraktni tipovi podataka - primjer
Neka k označuje cijeli broj (engl. integer). ADT integer: Data Tip elemenata: cijeli brojevi s opcijskim prefiksom plus ili minus. Takav jedan cijeli broj s predznakom neka je N. Operations construct() – kreira novi cijeli broj. add(k) – kreira novi cijeli broj koji je suma N i k. Posljedica ove operacije je sum=N+k. To nije naredba pridruživanja, već matematička operacija koja je istinita za svaku vrijednost sum, N, k nakon operacije add. sub(k) – slično kao gore kreira novi cijeli broj. Posljedica je sum=N-k. set(k) – Posljedica je N=k. . . . Gornji opis naziva se specifikacija za ADT integer. Imena add, sub, … , su sintaksa, dok je semantika određena preduvjetima i posljedicama (post-uvjetima) operacija.

9 Izvor: T.C.Lethbridge, R.Laganiere, 2005
Objektno usmjerena arhitektura (engl. Object-Oriented Architecture) temeljni koncepti Izvor: T.C.Lethbridge, R.Laganiere, 2005

10 Što je objektno usmjerenje (u odnosu na proceduralno)
Proceduralna paradigma: Program je organiziran oko pojma procedura (funkcija, rutina). Proceduralna apstrakcija OK za jednostavne podatke Dodaje se podatkovna apstrakcija Grupiranje dijelova podataka koji opisuju neki entitet i manipulacija s njima kao cjeline. Pomaže u smanjenju složenosti sustava. Npr. records i structures (ali različiti records traže različite procedure). Organizacija podatkovnih apstrakcija u kontekstu proceduralnih apstrakcija. Objektno usmjerena paradigma: Organiziranje proceduralnih apstrakcija u kontekstu podatkovnih apstrakcija.

11 Pogled na dvije paradigme ( npr. bankovni sustav)
Procedure manipuliraju različitim tipovima podataka Procedure su svezane (zatvorene) s podacima hijerarhijski odnos

12 Objektno usmjerena paradigma
Pristup rješenju problema u kojem se sva izračunavanja (engl. computations) obavljaju u kontekstu skupa objekata. Objekti su instance programskih konstrukcija koje nazivamo razredima (klasama). Razredi su Podatkovne apstrakcije Sadrže proceduralne apstrakcije koje izvode operacije na objektima. Program u radu se može sagledati kao kolekcija objekata koji u međusobnoj kolaboraciji obavljaju dani zadatak.

13 Razredi i objekti Objekt
Komad strukturiranih podataka programa u izvođenju. Može predstavljati bilo što iz realnog svijeta čemu se mogu pridružiti: Obilježja (engl. properties) koja karakteriziraju objekt. Obilježja opisuju trenutno stanje objekta. Ponašanje (engl. behaviour) Kako objekt reagira (što može rezultirati u promjeni stanja). Može simulirati ponašanje objekata iz realnog svijeta.

14 Objekti u bankovnom sustavu (UML notacija)
Naziv objekta Obilježje (Ponašanje nije prikazano) U prikazu arhitekture temeljene na objektno usmjerenoj paradigmi ne bavimo se programskim kodom niti problemima smještaja u memoriji ili disku.

15 Razredi (klase) Razred:
Jedinica apstrakcije u objektno usmjerenoj paradigmi. To je jedan definiran tip podataka. Razredi predstavljaju slične objekte (uzorak ili “template” sličnih objekata). Objekti su instance razreda. Razred je programski modul koji sadrži: Opis strukture instanci, tj. podatke koji implementiraju obilježja (engl. properties). Metode (procedure, funkcije) koje implementiraju ponašanje objekata (npr. promjenu obilježja).

16 Da li je nešto razred ili instanca (objekt) ?
Nešto je razred ako može imati instance. Nešto je instanca ako je jasno da je to jedan član skupa definiranog kao razred. Film Razred, instance su individualni filmovi. Bubanj (namotaj) filma: Razred; instance su fizički bubnjevi (filmovi). Bubanj filma sa serijskim brojem W19876 Instanca razreda npr. ReelOfFilm Science Fiction Instanca razreda Zanr (druge instance: triler, ljubić, itd.) Science Fiction Film Razred, instanca je npr.: ‘Star Wars’ Prikazivanje filma ‘Star Wars’ u kinu Europa u 19:00: Instanca razreda PrikazivanjeFilma

17 Imenovanje razreda Koristi velika slova BankAccount a ne bankAccount
Koristi imenice u singularu. Koristi ispravnu razinu generalizacije Ne Profesor_na_FER_u nego općenitiji pojam, npr. Zaposlenik_na_FER_u Budi siguran da ime ima samo jedno značenje. Npr. ‘Bus’ ima više značenja.

18 Razredi (klase) Primjer razreda Circle u Javi: public class Circle{
//podaci koji implementiraju obiljezje public double x,y; // srediste public double r; // radius //metode (procedure) koje implementiraju ponasanje public double opseg(){return 2 * 3.14 *r}; public double povrsina(){return 3.14 * r *r} }

19 Razlika instanca - objekt
Nema razlike, odnosi se na istu jedinku (entitet) Razlika je nastala u korištenju prirodnog jezika. Npr. kćer – djevojka “Imala je sedam kćeri” (ne djevojaka). “Vidio sam prekrasnu djevojku” (ne kćer).

20 Varijable instanci (objekata) (engl
Varijable instanci (objekata) (engl. Instance Variables definirane unutar razreda) Varijable definirane unutar razreda odgovaraju (različitim) podacima koji se nalaze u svakoj instanci toga razreda. Varijabla je mjesto (u instanci, objektu) gdje se smještaju podaci (place-holder, slot, field). Primjer varijable instanci u Circle razredu: public double r; Postoje dvije skupine varijabli instanci: Atributi (mjesta za podatke koji opisuju obilježja objekta) To su jednostavni podaci kao npr.: dateOfBirth Asocijacije (opisuju pridruživanje između instanci različitih razreda). To su odnosi (engl. relationships) prema drugim instancama drugih razreda. Npr.: supervisor, (odnos prema instancama razreda Manager. coursesTaken (odnos prema instancama razreda Course).

21 Varijable instanci (objekata)
Ako razred ima varijablu instanci var: tada sve instance toga razreda imaju mjesto (“field” ili “slot”) s nazivom var. Stvarni podaci smješteni u varijablu var razlikuju se od objekta do objekta (od instance do instance). Npr.: Razred: Employee Variabla: supervisor Postoje različiti supervizori u svakoj instanci razreda Employee (različite vrijednosti u varijabli supervisor).

22 Varijable i Objekti – uobičajena zabuna Varijable i objekti su zasebni i različiti koncepti
Tip varijable: Određuje koje razrede objekata može sadržavati.. U Javi postoje dva tipa: Primitive (sadrži jednu vrijednost, nije objekt, evaluira se u vrijednost koju sadrži, npr. char, boolean, int, double). Reference (ili object) tip (evaluira se u adresu objekta). Slično "pointeru" ali u širem kontekstu. U različitim trenucima može se odnositi na različite objekte iz određenog razreda (tipa).. Jedan objekt može u isto vrijeme biti referenciran u više različitih varijabli (više varijabli može sadržavati adresu istog objekta). Referenciranje je općenitiji pojam od “sadrži”. U varijabli tipa “reference” stvarno se smješta adresa objekta na koji se referencira, a ne sam objekt. Objekt je dostupan preko varijable koja ga referencira (zato česta zabuna).

23 Varijable i Objekti – uobičajena zabuna Varijable i objekti su zasebni i različiti koncepti
Primjer: Neka postoji razred Ball. Deklariramo varijablu b1 koja može referencirati objekt iz razreda Ball: Ball b1; // varijabla b1 je “reference” tipa Ball // To nije objekt. // U nju se mogu “smjestiti” samo // objekti razreda Ball. Za sada još ništa // nije u njoj “smješteno” (referencirano). Sada želimo kreirati objekt iz razreda Ball i želimo da varijabla b1 referencira baš taj objekt (pridružili smo ga varijabli b1): Ball b1 = new Ball(); // rutina Ball() “konstruira” objekt iz razreda // Ball. Taj objekt ne zivi u zraku vec je // referenciran varijablom b1. Taj isti objekt može biti referenciran i od neke druge varijable: Ball b2 = b1; Obje varijable referenciraju isti objekt iz razreda Ball. Primjer pokazuje da pojam “smještanje podataka u varijablu” treba shvatiti općenitije i apstraktnije. Ovdje “smještanje” = “referenciranje na”.

24 Varijable razreda (engl. Class variables)
Varijable razreda se identificiraju ključnom riječi (modifikatorom) static. Varijabla razreda može sadržavati neku vrijednost. Tu istu vrijednost dijele sve instance toga razreda. Ne postoji više kopija te varijable (kao za varijable instanci), već samo jedna pridružena razredu. (u C++ “static data member”). Uvijek postoji samo jedna vrijednost te varijable Varijable razreda su korisne za: “Default” ili ‘constant’ vrijednosti (npr. PI). Lookup tablice i slične strukture. Varijable razreda “glume” globalne varijable u objektno usmjerenom pristupu (u Javi svaka varijabla mora biti deklarirana unutar nekog razreda pa nema ni konflikata u nazivima varijabli).

25 Varijable razreda (engl. Class variables)
Primjer varijable razreda: public class Circle{ public static int num_circles; // varijabla razreda public double x,y; // varijable instance public double r; // varijabla instance public double opseg(){return 2 * 3.14 *r}; public double povrsina(){return 3.14 * r *r} } Kako se pristupa varijabli razreda ? - preko naziva razreda (a ne preko objekta – tj. varijable koja referencira taj objekt): System.out.println(“No of circles:” + Circle.num_circles);

26 Metode razreda (engl. Class Methods, Static Methods)
Analogno varijablama razreda, postoje metode definirane unutar nekog razreda i deklarirane ključnom riječi static. Primjer poziva takve metode: double distance = Math.sqrt(dx*dx + dy*dy); Ovdje je metoda (postupak) sqrt() definirana unutar razreda Math. Metoda se poziva preko naziva razreda a ne preko objekta (tj. varijable koja referencira objekt).

27 Lokalne varijable u metodama
Slično kao što objekti pohranjuju svoja stanja u slotove, procedure (metode) će često privremeno pohraniti stanje u svoje lokalne varijable. Sintaksa deklaracije lokalne varijable je slična (npr.: int count = 0; ). Ne postoji posebna ključna riječ za određivanje lokalnih varijabli. Doseg varijable je unutar zagrada procedure (metode). Lokalna varijabla je vidljiva samo u metodi gdje je deklarirana. Nije joj moguće pristupiti iz ostatka razreda. Kreiraju se pri izvođenju metode i nestaju s njenim završetkom.

28 Varijable kao parametri metode (procedure)
Neka jedna main metoda ima oblik:: public static void main(String[] args) Ovdje, args varijabla je parametar metode main. Parametri se uvijek klasificiraju kao "varijable". To se odnosi i na druge konstrukcije koje prihvaćaju parametre (npr. constructors i exception handlers). Broj parametara metoda u objektno usmjerenoj paradigmi treba biti što manji.

29 Metode i operacije Metoda (način izvođenja neke operacije) = procedura, funkcija, rutina (u C++ “function member”). Metode implementiraju ponašanje objekata (npr. promjenu njegovog obilježja) kroz kodiranje. Operacija (definicija): Proceduralna apstrakcija više razine nego metoda. Operacija specificira tip ponašanja. Neovisna je o kodu koji implementira njeno ponašanje. Npr. izracun_povrsine (sasvim općenito). Jedna operacija može biti implementirana s više metoda.

30 Metode i operacije Metoda je proceduralna apstrakcija koja se koristi za implementaciju ponašanja razreda. Nekoliko različitih razreda može imati metodu istog naziva. Sve te metode implementiraju istu apstraktnu operaciju na način kako odgovara pojedinom razredu (tj. različito). Npr.: Operacija izracun_povrsine za pravokutnik je različito implementirana nego za krug (iako je ime metode isto).

31 Metode - primjer Neka su u razredu Ball deklarirane i definirane dvije metode: setSpeed(); // postavlja brzinu na int vrijednost getSpeed(); // očitava brzinu u int Svi stvoreni objekti iz Ball imaju te dvije metode. Sad stvorimo objekt referenciran varijablama b1 i b2, te zovemo metode: Ball b1 = new Ball(); Ball b2 = b1; // b1 i b2 referencira // isti objekt b1.setSpeed(50) // u objektu kojega referencira // b1 postavlja brzinu na 50 b2.setSpeed(100) // u objektu kojega referencira // b2 postavlja brzinu na 100 Jasno da se radi o istom objektu i vrijedi zadnje postavljanje brzine, te: int current_speed = b1.getSpeed(); vraća vrijednost 100 i stavlja u neku varijablu “primitivnog” tipa int.

32 Metode - primjer U ranijem primjeru metoda smješta rezultat u varijablu int current_speed i pozvana je konstrukcijom: int current_speed = b1.getSpeed(); a ne: int current_speed = getSpeed(b1); Vidljivo je da je u fokusu objekt b1, a ne poziv procedure. To pokazuje zašto se ova paradigma programiranja naziva “objektno usmjerena”.

33 Vidljivost operacija U modeliranju objektno usmjerenog sustava (npr. u UML dijagramima) potrebno je jasno označiti vidljivost operacija (public, protected, private) koje se implementiraju metodama. Operacija obilježena ključnom riječi public dostupna je svima (javno). Operacija obilježena ključnom riječi protected dostupna je unutar hijerarhije razreda u kojem je deklarirana. Operacija obilježena ključnom riječi private dostupna je unutar razreda u kojem je deklarirana. U nekim programskim jezicima ako vidljivost nije označena podrazumijeva se private. Broj javnih metoda u nekom razredu trebao bi biti što manji. Mnogo javnih metoda sugerira da bi neke trebale biti privatne.

34 Više metoda istog naziva – “overloading”
U objektno usmjerenom programiranju dopušta se postojanje više metoda istog naziva, ali različitog broja, tipova i mjesta parametara. Može postojati jedno ime s više značenja = "overloading" (pretrpavanje, preopterećenje) imena. Pri pozivu, prevoditelj (engl. compiler) odabere onu metodu koja ima isti naziv, broj i tip parametara, te su parametri na istom mjestu kao i u pozivu metode. “Overloading” metode ne smije se brkati s “overriding” (nadjačavanje) ni polimorfizmom (objasnit će se kasnije).

35 Više metoda istog naziva – “overloading”
Neka postoji razred DataArtist koji može kaligrafski crtati različite tipove podataka (string, int, …). Umjesto različitih naziva metoda: drawString, drawInteger, drawFloat, … možemo uporabiti isti naziv draw(), ali uz različite parametre: public class DataArtist { ... public void draw(String s) { ... } public void draw(int i) { ... } public void draw(double f) { ... } public void draw(int i, double f) { ... } } "Overloading" metode treba koristiti rijetko jer programski kod čini manje čitkim.

36 Organizacija razreda u hijerarhije (nasljeđivanje)
Superrazredi (engl. Superclasses) (u C++ “base class”) Sadrže značajke zajedničke jednom skupu razreda. Hijerarhije nasljeđivanja (engl. Inheritance hierarchies) Pokazuju odnos između superrazreda i podrazreda (engl. superclasses i subclasses). Oznaka trokuta pokazuje generalizaciju. Nasljeđivanje (engl. Inheritance) Svi podrazredi implicitno posjeduju značajki koje su definirane u superrazredu i najčešće dodaju još neke. Npr. (Java): public class MortgageAccount extends Account { // dodatne naredbe obilježja i ponašanja } (UML notacija)

37 Primjer hijerarhije nasljeđivanja
(UML notation)

38 “Is-a” pravilo Uvijek provjeri da li generalizacija zadovoljava “is-a” pravilo (pravilo “je”, odnos podskup  skup). “checking account is an account” “village is a municipality” Da li bi “Županija” bila podrazredom “Država” ? Ne, jer ne zadovoljava “is-a” pravilo: “Županija je država” ne vrijedi !

39 Moguća hijerarhija nasljeđivanja matematičkih objekata
(Za provjeru uporabi “is-a” pravilo)

40 Osiguraj da sve naslijeđene značajke imaju smisla u podrazredima
Obilježja (implementirano kroz podatke) Ponašanje (implementirano kroz metode) Provjeri: “Is-a” pravilo. Da li sve naslijeđene značajke imaju smisla ?

41 Liskovin princip zamjene (supstitucije)
Ako postoji varijabla čiji tip je Superrazred (npr. Account), program se mora korektno izvoditi ako se u varijablu pohrani instancija tog Superrazreda ili se supstituira instancijom bilo kojeg podrazreda. (podrazredi nasljeđuju sve od superrazreda) Barbara Liskov, Prof. MIT, 2008 ACM Turing nagrada “for her work in the design of programming languages and software methodology that led to the development of object-oriented programming”.

42 Nasljeđivanje, Polimorfizam i Varijable
Apstraktna operacija Primjer dinamičkog povezivanja getBoundingRect() za varijablu tipa Shape2D i ref. objekt razreda RegularPolygon Primjer: “Shape” Konkretna metoda u Polygon je redefinirana konkretnom metodom u Rectangle (radi efikasnosti). To je “overriding”.

43 Neke operacije u “Shape” primjeru (operacije ništa ne govore o različitim implementacijama)

44 Apstraktni razredi i apstraktne metode
Pojedina operacija treba biti deklarirana da postoji u najvišem hijerarhijskom razredu gdje ima logičkog smisla. Na toj razini operacija može biti apstraktna (bez implementacije). Npr. rotate() u Shape2D (vidi sliku 42) ima smisla biti deklarirana ali podrazredi će imati svoje specifične konkretne metode rotate(). Ako neka operacija nema implementacije niti se nasljeđuje, cijeli razred je “apstraktan” Iz apstraktnog razreda ne mogu se kreirati instance. Suprotno, ako postoje sve implementacije (naslijeđene ili definirane) , razred je “konkretan”. Ključne riječi za apstraktnu operaciju su abstract (Java, C#) ili virtual (C++). Ako superrazred ima apstraktnu operaciju, tada na nekoj nižoj razini hijerarhije mora postojati konkretna metoda za tu operaciju. Krajnji razredi u hijerarhiji (“lišće”) moraju implementirati ili naslijediti konkretne metode za sve operacije. Ti razredi moraju uvijek biti konkretni.

45 Polimorfizam ("više oblika")
Svojstvo objektno usmjerenog programa da se jedna apstraktna operacija može izvesti na različite načine u različitim razredima (tj. njihovim objektima). Polimorfizam podrazumijeva da postoji više metoda istog naziva. Izbor koja metoda će se izvesti ovisi o razredu (tipu) objekta koji referencira varijabla. Polimorfizam reducira potrebu da programeri kodiraju mnoge if-else ili switch naredbe. U ranijem primjeru (sl. 11) computeFees() se različito izvodi ovisno da li je varijabla tipa (razred objekata) CheckingAccount ili SavingsAccount

46 Polimorfizam – primjer u hijerarhiji razreda
class Animal {      abstract string makeNoise (); } // apstraktna operacija  class Cat extends Animal { // podrazred Cat      string makeNoise() {return "Meow";} } // konkretna metoda class Dog extends Animal {  // podrazred Dog     string makeNoise() {return "Bark";} }// konkretna metoda main () {     Animal animal = zoo.getAnimal();     Console.WriteLine (animal.makeNoise());}  // varijabla animal je tipa superrazreda Animal Varijabla animal može referencirati sve objekte iz prikazane hijerarhije pa tako i objekte iz razreda Cat i iz razreda Dog . Neka metoda zoo.getAnimal() "stavlja" Cat ili Dog objekt (jedan) u varijablu animal. Metoda animal.makeNoise() pozvana preko varijable animal generira ispis ovisno o objektu koji je referenciran varijablom animal. Jedna apstraktna operacija izvodi se na razne načine (ovisno o razredu objekta koji sadrži/referencira varijabla animal).

47 “Overriding” (nadjačavanje, redefiniranje, ne obaziranje, iako je definirana u superrazredu i može se naslijediti, i redefinirati u podrazredu) Metoda bi naslijedila implementaciju od superrazreda, ali umjesto toga podrazred sadrži svoju novu konkretnu verziju ("zamijeni" se implementacija). To se koristi za: Restrikciju Npr. scale(x,y) ne bi radila u Circle razredu (Circle bi postao Elipse). Proširenje (ekstenziju) Npr. SavingsAccount razred bi mogao zaračunavati neku dodatnu pristojbu. Optimizaciju Npr. getPerimeterLength metoda u Circle je jednostavnija od one u Ellipse. "Overriding" je uvijek vezan uz hijerarhiju i nasljeđivanje razreda. Na ranijoj slici Shape2D hijerarhije, konkretna metoda getBoundingRect() u Polygon je redefinirana konkretnom metodom u Rectangle (npr. radi efikasnosti).

48 Kako se donosi odluka o tome koja metoda se izvodi ?
0. Poziva se neka metoda iz objekta (preko varijable koja ga referencira) nekog razreda; tip varijable b je taj razred. resultVariable = b.methodName(arguments); 1. Ako postoji konkretna metoda za operaciju u trenutnom razredu objekta kojega referencira b, ta se metoda izvodi. 2. Inače, metoda je naslijeđena i pogledaj da li postoji implementacija u neposrednom superrazredu. Ako postoji izvedi ju. 3. Ponovi korak pod 2., provjeravajući sukcesivno u višim superrazredima dok ne nađeš konkretnu metodu, te je izvedi. 4. Ako metoda nije pronađena, postoji pogreška u programu. Java i C++ program neće se moći kompilirati.

49 Dinamičko povezivanje (engl
Dinamičko povezivanje (engl. dynamic binding) ½ ili kasno povezivanje (engl. late binding) Pojavljuje se u slučaju kada se odluka o izboru konkretne metode donosi za vrijeme izvođenja programa (engl. at run-time), a ne za vrijeme prevođenja. To je potrebno kada: Varijabla je deklarirana da je tipa superrazred (tj. postoji cijela hijerarhija konkretnih podrazreda toga tipa varijable) i svaki objekt iz hijerarhije može biti referenciran tom varijablom. Koji objekt, nije poznato unaprijed. Postoji više polimorfnih metoda (istog imena) koje se mogu izvesti u sklopu hijerarhije razreda određene superrazred tipom varijable. Npr.: Neka postoji varijabla aShape, a njen tip je Shape2D. To znači da aShape može sadržavati objekt (instancu) iz bilo kojeg konkretnog razreda u cijeloj hijerarhiji razreda Shape2D. Pretraživanje i odabir konkretne metode započinje pregledom razreda čiji objekt se stvarno nalazi u varijabli aShape i pretražuje se sukcesivno hijerarhija razreda idući prema gore sve do superrazreda. Ako metoda nije pronađena deklarira se pogreška (opisano ranije). Pretraživanje je optimirano na razne načine (obično uporabom "look-up" tablice).

50 Dinamičko povezivanje 2/2 Statičko povezivanje ili rano povezivanje
Primjer (vidi raniju sliku Shape2D hijerarhije): Varijabla aShape koja je tipa Shape2D, referencira objekt iz razreda RegularPolygon i želi se izvesti metoda getBoundingRect(). Program prvo traži tu konkretnu metodu u razredu RegularPolygon, zatim u razredu SimplePolygon, te u razredu Polygon (gore po hijerarhiji) gdje ju i nalazi). To je dinamičko povezivanje. Ako aShape (koja je tipa Shape2D) sadrži objekt iz razreda Rectangle, program odmah nalazi konkretnu metodu (getBoundingRect() je konkretna metoda u tom razredu). To je također dinamičko povezivanje, jer se unaprijed ne zna koji je razred objekta u varijabli.. Ako pak neka varijabla myRect je tipa Rectangle (koji nema podrazreda), ta varijabla sadrži samo objekt iz razreda Rectangle, prevoditelj statički određuje metodu za izvođenje (bilo da se nalazi u razredu Rectangle ili u nekom superrazredu – npr. .rotate() ). Dinamičko povezivanje odigrava se samo u slučaju kada je tip varijable superrazred (tj. kada postoje podrazredi toga tipa varijable).

51 Konstruktori i destruktori (programski implementacijski detalji, a ne entiteti u modeliranju)
To su posebne metode koje se pozivaju kada se kreira ili uništava objekt. Konstruktor inicijalizira objekt i njegove varijable (vidi sliku 23). Naziv konstruktorske metode je isti kao i naziv njenog razreda. Ako konstruktor nije deklariran u razredu, to će učiniti prevoditelj (engl. compiler), ali bez inicijalizacije varijabli (C++). U Javi se uvijek provodi inicijalizacija varijabli na pretpostavljene vrijednosti. Java: Ball b1 = new Ball(); // Ball() je konstruktor Primjer C++: class rectangle { // jednostavan razred int height; int width; public: rectangle() {height = 2; width = 4;}; // konstuktor alocira memoriju // i inicijalizira varijable ~rectangle(); }; // destruktor dealocira memoriju // stvaranje dva objekta s inicijaliziranim varijablama rectangle r1; rectangle r2;

52 Koncepti koji definiraju objektno usmjerenje
Nužna obilježja da bi sustav ili programski jezik bio objektno usmjeren: Identitet Svaki objekt je poseban i može se referencirati (adresom). Dva objekta su posebna čak i ako imaju jednake podatke. Razredi Programski kod je organiziran uporabom koncepta razreda, koji svaki za sebe opisuju skup objekata. Nasljeđivanje To je mehanizam u kojem se značajke podrazreda implicitno nasljeđuju od superrazreda. Polimorfizam Mehanizam u kojem postoji više metoda istog naziva koje različito (ovisno o razredu objekta) implementiraju istu apstraktnu operaciju.

53 Ostali ključni koncepti
Apstrakcija Objekt -> nešto u realnom svijetu Razred -> Objekti (instancije) Superrazred -> Podrazred Operacija -> Metode Atributi i pridruživanje (asocijacije) -> Varijable instanci Modularnost Program se može oblikovati samo iz razreda (bez globalnih varijabli ?). Enkapsulacija Detalji mogu biti skriveni u razredima. To potiče skrivanje informacija (engl.information hiding): Programeri ne moraju znati sve detalje razreda.

54 Objektno usmjereni programski jezici
Povijest Prvi objektno usmjeren programski jezik bio je Simula-67. Oblikovan kako bi programeri pisali simulacijske programe. U ranim 1980-ima razvijen je Smalltalk u Xerox PARC. Nova sintaksa, velike knjižnice otvorenog koda spremnog za višestruku uporabu (engl. reuse), “bytecode”, nezavisnost o platformi, skupljanje smeća (engl. garbage collection). Kasne 1980-te, razvijen je C++ (B. Stroustrup), Prepoznate su prednosti objektnog usmjerenja, ali također i činjenica da postoji ogromna skupina C programera. 1991, Sun Microsystems je počeo projekt koji bi predložio jezik za programiranje potrošačkih (engl. consumer) pametnih naprava , novi jezik je nazvan Java, i formalno predstavljen na konferenciji SunWorld ’95. 2000., Microsoft predstavlja C# kao kompeticiju Javi. Prva specifikacija C# jezika dana je 2001.


Download ppt "Oblikovanje programske potpore"

Similar presentations


Ads by Google