You are on page 1of 85

Objektno orijentirano

programiranje
Objektno orijentirani koncepti:
nastavak
2

ror handling
Er

Objektno orijentirano programiranje


3

Manipulacija pogreškama
error handling
• rijetki su slučajevi kada se klasa napiše savršeno u prvoj iteraciji
• Vrlo je vjerojatno da će doći do neke vrste pogreške
• 4 načina nošenja s pogreškama:
– Ignorirati problem – nije najbolja ideja!
– Provjeriti moguće probleme i u tom slučaju izaći iz programa
– Provjeriti moguće probleme, uhvatiti pogrešku i riješiti
problem
– Generirati iznimku – često najbolji način

Objektno orijentirano programiranje


4

Ignoriranje problema
• Najgori scenarij
• Iako možda utjecaj problema i ne izgleda značajno u
odnosu na cjelokupnu funkcionalnost problema – dobra
praksa je ispraviti ga
• Efekt problema se može dalje propagirati u programu što
vodi do ozbiljnijih pogrešaka
• Osnovno pravilo je da se aplikacija nikada ne bi smjela
srušiti
• Možemo i dobivati krive rezultate bez da smo svjesni
problema

Objektno orijentirano programiranje


5

Provjera problema i izlazak iz programa


• Pronađemo potencijalni problem i izađemo iz programa
• Aplikacija može korisniku prikazati poruku sa pogreškom i
izaći
• Bolje od ignoriranja problema, ali nije najbolje rješenje
• U ovom slučaju prija izlaska možemo sačuvati datoteke i
podatke

Objektno orijentirano programiranje


6

Provjera problema i pokušaj oporavka


• Bolja opcija od izlaska iz programa
• Problem se detektira u kodu i
aplikacija ga pokušava ispraviti if (a == 0)
• U primjeru možda 1 nije ispravno a = 1;
rješenje, možda korisnika trebamo
pitati za novu vrijednost c = b / a;
• Nije uvijek jednostavno pronaći
gdje se pogreška prvo pojavljuje

Objektno orijentirano programiranje


7

Generiranje iznimki
• Većina OO jezika omogućava generiranje iznimki
• Iznimke nam pružaju način detektiranja problema i
manipulaciju
• Ključne riječi try i catch

try{
//Potencijalno nesiguran kod
}
catch (Exception e){
//Kod za hvatanje iznimke
}

Objektno orijentirano programiranje


8

Try-catch
• U slučaju da se generira iznimka u try bloku – onda je catch blok
„uhvati”
– Izvršavanje try bloka se zaustavlja
– catch blokovi se pregledavaju kako bi se ustanovilo koji blok
hvata tu vrstu iznimke (može biti više catch blokova za isti try)
– U slučaju da na jednoj razini nema prikladnih catch blokova
iznimka se šalje na višu razinu. U slučaju da nijedan kod ne
hvata tu vrstu iznimke onda se ona šalje sustavu
– U slučaju da postoji prikladni catch blok – njegov kod se
izvršava
– Slijed programa se onda nastavlja iza try-catch bloka

Objektno orijentirano programiranje


9

Try-catch
• Različite razine pogrešaka mogu se hvatati u try-catch
bloku
• Možemo hvatati sve pogreške ili samo one specifične, npr.
aritmetičke pogreške

Objektno orijentirano programiranje


System.DivideByZeroException:
10
Attempted to divide by zero.
Try-catch Uspjesno rukovanje iznimkom

class Program{
static void Main(string[] args){
int brojac;
try{ Dijeljenje nulom!
//Potencijalno nesiguran kod
brojac = 0;
float value = 5 / brojac;
}
catch (ArithmeticException e){
//Kod za hvatanje iznimke
Console.WriteLine(e.ToString());
brojac = 1;
}
Console.WriteLine("Uspjesno rukovanje iznimkom");
Console.ReadLine();
}
}

Objektno orijentirano programiranje


11

Try-catch
public class Program{
public static void Main(string[] args){
int brojac;
try{
//Potencijalno nesiguran kod
brojac = 0;
float value = 5 / brojac;
}
catch (DivideByZeroException e){
Console.WriteLine(e.ToString() );
}
catch (ArithmeticException e){
Console.WriteLine(e.ToString());
}
}
}

Objektno orijentirano programiranje


12

Try-catch
using namespace std;

int main(){
int brojac;
try {
//Potencijalno nesiguran kod
brojac = 0;
float value = 5 / brojac;
}
catch (std::overflow_error e) {
//Kod za hvatanje iznimke
cout << e.what();
brojac = 1;
}
cout << "Uspjesno rukovanje iznimkom";
}
Iz dokumentacije za C++: „If the second operand of / or % is zero, the
behavior is undefined.”
Objektno orijentirano programiranje
13

Try-catch Division by zero condition!

double division(int a, int b) {


if (b == 0) {
throw "Division by zero condition!";
}
return (a / b);
}
int main() {
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}
catch (const char* msg) {
cout << msg << endl;
}
return 0;
}

Objektno orijentirano programiranje


14

C++ standard exceptions


std:exception

std:bad_alloc std:domain_error
std:bad_cast std:invalid_argument
std:bad_typeid std:length_error
std:bad_exception std:out_of_range
std:logic_failure
std:runtime_error std:overflow_error

std:range_error

std:underflow_error

Objektno orijentirano programiranje


15

Try-catch
divide by zero
0

x=5
y=0
z=0
try:
z = x/y
except ZeroDivisionError:
print("divide by zero")
print(z)

Objektno orijentirano programiranje


16

s design u C++
Error clas

Objektno orijentirano programiranje


17

Error class design


int main()
{
cout << "Unesi prvi podatak: ";
double data1;
cin >> data1;
cout << "Unesi drugi podatak: ";
double data2;
cin >> data2;
cout << "Unesi operator: ";
char oper;
cin >> oper;

double result;
...

return 0;
}

Objektno orijentirano programiranje


18

Error class design


class Error{
public:
virtual void printMessage(){
cout << "**Error: type Error\n";
}
};

Error

+printMessage:void

Objektno orijentirano programiranje


19

Error class design


Error

+printMessage:void

Arithmetic

+printMessage:void

DivByZero BadOperator

+printMessage:void +printMessage:void

Objektno orijentirano programiranje


class Error{ 20
public:
virtual void printMessage(){
cout << "**Error: type Error\n";
}
};
class Arithmetic: public Error{
public:
virtual void printMessage(){
cout << "**Error: type Arithmetic\n";
}
};
class DivByZero: public Arithmetic{
public:
virtual void printMessage(){
cout << "**Error: 100 divisor 0\n";
}
};
class BadOperator: public Arithmetic{
public:
virtual void printMessage(){
cout << "**Error: 101 invalid operator\n";
}
};

Objektno orijentirano programiranje


double math(char oper, double data1, double data2){
21
double result;
switch(oper){
case '+':
result = data1 + data2;
break;
case '-':
result = data1 - data2;
break;
case '/':
if(data2==0) throw DivByZero();
result = data1 / data2;
break;
case '*':
result = data1 * data2;
break;
default:
throw BadOperator();
break;
}
return result;
}

Objektno orijentirano programiranje


int main()
{ 22

cout << "Unesi prvi podatak: ";


double data1;
cin >> data1;
cout << "Unesi drugi podatak: ";
double data2; Unesi prvi podatak: 5
cin >> data2; Unesi drugi podatak: 0
cout << "Unesi operator: "; Unesi operator: /
char oper; **Error: 100 divisor 0
cin >> oper;
double result;

try{
result = math(oper, data1, data2);
cout << "rezultat: " << result << endl;
} catch(Error& error){
error.printMessage();
return 100;
}
return 0;
}

Objektno orijentirano programiranje


23

Dizajn klasa
• Osnovni cilj OO programiranja je modeliranje stvarnog
svijeta na način kako ljudi prirodno razmišljaju – u
okvirima objekata
• Kada dizajniramo klasu potrebno je ponašanje predstaviti
na način kako se stvarno u svijetu i odvija
• Jedna od najčešćih pogrešaka je dizajn klasa koje imaju
ponašanje, ali nemaju podatke
• Dizajn interfejsa
– Minimalni mogući interfejs čini klasu konciznom i
„čistom”
– Uključiti korisnika u definiranje dizajna od samog
početka
Objektno orijentirano programiranje
24

Dizajn klasa
• Robusni konstruktori i destruktori
– Destruktor prilikom završetka života objekta treba
osloboditi memoriju koju je objekt alocirao
– U protivnom dolazi do memory leak-a
• Uključiti error-handling u samu klasu
• Dokumentiranje klase i korištenje komentara
– Dobra praksa
– Potrebno je uložiti vrijeme
– Izrazito bitno kod većih projekata i za rad u timovima
• Stvaranje objekata imajući na umu njihovu suradnju

Objektno orijentirano programiranje


25

Komentari
• Važno je kvalitetno dokumentirati klasu i kroz korištenje
komentara
• Ponekad je potrebno detaljnije opisati funkcionalnost
pojedinih metoda ako iz imena nije lako zaključiti kako se
ona koristi
• Većina OO jezika ima dvije standardne vrste komentara

/* komentar u više
linija (moramo paziti da zatvorimo komentar */

// komentar u jednoj liniji (nije potrebno zatvarati)

Objektno orijentirano programiranje


26

null
• Null predstavlja vrijednost ništa
• Može biti korisno u programiranju
• Provjerom je li neka varijabla ili objekt null doznajemo je
li postavljena vrijednost
• Varijable/objekta možemo postaviti na null prije nego
imamo neku smislenu vrijednost (npr. prije nego korisnik
upiše neki traženi unos)
• null je validno stanje objekta

Objektno orijentirano programiranje


27

null

Objektno orijentirano programiranje


28

null
function getVowels(str) {
let m = str.match(/[aeiou]/gi);
if (m === null) {
return 0;
}
return m.length;
}

console.log(getVowels('Objektno orijentirano programiranje'));

Objektno orijentirano programiranje


29

Dizajn klasa
• Dizajn s naglaskom na ponovno korištenje
• Dizajn s naglaskom na proširivost
• Deskriptivna imena
– Ako koristimo neku konvenciju ili standard imenovanja
bitno je da ga slijedimo do kraja
– Kada netko pročita ime trebao bi znati što taj objekt
predstavlja

Objektno orijentirano programiranje


30

Konvencija imenovanja 1
• Imena klasa
– Spojene riječi, svaka riječ počinje velikim slovom
Account, BankAccount, CashDispenser, SortedIntegerQueue

• Objekti, varijable, metode


– Spojene riječi, prva riječ uvijek malim slovom, riječi koje
slijede započinju velikim slovom
balance, shareBalance, count, quantityOfFives

Objektno orijentirano programiranje


31

Konvencija imenovanja 2
• Imena klasa
– Spojene riječi, svaka riječ počinje velikim slovom
Account, BankAccount, CashDispenser, SortedIntegerQueue

• Objekti
– Malim slovima, odvojene donjom crtom
list, node_list, account, new_acct
• Metode
– Spojene riječi, prvo slovo malo, sljedeće riječi počinju
velikim slovom
deposit, balance, objectAt, dispenseMoney

Objektno orijentirano programiranje


32

Mađarska notacija
• Sve sadrži oznaku koja identificira o čemu je riječ
– npr. svaka klasa počinje s velikim slovom C

Objektno orijentirano programiranje


33

Dizajn klasa
• Dizajnirati kod s malim
dosegom class Matematika{
int temp;
– Lokaliziranje atributa i public int zamijeni(int a, int b){
ponašanja temp = a;
a = b;
– Pojednostavljuje
b = temp;
održavanje, testiranje i return temp;
proširivanje klasa }
};
• Desno: primjer
nepotrebnog povećanja
dosega

Objektno orijentirano programiranje


34

Dizajn klasa
• Klasa bi trebala biti odgovorna za svoje funkcionalnosti
• Primjer ne-OO pristupa

IspisiKrug(krug);
IspisiPravokutnik(pravokutnik);

switch (oblik){
case 1: IspisiKrug(krug); break;
case 2: IspisiPravokutnik(pravokutnik); break;
case 3: IspisiTrokut(trokut); break;
default: System.out.println("Nedefinirani oblik"); break;
}

Objektno orijentirano programiranje


35

Dizajn klasa

Objektno orijentirano programiranje


36

Dizajn klasa
• Primjer OO pristupa - polimorfizam

Objektno orijentirano programiranje


37

Dizajn s naglaskom na lako održavanje


• Dizajn konciznih i korisnih klasa olakšava održavanje
• Organiziramo kod u više manjih zasebnih jedinica koje je
lakše održavati
• Potrebno je reducirati međuzavisni kod – promjena u jednom
dijelu koda ne bi trebala imati utjecaj na ostatak koda
• Ako su klase ispravno dizajnirane promjene u sustavu bi se
trebale odnositi samo na implementaciju
• Promjene na javnom interfejsu bi se trebale izbjegavati –
takve promjene uzrokuju velike promjene u ostatku koda

Objektno orijentirano programiranje


38

Povezane klase
• Situacija kada dvije (ili više) klasa u velikoj mjeri ovise jedna o
drugoj naziva se jako povezane klase
• Promjena na jednoj klasi vrlo vjerojatno znači da će biti
potrebno mijenjati i drugu klasu
• Ponekad nam priroda problema iz domene nameće jaku
povezanost klasa

Objektno orijentirano programiranje


39

Iterativan razvojni proces


• Ne treba cijeli kod napisati odjednom
• Kod se radi u manjim koracima, i iza svakog koraka
obavlja se potrebno testiranje
• Dobar plan testiranja otkriva greške u ranom stupnju
razvoja gdje je ispravljanje jednostavnije
• Ako se greška uoči u zadnjem stadiju razvoja puno
skuplje je popraviti

Objektno orijentirano programiranje


40

Testiranje sučelja klasa


• Testiranje počinje sa minimalnim implementacijama
sučelja
• Na taj način možemo testirati sučelje klase bez pisanja
stvarnog koda
• Služi samo da testiramo da interfejsi dobro rade

Objektno orijentirano programiranje


41

Primjer testiranja
class CitacBazePodataka{
private string baza[] = { "Zapis1","Zapis2", "Zapis3","Zapis4",
"Zapis5" };
private bool bazaOtvorena = false;
private int pozicija;
public void Otvori(string ime){
bazaOtvorena = true;
}
public void Zatvori(){
bazaOtvorena = false;
}
public void IdiNaPrviZapis(){
pozicija = 0;
}

Objektno orijentirano programiranje


42

Primjer testiranja
public void IdiNaZadnjiZapis(){
pozicija = 4;
}
public int KolikoImaZapisa(){
int brojZapisa = 5;
return brojZapisa;
}
public string DohvatiZapis(int redniBroj){
/* implementacija specifična za konkretnu bazu*/
return baza[redniBroj];
}
public string DohvatiSljedećiZapis(){
/* implementacija specifična za konkretnu bazu*/
pozicija++;
return baza[pozicija];
}
};

Objektno orijentirano programiranje


43

Testiranje
• Tri varijacije „test double”-a:

– Fakes
– Stubs
– Mocks

Objektno orijentirano programiranje


44

Testiranje
• Fake
– Objekti koji imaju funkcionalnu implementaciju (ali
drugačiju od produkcijske funkcionalnosti)
– Često koriste prečac i imaju pojednostavljenu verziju
produkcijskog koda

Objektno orijentirano programiranje


45

Testiranje

Objektno orijentirano programiranje


46

Testiranje
public class FakeAccountRepository implements AccountRepository {
Map<User, Account> accounts = new HashMap<>();
public FakeAccountRepository() {
this.accounts.put(new User("john@bmail.com"), new UserAccount());
this.accounts.put(new User("boby@bmail.com"), new AdminAccount());
}
String getPasswordHash(User user) {
return accounts.get(user).getPasswordHash();
}
}

Objektno orijentirano programiranje


47

Testiranje
• Stub
– Objekt koji sadrži predefinirane podatke koje koristi
kao odgovor.
– Koristimo kad ne možemo ili ne želimo koristiti
objekte koji bi odgovorili s pravim podacima ili koji bi
imali side effects

Objektno orijentirano programiranje


48

Testiranje

Objektno orijentirano programiranje


49

Testiranje
public class GradesService {
private final Gradebook gradebook;
public GradesService(Gradebook gradebook) {
this.gradebook = gradebook;
}
Double averageGrades(Student student) {
return average(gradebook.gradesFor(student));
}
}

Objektno orijentirano programiranje


50

Testiranje
public class GradesServiceTest {
private Student student;
private Gradebook gradebook;
Korištenje alata (JUnit).
@Before Kreira se mock objekt
public void setUp() throws Exception {
gradebook = mock(Gradebook.class);
student = new Student();
}

@Test
public void calculates_grades_average_for_student() {
when(gradebook.gradesFor(student)).thenReturn(grades(8, 6, 10));
double averageGrades = new
GradesService(gradebook).averageGrades(student);
assertThat(averageGrades).isEqualTo(8.0);
}
}

Objektno orijentirano programiranje


51

Testiranje
• Mock
– Objekti koji registriraju pozive koje prime
– Omogućuju nam da potvrdimo da su se obavile sve
potrebne akcije prilikom testiranja

• Slično kao i stub, ali:


– Zanima nas i kako je do rezultata došlo
– Često nema povratne vrijednosti pa je potrebno
saznati jesu li obavljene sve akcije koje se trebaju
obaviti

Objektno orijentirano programiranje


52

Testiranje

Objektno orijentirano programiranje


53

Testiranje
public class SecurityCentral {
private final Window window;
private final Door door;

public SecurityCentral(Window window, Door door) {


this.window = window;
this.door = door;
} Želimo izbjeći stvarno
zatvaranje vrata
void securityOn() { prilikom testiranja!
window.close();
door.close();
}
}

Objektno orijentirano programiranje


54

Testiranje mocks

public class SecurityCentralTest {


Window windowMock = mock(Window.class);
Door doorMock = mock(Door.class);

@Test
public void enabling_security_locks_windows_and_doors() {
SecurityCentral securityCentral = new
SecurityCentral(windowMock, doorMock);
securityCentral.securityOn();
verify(doorMock).close();
verify(windowMock).close();
}
}

Objektno orijentirano programiranje


55

Testiranje, testiranje, testiranje


• Neki klijenti su spremni dobiti softver lošije kvalitete za
nešto manju cijenu
• Takav pristup nije dugoročno održiv i reputacija proizvođača
se degradira
• Neki proizvođači puštaju netestirane beta verzije softvera i
tretiraju kupce kao testere
• Greške koje se pronađu na takav način često imaju veću
cijenu popravka (sličan primjer je u auto-industriji kada se
otkrije greška na nekom modelu koji je već u prodaji)
• Visoka kvaliteta softvera je i dobra podrška mogu biti
značajne prednosti za proizvođače softvera
• Testiranje „u hodu” u svakoj fazi razvoja

Objektno orijentirano programiranje


56

Dizajn s objektima
• Pričali smo o načinu kako na dobar način dizajnirati klase
• Sada je fokus na dobrom dizajnu sustava
• Sustav se može definirati kao klase koje međudjeluju jedne s
drugima
• Potrebno je dobar dio vremena rada na projektu uložiti u
početni dizajn sustava jer su naknadne promjene jako skupe
• Ne postoji samo jedna „dobra” metoda dizajna
• Potrebno je odabrati metodu koja najviše paše našim
potrebama i sredstvima/resursima na raspolaganju

Objektno orijentirano programiranje


57

Dizajn s objektima
• Za razvoj OO sustava posebno je važan high-level
model
• Objektni model se sastoji od class-dijagrama i
definiranja interakcija među klasama
• Model bi trebao vjerno predstavljati sustav i trebalo bi
ga biti lako razumjeti ili mijenjati
• Za notaciju se koristi UML
• Postoji više metodologija npr. waterfall model, rapid
prototyping, Kanban, Agile, Scrum …

Objektno orijentirano programiranje


58

Waterfall metoda
• Definiranje zahtjeva u ranoj fazi i minimizirati naknadne
promjene
– Cijena promjene u fazi zahtjeva i dizajna je mala
– Cijena promjena u fazi implementacije je značajno
veća
– Cijena promjena u fazi deploymenta je vrlo velika u
odnosu na prvu fazu

Objektno orijentirano programiranje


Waterfall metoda 59

Otkriti što više potencijalnih problema

Dizajn

Implementacija
Visoka cijena

Korisnik želi
mijenjati Deployment
aplikaciju

Objektno orijentirano programiranje


60

Dizajn s objektima
• Dobar OO dizajn proces uključuje sljedeće:
1. Kvalitetna analiza i istraživanje
2. Izrada SOW (Statement of work) dokumenta
3. Prikupljanje zahtjeva
4. Izrada prototipa korisničkog sučelja (eng. user interface)
5. Definiranje klasa
6. Određivanje odgovornosti svake klase
7. Određivanje kako različite klase obavljaju interakciju
8. Stvaranje high-level modela koji opisuje sustav koji će se
izraditi

Objektno orijentirano programiranje


61
1. Kvalitetna analiza i istraživanje

• Korisnici u svakoj fazi trebaju surađivati sa developerima


– zbog (vrlo) mogućih nepredviđenih scenarija
• U fazi analize korisnici i developeri istražuju i analiziraju
problematiku projekta za kasniju definiciju SOW
(Statement of work) i zahtjeva te odluke o izvedivosti
projekta (kreće li se u sam projekt)
• Često se događa da se projekti zbog inercije ili politike
provode bez obzira na indikatore koji upućuju da projekt
neće biti izvediv
• Ako je projekt održiv, fokus ove faze je da se prouči
potencijalni sustav i utvrde potrebni zahtjevi

Objektno orijentirano programiranje


2. Izrada SOW (Statement of Work) 62

dokumenta

• SOW je dokument koji opisuje sustav


• Iako je utvrđivanje zahtjeva cilj prve faze, u ovom
trenutku zahtjevi još nisu u konačnoj formi
• SOW bi trebao sadržavati sve informacije potrebne da bi
se sustav razumio
• Mnogi klijenti izrađuju Request for proposal što je slično
SOW-u
– U njemu opisuju kako bi sustav trebao izgledati i šalju
različitim proizvođačima
– Na temelju toga proizvođači odlučuju natječu li se za
projekt i kolika bi bila njihova predložena cijena

Objektno orijentirano programiranje


2. Izrada SOW (Statement of Work) 63

dokumenta

Objektno orijentirano programiranje


64
3. Prikupljanje zahtjeva

• Dokument zahtjeva opisuje što korisnici žele da sustav radi


• Detalji zahtjeva ne trebaju biti tehničke prirode već trebaju
biti specifični u pogledu onoga što korisnici žele od konačnog
proizvoda
• Moraju biti dovoljno specifični da bi dizajneri mogli započeti
fazu dizajna
• Dokument zahtjeva je obično lista zahtjeva za pojedine
specifične funkcionalnosti sustava
• Zahtjevi su konačni prikaz onoga što se treba implementirati
• Svi budući dokumenti u razvojnom procesu se temelje na
zahtjevima

Objektno orijentirano programiranje


65
4. Razvoj prototipa korisničkog sučelja

• Jedan od najboljih načina da budemo sigurni da korisnici i


developeri razumiju i imaju zajedničku viziju sustava je razvoj
prototipa
• Većina ljudi prototipom smatra simulirano korisničko sučelje
• Stvaranje stvarnih formi, prozora i interakcije s programom
• Prototip neće sadržavati sve funkcionalnosti konačnog
sustava
• Ne moraju biti stvarni prozori i ekrani koje će korisnik vidjeti
u konačnom proizvodu, može biti i prezentacija na ploči ili
papiru
• Dobar prototip može pomoći pri identifikaciji potrebnih klasa

Objektno orijentirano programiranje


66
5. Identifikacija klasa

• Može početi već nakon izrade liste zahtjeva


• Jedan način pristupa je da se sve imenice iz zahtjeva označe
(predstavljaju ljude, objekte mjesta, stvari)
• Kroz više iteracija se klase uklanjaju i dodaju dok ne dođemo
do željenog dizajna
• Konačni rezultat možda uopće neće nalikovati na prvu fazu

Objektno orijentirano programiranje


67

6. Određivanje odgovornosti za svaku


klasu

• Podaci koje klasa treba pohranjivati


• Operacije koje treba obavljati

Objektno orijentirano programiranje


68
7. Određivanje kako različite klase
obavljaju interakciju

• Poruke među klasama – jedna klasa može zatražiti


informacije od druge klase ili zatražiti da druga klasa obavi
neku operaciju

Objektno orijentirano programiranje


69
8. Stvaranje class modela koji
opisuje sustav koji će se izraditi

• Nakon što su određene klase, odgovornosti klasa i


međudjelovanje izrađuje se class model
• Class model predstavlja sustav koji će se izraditi
• Prikazuje klase i njihove odnose
• Koriste se UML alati za izradu modela

Objektno orijentirano programiranje


Object wrappers
70

• OO pristup u sebi ima i proceduralnog koda


• Npr. implementacije metoda u sebi sadrže većinom
proceduralni kod
• Proceduralni kod sadrži elemente koji nisu objekti: petlje,
uvjetne izraze…
class SredisnjaAplikacija{
public static void main(string args[]){
int z = 9;

if (z <= 10){
if (z == 3) System.out.println("z iznosi:" + z);
z = z+1;
}
}
};

Objektno orijentirano programiranje


71

Wrapping strukturiranog koda


class TestiranjeKlaseMatematika{
public static void main(string args[])
{
int z = 0;
Matematika m = new Matematika();
z = m.zbroji(3, 4);
System.out.println("Vrijednost od z je " + z);

}
}; class Matematika{
public int zbroji(int a, int b){
return a + b;
}
};

Objektno orijentirano programiranje


72

Wrapping proceduralnog koda


Objekt

Metoda

Proceduralni kod

Objektno orijentirano programiranje


73

Wrapping postojećih klasa


• Iako nije očit slučaj, ponekad je potrebno napraviti wrapper i
za OO kod
• Često se radi o kodu kojeg je netko drugi napisao i na takav
način se prilagođava funkcionalnost trenutnim potrebama
• Promjena interfejsa ili implementacija neke klase na način da
se napravi wrapper – primjer čitača baze podataka

Objektno orijentirano programiranje


74

na primjer s
Vratimo se
matematikom

Objektno orijentirano programiranje


75

class TestiranjeKlaseMatematika{
public static void main(string args[])
{
int z = 0;
Matematika m = new Matematika();
z = m.zbroji(3, 4);
System.out.println("Vrijednost od z je " + z);

}
}; class Matematika{
public int zbroji(int a, int b){
return a + b;
}
};

Objektno orijentirano programiranje


76

class TestiranjeKlaseMatematika{
public static void main(string args[])
{
int z = 0;
z = Matematika.zbroji(3, 4);
System.out.println("Vrijednost od z je " + z);

}
};
class Matematika{
public static int zbroji(int a, int b){
return a + b;
}
};

Objektno orijentirano programiranje


77

ko OOP pojmova
Još nekoli

Objektno orijentirano programiranje


78

C++
operator overloading
§ Operator overloading u C++ omogućuje programeru davanje
novog značenja predefiniranim C++ operatorima
– Ovo se radi tako da kreiramo metode klase čije „ime”
odgovara imenu predefiniranih operatora u C++
– Na primjer, C++ string klasa ima definiran „+” operator za
konkatenaciju stringova
§ Programerima je dopušteno „overload-anje” većine operatora
– aritmetičke operacije (+, -, *, /, %)
– operacije usporedbe(<, <=, >, >=, ==, !=)
– input / output operacije (>>, <<)

Objektno orijentirano programiranje


79

C++
operator overloading
§ Sintaksa je relativno kompleksna
§ prilikom definiranja metode koristimo ključnu riječ
„operator” nakon čega slijedi operator kojeg želimo koristiti
§ Na primjer, možemo zamijeniti „add” metodu sa „operator +”
i „subtract” sa „operator –”
§ Kako bismo izgradili izraze koji izgledaju poput aritmetičkih,
moramo se držati ovih pravila:
§ Moramo poslati samo JEDAN value parametar koji je tipa
class_type
§ Vratiti vrijednost tipa class_type nakon obavljene operacije

Objektno orijentirano programiranje


Operator overloading
80

• Moguće je overloadati većinu ugrađenih C++ operatora


class Box {
public:
double getVolume(void) {
return length * breadth * height; int main() {
} Box Box1;
... Box Box2;
Box operator+(const Box& b) { Box Box3;
Box box; double volume = 0.0;
box.length = this->length + b.length; ...
box.breadth = this->breadth + b.breadth; Box3 = Box1 + Box2;
box.height = this->height + b.height; volume = Box3.getVolume();
return box; cout << "Volume of Box3 : " <<
} volume <<endl;
private: return 0;
double length; }
double breadth;
double height;
};

Objektno orijentirano programiranje


Compile time vs. Runtime polimorfizam
81

Compile time class Geeks {


public:
polimorfizam: void func(int x) {
cout << "value of x is " << x << endl;
• postiže se }
void func(double x) {
korištenjem cout << "value of x is " << x << endl;
function }
void func(int x, int y) {
overloading ili cout << "value of x and y is " <<x<<", "<<y<< endl;
operator };
}

overloadinga int main() {


Geeks obj1;
obj1.func(7);
obj1.func(9.132);
obj1.func(85,64);
return 0;
value of x is 7
}
value of x is 9.132
value of x and y is 85, 64

Objektno orijentirano programiranje


Compile time vs. Runtime polimorfizam
82

Compile time class Complex {


private:
polimorfizam: int real, imag;
public:
• postiže se Complex(int r = 0, int i =0) {real = r; imag = i;}
korištenjem Complex operator + (Complex const &obj) {
Complex res;
function res.real = real + obj.real;
overloading ili res.imag = imag + obj.imag;
return res;
operator }
void print() { cout<<real<<" + i"<<imag<<endl; }
overloadinga };
int main() {
Complex c1(10, 5), c2(2, 4);
Complex c3 = c1 + c2;
c3.print();
12 + i9 }

Objektno orijentirano programiranje


Compile time vs. Runtime polimorfizam
83

class base {
Runtime public:
virtual void print ()
polimorfizam: { cout<< "print base class" <<endl; }
void show ()
• postiže se { cout<< "show base class" <<endl; }
};
korištenjem class derived:public base {
function public: Virtual po default-u
void print ()
overridinga { cout<< "print derived class" <<endl; }
void show ()
• Kažemo da je { cout<< "show derived class" <<endl; }
bazna klasa };
int main() { Pointer
overrideana base *bptr;
derived d;
bptr = &d; virtualna funkcija, binded at
bptr->print(); runtime (runtime polymorphism)
print derived class bptr->show();
show base class return 0; Ne-virtualna funkcija, binded at
} compile time

Objektno orijentirano programiranje


84

Static vs. late binding


• Ovo je povezano sa static (early) i dynamic (late) binding

Polymorphism
• 1. Static binding/Compile-Time binding/Early
binding/Method overloading. (u istoj klasi)
• 2. Dynamic binding/Run-Time binding/Late
binding/Method overriding. (u različitim klasama)

Objektno orijentirano programiranje


Objektno orijentirano
programiranje

KRAJ

You might also like