Marko Milošević marko643@gmail.com marko.milosevic@pmf.edu.rs
ESPB 8 Bodovanje Domaći Kolokvijumi 2x10 2x20 Završni ispit 40 Konsultacije sreda 13-14 četvrtak 16-17
Šabloni dizajna (Design Patterns) Metrika softvera (Software Metrics) Testiranje softvera
Standardno rešenje nekog programerskog problema. Pojedini problemi se javljaju vrlo često. Potrebno je rešavati ih brzo i sigurno.
double sum(double[] a) { double s = 0; for (int i = 0; i < a.length; i++){ s += a[i]; return s;
double sum(elementliste root){ double s = 0; ElementListe temp = root; for( ;temp!= null; temp = temp.next()){ s += temp.value(); return s;
double sum(iterable<double> a){ double s = 0; Iterator<Double> i=a.iterator() for(; i.hasnext(); ){ s += i.next(); return s;
double sum(iterable<double> a){ double s = 0; for (Double el:a){ s += el; return s;
Omogućavaju bržu komunikaciju među programerima pri diskusiji dizajna softvera. Obezbeđuju rečnik za razmenu dizajnerskih koncepata među programerima, bilo verbalno ili u dokumentaciji, odnosno specifikaciji. Umesto ova klasa prolazi kroz kolekciju objekata i daje po jedan element, kažemo ova klasa je iterator.
Povećana sigurnost kod se piše prema nekom standardu ima više provere grešaka lakši je za testiranje i debug-ovanje Bolje performanse kod se brže piše objekti dele resurse, pa su memorijski zahtevi manji Povećana fleksibilnost kod se lakše menja jer se umanjuju ili odstranjuju veze između delova koda
Korišćenje pojedinih šablona je uvek dobra ideja. Program se brže razvija. Zahteva manje testiranja. Pouzdaniji je. U nekim slučajevima (npr. šabloni za optimizaciju ili povećanje fleksibilnosti) je bolje sačekati sa primenom. Prvo razviti nešto što funkcioniše. Zatim iskoristiti šablon za otklanjanje slabosti.
Većina ljudi koristi šablone kada primete problem u dizajnu ili impementaciji. npr. promena koju bi trebalo jednostavno izvršiti, ali nije tako, ili performanse sistema nisu na zahtevanom nivou.
Šabloni mogu povećati ili umanjiti razumljivost dizajna ili implementacije. Povećavaju količinu koda. Povećavaju modularnost. U početku mogu izgledati prilično apstraktni. Prave prednosti se ispoljavaju tek kada se radi na većim sistemima.
Osnovni šabloni Šabloni kreiranja (Creational Patterns) Šabloni sakupljanja (Collectional Patterns) Strukturni šabloni (Structural Patterns) Šabloni ponašanja (Behavioral Patterns) Paralelni šabloni (Concurrency Patterns)
Interfejsi Apstraktne klase Privatni metodi Pristupni metodi Menadžer konstantnih podataka Nepromenljivi objekti (Immutable objects) Monitori
public class CategoryA { private double basesalary; private double OT; public CategoryA(...){ public double salary(){ return basesalary + OT;
public class Employee { CategoryA salarycalc; String name; public Employee(String n, CategoryA c){ public void display(){ System.out.println( Name= + name); System.out.println( salary= + calarycalc.getsalary();
public class Main { public static void main(string[] args){ CategoryA c = new CategoryA(10000, 200); Employee e = new Employee( Mika, c); e.display();
public class CategoryB { private double salesamt; private double basesalary; private static final double commision=0.2; public double salary(){ return basesalary + commision * salesamt;
public interface SalaryCalculator { public double getsalary();
public class CategoryA implements SalaryCalculator { @Override public double getsalary(){...
public class Main{ public static void main(string[] args){ SalaryCalculator c = new CategoryA(10000, 200); Employee e = new Employee( Mika, c); e.display(); c = new CategoryB(20000, 800); e = new Employee( Zika, c); e.display();
public class Main{ public static void main(string[] args){ SalaryCalculator c = new CategoryA(10000, 200); Employee e = new Employee( Mika, c); e.display(); c = new CategoryB(20000, 800); e = new Employee( Zika, c); e.display();
public abstract class Employee { private String name; private String ID; public Employee(...){... public String getname(){... public String getid(){... public void save(){... public abstract String compute();
public class Account { public static final String ACCOUNT_DATA_FILE = "ACCOUNT.TXT"; public static final int VALID_MIN_LNAME_LEN = 2; public void save() { public class Address { public static final String ADDRESS_DATA_FILE = "ADDRESS.TXT"; public static final int VALID_ST_LEN = 2; public static final String VALID_ZIP_CHARS = "0123456789"; public static final String DEFAULT_COUNTRY = "USA"; public void save() {
public class ConstantDataManager { public static final String ACCOUNT_DATA_FILE = "ACCOUNT.TXT"; public static final int VALID_MIN_LNAME_LEN = 2; public static final String ADDRESS_DATA_FILE = "ADDRESS.TXT"; public static final int VALID_ST_LEN = 2; public static final String VALID_ZIP_CHARS = "0123456789"; public static final String DEFAULT_COUNTRY = "USA";
public class Card { public static final int PIK = 1; public static final int KARO = 2;... public static final int KEC = 1; public static final int DVOJKA = 2;...
Konstruktor public Card(int boja, int broj){... Poziv konstruktora Card c = new Card(Card.PIK, Card.DVOJKA); Problem Card c = new Card(Card.DVOJKA, Card.PIK); Ne radimo proveru tipa.
Rešenje je korišćenje enum tipa u C++ ili sličnih konstrukcija u Javi ili C# public class BojaKarte { public static final BojaKarte PIK = new BojaKarte("pik"); public static final BojaKarte KARO = new BojaKarte("karo"); public static final BojaKarte HERC = new BojaKarte("herc"); public static final BojaKarte TREF = new BojaKarte("tref"); private String boja; private BojaKarte(String boja){ this.boja = boja; @Override public String tostring() { return boja;
public class BrojKarte { public static final BrojKarte KEC = new BrojKarte("KEC"); public static final BrojKarte DVOJKA = new BrojKarte("DVOJKA"); //... private String broj; private BrojKarte(String s){ this.broj = s; @Override public String tostring() { return broj;
public class Card { private BojaKarte boja; private BrojKarte broj; public Card(BojaKarte boja,brojkarte broj){ this.boja = boja; this.broj = broj; @Override public String tostring() { return "(" + broj + ", " + boja + ")";
Card c = new Card(BojaKarte.PIK, BrojKarte.KEC);
Privatni metodi Pristupni metodi Nepromenljivi objekti (Immutable objects) Monitori