OBJEKTNO ORIJENTISANO PROGRAMIRANJE PREDAVANJE 5 OBJEKTI U INTERAKCIJI Miloš Kovačević Đorđe Nedeljković 1 /25
OSNOVNI KONCEPTI - Abstrakcija - Modularizacija - Objektne reference - Klasni dijagram - Objektni dijagram - Kreiranje objekata - Interakcija između objekata (eksterni pozivi metoda) - Interni pozivi metoda 2 /25
DEMO DIGITALNI SAT Otvoriti projekat clock-display u folderu chapter03 - Na displeju sati i minuti - Sati idu od 0 do 11 3 /25
KAKO NAPRAVITI PRIKAZ DIGITALNOG SATA jedan četvorocifreni displej?...ili dva dvocifrena displeja? povezani sa : 4 /25
ABSTRAKCIJA I MODULARIZACIJA - Abstrakcija je pojednostavljena predstava modela koja zanemaruje detalje a fokusira se na suštinska svojstva i ponašanja - Primer: abstrakcija solitera je poliedar sa širinom, visinom, dužinom, brojem stanara i adresom - Modularizacija je proces podele celine u dobro definisane delove, koji se mogu posmatrati nezavisno i koji interaguju po unapred definisanim pravilima - Primer1: zgrada može da se podeli na spratove, a spratovi na stanove, spratovi i stanovi definišu se detaljnije, kao i veze između njih - Primer2: lego kocke određenih profila (svaki profil definisan kao nezavisna celina) kombinacija različitih kocki daje različite modele (zgrada) 5 /25
MODULARIZACIJA Prikaz se realizuje korišćenjem dve nezavisne komponente (modula) istog tipa: dvocifreni displej Svaki displej broji od 00 do XY, gde se XY može podesiti (npr. do 24 ili 60) Zašto prikaz nije realizovan kao četvorocifreni displej? Kako bi se realizovao sat koji pokazuje i sekunde u oba slučaja? Korišćenjem dvocifrenog displeja jednostavno se dograđuje funkcionalnost sata (na sate i minute se dodaju sekunde) povezani sa : U slučaju da je sat monolitan ne bi mogli da iskoristimo nijedan njegov deo za novi prikaz 6 /25
IMPLEMENTACIJA DVOCIFRENOG DISPLEJA public class NumberDisplay { private int limit; private int value; // konstruktori izostavljeni // metode izostavljene 7 /25
IMPLEMENTACIJA SATA public class ClockDisplay { private NumberDisplay hours; private NumberDisplay minutes; // konstruktori izostavljeni // metode izostavljene Primer abstrakcije model prikaza sata pojednostavljen, uočeni suštinski delovi Svaki objekat klase ClockDisplay sastoji se od dva objekta klase NumberDisplay Polja hours i minutes su objektnog tipa (nisu primitivni tipovi) 8 /25
PRIMITIVNI I OBJEKTNI TIPOVI int i; 21 primitivni tip (čuva vrednost promenljive) NekaKlasa objekat; objektni tip (čuva referencu na objekat) referenca = adresa u memoriji gde počinje struktura koja čuva podatke o stanju objektu 9 /25
OBJEKTNI DIJAGRAM SISTEMA 24, 11 60, 3 Objektni dijagram pokazuje veze između objekata i njihova stanja u nekom trenutku rada programa 10/25
KLASNI DIJAGRAM SISTEMA Klasni dijagram opisuje statičku strukturu programa (koje klase čine sistem i kakav je odnos između njih, koji su delovi u sistemu i kakav je odnos između delova) 11/25
IMPLEMENTACIJA DVOCIFRENOG DISPLEJA public class NumberDisplay{ private int limit; private int value; public NumberDisplay (int rollover){ limit = rollover; value = 0; // start at 0 // metode izostavljene 12/25
IMPLEMENTACIJA DVOCIFRENOG DISPLEJA public class NumberDisplay{ private int limit; private int value; //... public void increment(){ value = (value + 1) % limit; // videti dalje u BlueJ-u % - operator računa celobrojni ostatak, npr. 5 % 2 je 1 / - celobrojno deljenje kada su leva i desna strana celobrojni tipovi, npr. 5 / 2 je 2 Može li increment() da se implementira drugačije? 13/25
IMPLEMENTACIJA DVOCIFRENOG DISPLEJA public class NumberDisplay{ private int limit; private int value; //... public void increment(){ value = value + 1; if(value == limit){ value = 0; 14/25
SKRAĆENA NOTACIJA public void increment(){ value++ ; // umesto value = value + 1 if(value == limit){ value = 0; total = total + price; balance = balance price; može i: total += price; balance -= price; 15/25
SKRAĆENA NOTACIJA - OPERATORI - Umesto A = A op B može A op= B - Primeri: - a = a +5 jednako je a += 5 - b = b / c jednako je b /= c - d = d * (2 + e) jednako je d *= (2 + e) - Umesto a = a + 1, može a += 1, ali je najbolje a ++ - Slično, za a = a 1, može a = 1, ali je nabjolje a 16/25
IMPLEMENTACIJA SATA OBJEKAT SADRŽI DRUGE OBJEKTE public class ClockDisplay{ private NumberDisplay hours; private NumberDisplay minutes; //... poziv konstruktora klase NumberDisplay public ClockDisplay(){ hours = new NumberDisplay(24); minutes = new NumberDisplay(60); // ostala inicijalizacija //... 17/25
IMPLEMENTACIJA SATA OBJEKAT KREIRA DRUGE OBJEKTE hours = new NumberDisplay(24); minutes = new NumberDisplay(60); stvarni parametar formalni parametar 24, 0 public NumberDisplay (int rollover){ limit = rollover; value = 0; // start at 0 60, 0 Polja hours i minutes su objektnog tipa (nisu primitivni tipovi kao što je npr. int) 18/25
POZIVANJE METODA EKSTERNO ZVANJE public class ClockDisplay{ private NumberDisplay hours; private NumberDisplay minutes; private String displaystring; //... private void updatedisplay(){ displaystring = hours.getdisplayvalue() + ":" + minutes.getdisplayvalue(); //... eksterni poziv metode nad objektom koristi notaciju sa tačkom 19/25
POZIVANJE METODA NOTACIJA SA TAČKOM public class NumberDisplay{ poziv metode hours.getdisplayvalue() ime objekta ime javne metode iz klase objekta private int limit; private int value; //... public String getdisplayvalue(){ if(value < 10) { return "0" + value; else { return "" + value; //... modifikator vidljivosti za javnu metodu 20/25
POZIVANJE METODA NOTACIJA SA TAČKOM Objekti mogu da pozivaju metode nad objektima drugih klasa samo ako su u tim klasama deklarisane kao javne (public) Interakcija između objekata obavlja se kroz međusobno pozivanje metoda private NumberDisplay hours; private NumberDisplay minutes; private String displaystring; //... public void timetick(){ minutes.increment(); metode moraju biti deklarisane kao javne (public) u klasi NumberDisplay if(minutes.getvalue() == 0){ hours.increment(); updatedisplay(); 21/25
POZIVANJE METODA INTERNI POZIV private NumberDisplay hours; private NumberDisplay minutes; private String displaystring; //... public ClockDisplay(){ hours = new NumberDisplay(24); minutes = new NumberDisplay(60); updatedisplay(); public void timetick(){ minutes.increment(); if(minutes.getvalue() == 0){ hours.increment(); updatedisplay(); interni poziv metode iz iste klase interni poziv metode iz iste klase 22/25
POZIVANJE METODA INTERNI POZIV - Ukoliko se metoda zove isključivo interno, onda se deklariše kao private (updatedisplay u klasi ClockDisplay) - Ukoliko se metoda deklariše kao private, ne mogu je pozivati objekti drugih klasa u notaciji sa tačkom (od spolja) - Privatne metode implementiraju funkcionalnosti koje su potrebne za rad drugih metoda, pa se na ovaj način skraćuje kod - Javne metode, kao i privatne se mogu pozivati interno ako je to potrebno 23/25
TEST ŠTA JE NA IZLAZU? int a; int b; a = 42; b = a; a = a + 1; System.out.println(b); Student a; Student b; a = new Student("Pera"); b = a; a.promeniime("mika"); System.out.println(b.dajIme()); 24/25
TEST ŠTA JE NA IZLAZU? b = a; Student a; Student b; int a; 42 int b; 42 25/25