You are on page 1of 82

Objektno orijentirano

programiranje
Frameworks, kontrola pristupa,
postojani objekti, kompleksnost
sustava
2

class Shape {
protected:
int width, height;
public:
Shape(int a = 0, int b = 0) {
width = a;
height = b;
}
void area() {
cout << "Parent class area :" << endl;
}
};

Objektno orijentirano programiranje


3
class Rectangle : public Shape {
private:
bool isSquare;
public:
Rectangle(int a = 0, int b = 0):Shape(a, b) {
isSquare = a == b;
}
void area() {
<< "Rectangle class area :" << (width * height) << endl;
}
void sayIsSquare(){
if(isSquare) cout << "Square" << endl;
else cout << "Not square" << endl;
}
};

Objektno orijentirano programiranje


4

int main() {
Rectangle shape[4];
Rectangle r1(10, 7);
Rectangle r2(10, 10);

shape[0] = r1;
shape[1] = r2;

shape[0].area();
shape[1].area();

shape[0].sayIsSquare();
shape[1].sayIsSquare();
}

Objektno orijentirano programiranje


5

int main() {
Što ako promijenimo u Shape
Shape shape[4];
Rectangle r1(10, 7);
Rectangle r2(10, 10);

shape[0] = r1;
shape[1] = r2;

shape[0].area();
shape[1].area(); ERROR: ne postoji sayIsSquare

shape[0].sayIsSquare();
shape[1].sayIsSquare();
}

ect slicing
Obj
Objektno orijentirano programiranje
6

...
void virtual area() {
cout << "Parent class area :" << endl;
}
...

int main() {
Shape * shape[4];
Rectangle r1(10, 7);
Rectangle r2(10, 10);

shape[0] = &r1;
shape[1] = &r2;

(*shape[0]).area();
(*shape[1]).area();

}
polymorphism
run time
Objektno orijentirano programiranje
7

S.O.L.I.D.

rinc iples ** by Robert C. Martin


bject- ori ented design(OOD)** p
First five o

Objektno orijentirano programiranje


8

S.O.L.I.D
• Single-responsibility Principle
• Open-closed Principle
• Liskov substitution principle
• Interface segregation principle
• Dependency Inversion principle

https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design

Objektno orijentirano programiranje


9

S.O.L.I.D
Single-responsibility Principle

• Klasa treba imati samo jedan razlog da bi se mijenjala


• Klasa treba imati samo jedan zadatak

Objektno orijentirano programiranje


Single-responsibility Principle
10

class Circle {
public $radius;

public function construct($radius) {


$this->radius = $radius;
}
}

class Square {
public $length;

public function construct($length) {


$this->length = $length;
}
}

Objektno orijentirano programiranje


Single-responsibility Principle
11

class AreaCalculator {
protected $shapes;
public function __construct($shapes = array()) {
$this->shapes = $shapes;
}
public function sum() {
// logic to sum the areas
}
public function output() {
return implode('', array(
"",
"Sum of the areas of provided shapes: ",
$this->sum(),
""
));
}
}

Objektno orijentirano programiranje


Single-responsibility Principle
12

$shapes = array(
new Circle(2), Problem! AreaCalculator se ne bi
trebala baviti ispisom podataka.
new Square(5),
new Square(6)
);

$areas = new
AreaCalculator($shapes);

echo $areas->output();

Što ako netko poželi output u


različitim formatima?

Objektno orijentirano programiranje


Single-responsibility Principle
13

$shapes = array(
new Circle(2),
new Square(5),
new Square(6)
);

$areas = new AreaCalculator($shapes);


$output = new SumCalculatorOutputter($areas);

echo $output->JSON(); Bilo koja logika koja se bavi


echo $output->HAML(); ispisivanjem podataka.
echo $output->HTML();
echo $output->JADE();

Objektno orijentirano programiranje


14

S.O.L.I.D
Open-closed principle

• Objekti ili entiteti trebaju biti spremni za proširenja, ali


zatvoreni za modifikacije!

Objektno orijentirano programiranje


Open-closed principle
15

public function sum() {


foreach($this->shapes as $shape) {
if(is_a($shape, 'Square')) {
$area[] = pow($shape->length, 2);
} else if(is_a($shape, 'Circle')) {
$area[] = pi() * pow($shape->radius, 2);
}
}
return array_sum($area);
}
Problem! Ukoliko dodamo novu
vrstu oblika, potrebno je
modificirati ovu funkciju.

Objektno orijentirano programiranje


Open-closed principle
16

class Square { area() je sada metoda unutar


public $length; klase

public function __construct($length) {


$this->length = $length;
}

public function area() {


return pow($this->length, 2);
}
}

Objektno orijentirano programiranje


Open-closed principle
17

public function sum() {


foreach($this->shapes as $shape) {
$area[] = $shape->area();
}

return array_sum($area);
}

Spremno za proširenja, ali nije


potrebno modificirati sum()

Kako možemo garantirati da svaki


shape posjeduje area()?
interface

Objektno orijentirano programiranje


Open-closed principle
18

interface ShapeInterface {
public function area();
}

class Circle implements ShapeInterface {


public $radius;

public function __construct($radius) {


$this->radius = $radius;
}

public function area() {


return pi() * pow($this->radius, 2);
}
}

Objektno orijentirano programiranje


Open-closed principle
19

public function sum() {


foreach($this->shapes as $shape) {
if(is_a($shape, 'ShapeInterface')) {
$area[] = $shape->area();
continue;
}
throw new AreaCalculatorInvalidShapeException;
}
return array_sum($area);
}

Objektno orijentirano programiranje


20

S.O.L.I.D
Liskov substitution principle

• Neka je q(x) dokazivo svojstvo o objektu x koji je tipa T.


Onda q(y) mora biti dokazivo za objekt y tipa S, ukoliko
je S podtip od T.

Objektno orijentirano programiranje


Liskov substitution principle
21

class VolumeCalculator extends AreaCalulator {


public function construct($shapes = array()) {
parent::construct($shapes);
}
public function sum() {
// logic to calculate the volumes and then
return an array of output
return array($summedData); Drugim riječima: svaka podklasa
} može se koristiti kao zamjena
parent klase!
}

Kreiramo ColumeCalculator, koji


nasljeđuje SumCalculator

Za razliku od prethodnih metoda


sum(), sada vraćamo array
(umjesto float-a)

Objektno orijentirano programiranje


Liskov substitution principle
22

class SumCalculatorOutputter {
protected $calculator;
public function __constructor(AreaCalculator
$calculator) {
$this->calculator = $calculator;
}
public function JSON() {
$data = array(
'sum' => $this->calculator->sum();
);
return json_encode($data);
} Pozivamo sum()
public function HTML() {
return implode('', array(
'',
'Sum of the areas of provided shapes: ',
$this->calculator->sum(),
''
));
} Program se ne buni, ali neće
} funkcionirati.

Objektno orijentirano programiranje


Liskov substitution principle
23

$areas = new AreaCalculator($shapes);


$volumes = new VolumeCalculator($solidShapes);

$output = new SumCalculatorOutputter($areas);


$output2 = new SumCalculatorOutputter($volumes);

public function sum() {


// logic to calculate the volumes and then return
and array of output
return $summedData;
}

Objektno orijentirano programiranje


Liskov substitution principle
24
Još jedan primjer
from abc import ABC, abstractmethod

class Notification(ABC): Email i SMS nasljeđuju


@abstractmethod Notification
def notify(self, message, email):
pass

class Email(Notification):
def notify(self, message, email):
print(f'Send {message} to {email}')

class SMS(Notification):
def notify(self, message, phone):
print(f'Send {message} to {phone}') notify() od Emaila i notify() od
SMS nemaju isti potpis.
if __name__ == '__main__’:
notification = SMS()
notification.notify('Hello', 'john@test.com')

Objektno orijentirano programiranje


Liskov substitution principle
25

class Contact:
def __init__(self, name, email, phone):
self.name = name
self.email = email
self.phone = phone

class NotificationManager:
def __init__(self, notification, contact): send() provjerava o kojoj klasi je
self.contact = contact riječ. Ovo nije dobro.
self.notification = notification

def send(self, message):


if isinstance(self.notification, Email):
self.notification.notify(message, contact.email)
elif isinstance(self.notification, SMS):
self.notification.notify(message, contact.phone)
else:
raise Exception('The notification is not supported')

if __name__ == '__main__’:
contact = Contact('John Doe', 'john@test.com', '(408)-888-9999’)
notification_manager = NotificationManager(SMS(), contact)
notification_manager.send('Hello John')

Objektno orijentirano programiranje


Liskov substitution principle
26

from abc import ABC, abstractmethod class NotificationManager:


def __init__(self, notification): send() je
self.notification = notification
class Notification(ABC): sada
@abstractmethod def send(self, message): jednostavniji
def notify(self, message): self.notification.notify(message)
pass

if __name__ == '__main__’:
class Email(Notification): contact = Contact('John Doe', 'john@test.com',
def __init__(self, email): '(408)-888-9999')
self.email = email
sms_notification = SMS(contact.phone)
def notify(self, message): email_notification = Email(contact.email)
print(f'Send "{message}" to {self.email}')
notification_manager =
NotificationManager(sms_notification)
class SMS(Notification): notification_manager.send('Hello John')
def __init__(self, phone):
self.phone = phone notification_manager.notification =
email_notification
def notify(self, message): notification_manager.send('Hi John')
print(f'Send "{message}" to {self.phone}')

class Contact:
def __init__(self, name, email, phone):
self.name = name
self.email = email
self.phone = phone
Dodali smo
Contact klasu

Objektno orijentirano programiranje


27

S.O.L.I.D
Interface segregation principle

• Klijenta nikad ne treba prisiljavati da implementira


sučelje koje ne koristi u potpunosti
• Klijenta ne treba prisiljavati da implementira metode
koje mu ne trebaju

Objektno orijentirano programiranje


Interface segregation principle
28

interface ShapeInterface { Svaki Shape mora imati i


public function area(); volume(), a to nije nešto što
public function volume(); želimo uvijek (postoji i 2D
} oblici)

Objektno orijentirano programiranje


Interface segregation principle
29

interface ShapeInterface {
public function area();
}

interface SolidShapeInterface {
public function volume();
}

class Cuboid implements ShapeInterface, SolidShapeInterface {


public function area() {
// calculate the surface area of the cuboid
}

public function volume() {


// calculate the volume of the cuboid
}
}

Objektno orijentirano programiranje


Interface segregation principle
30

interface ManageShapeInterface{
public function calculate();
}

class Square implements ShapeInterface, ManageShapeInterface{


public function area(){
// calculate the area of the square
}

public function calculate(){


return $this->area();
}
}
s
class Cuboid implements ShapeInterface, ThreeDimensionalShapeInterface, ManageShapeInterface{
public function area(){
// calculate the surface area of the cuboid
}
public function volume(){
// calculate the volume of the cuboid
}
public function calculate(){
return $this->area();
}
}

Objektno orijentirano programiranje


31

S.O.L.I.D
Dependency Inversion principle

• Entiteti moraju ovisiti o abstrakcijama, a ne


konkretizacijama.
• High level module ne smije ovisiti o low level modulu

Objektno orijentirano programiranje


Dependency Inversion principle
32

class PasswordReminder {
private $dbConnection; High level modul

public function __construct(MySQLConnection $dbConnection)


{
Low level modul
$this->dbConnection = $dbConnection;
}
} Problem! MySQLConnection je konkretizacija, a
to želimo izbjeći. Želimo postići
abstrakciju!

interface DBConnectionInterface {
public function connect();
}

Opet koristimo interface.


Sada možemo koristiti i neki
drugu vrstu baze

Objektno orijentirano programiranje


Dependency Inversion principle
33

class MySQLConnection implements DBConnectionInterface {


public function connect() {
return "Database connection";
}
}

class PasswordReminder { interface!


private $dbConnection;

public function __construct(DBConnectionInterface


$dbConnection) {
$this->dbConnection = $dbConnection;
}
}

Objektno orijentirano programiranje


34

Frameworks

Objektno orijentirano programiranje


35

Framework
• Ponovno korištenje koda
– nije isključivo za OO programiranje
• Framework i standardizacija – jednoznačnost korištenja kako
za programera i tako i za krajnjeg korisnika programa
• Npr. stvaranje prozora u Windowsima je standardizirano sa
istim funkcionalnostima
• Kod korišten u frameworku je već testiran
• Postoje frameworks za različite primjene (npr. word
processing – definirane su standardne radnje kao copy-paste,
otvaranje, spremanje, pretraga, …)
• Učenje i iznova programiranje već napravljenih stvari nije
isplativo
Objektno orijentirano programiranje
36

Framework
• Očito pitanje je – ako trebamo koristiti dijalog-box koji
nam pruža framework – kako ga upotrijebiti?
• Pravila korištenja se obično nalaze u dokumentaciji
framework-a
• Osoba koja piše klasu/klase je zadužena i za pisanje
dokumentacije kako koristiti javni interfejs klase
• Veće tvrtke obično napišu i koriste svoj framework
specifičan za njihove aplikacije
• Postoje i general-purpose frameworks i libraries
• Postoje različite definicije frameworka

Objektno orijentirano programiranje


37

Framework
• Po nekim definicijama framework predstavlja veću
cjelinu/generalniji pojam od biblioteke, može biti i skup
biblioteka
• Framework za razliku od biblioteke upravlja tokom
programa – inversion of control – tok programa ne diktira
korisnik već framework

Objektno orijentirano programiranje


38

Inversion of Control
d b y t h e a p p li ca tion
fa ce s w e r e c o n trolle
"Early user inte r o f c o m m a n d s li ke
u ld h a v e a s e q u ence
program. You wo p r o g r a m w o u ld drive
e nt e r a d d r e s s " ; your
"Enter name", " t o e a c h o n e . W ith
p ic k u p a r e s p o nse
the prompts and n b a s e d) U Is t h e U I f r a m e work
e v e n s cr e e e ad
graphical (or lo o p a n d you r p r o g r a m in st
is m a in
would contain th r s fo r the v a r io u s fie ld s o n the
e n t h a n d le e d,
provided ev l o f t h e pr o g r a m w a s in v e r t
c o n t r o
screen. The main to t h e f r a m e w o rk."
ove d a w a y fr o m you
m

Objektno orijentirano programiranje


39

Inversion of Control
print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

when the user types in field a, store it in NAME


when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

o više od toga
ak, IoC je mal
Ip
Objektno orijentirano programiranje
40

Inversion of Control
public static void main(String[] args) {
while (true) {
BufferedReader userInputReader = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Please enter some text: ");
try {
System.out.println(userInputReader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}

main metoda kontrolira flow


Objektno orijentirano programiranje
41

Inversion of Control doGet i doPost se


pozivaju automatski (od
public class MyServlet extends HttpServlet { strane frameworka)

protected void doPost(


HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// developer implementation here
}

protected void doGet(


HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// developer implementation here
}

httpServlet klasa pripada frameworku

Objektno orijentirano programiranje


42

S.O.L.I.D.
S - Single-responsiblity principle
O - Open-closed principle
L - Liskov substitution principle
I - Interface segregation principle
D - Dependency Inversion Principle

https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design

Objektno orijentirano programiranje


43

S.O.L.I.D.
S - Single-responsiblity principle
O - Open-closed principle
L - Liskov substitution principle
I - Interface segregation principle
D - Dependency Inversion Principle

dependency injection (youtube)

Objektno orijentirano programiranje


44

Framework vs. biblioteka


• Biblioteke su stariji koncept, frameworks su „noviji”
• Oboje imaju definiran API sa uputama za korištenje
• Biblioteka se može promatrati kao specifična funkcionalnost
aplikacije, a framework kao kostur aplikacije
• Ponekad se ova dva pojma miješaju ovisno o tome tko ih
koristi
• Framework nudi proširivost na način da možemo naslijediti
klase i pružiti novu/prilagođenu funkcionalnost
• Framework rješava strukturalne i arhitektonske probleme,
biblioteka ne

Objektno orijentirano programiranje


45

Contracts
• Mehanizam koji zahtjeva od developera da se pridržava
specifikacija API-ja ili frameworka
• To znači da se pridržava načina imenovanja metoda
(standard imenovanja) i korištenja putem kojeg se
osigurava dobra praksa pisanja koda
• Standard nema smisla ako ga ljudi ne koriste što rezultira
nerazumljivim kodom
• U Javi i .NET jezicima pridržavanje se osigurava
apstraktnim klasama i interfejsima

Objektno orijentirano programiranje


rola pristupa 46

etimo se: kont


Podsj

• private – samo ova klasa ima pristup poljima i


metodama
• protected – ova klasa i njeni nasljednici imaju
pristup poljima i metodama
• public – i ostale klase imaju pristup poljima i
metodama

Objektno orijentirano programiranje


47
class Base {
private:
int MyPrivateInt;
protected:
int MyProtectedInt;
public:
int MyPublicInt;
};

class Derived : Base{


public:
int foo1() { return MyPrivateInt;} // Won't compile!
int foo2() { return MyProtectedInt;} // OK
int foo3() { return MyPublicInt;} // OK
};

class Unrelated {
private:
Base B;
public:
int foo1() { return B.MyPrivateInt;} // Won't compile!
int foo2() { return B.MyProtectedInt;} // Won't compile
int foo3() { return B.MyPublicInt;} // OK
};

Pogledajmo ipak još detaljnije!

Objektno orijentirano programiranje


class base { 48
public:
int x;
protected:
int y;
private:
int z;
};
class publicDerived: public base{
// x is public
// y is protected
// z is not accessible from publicDerived
};
class protectedDerived: protected base{
// x is protected
// y is protected
// z is not accessible from protectedDerived
};
class privateDerived: private base{
// x is private
// y is private
// z is not accessible from privateDerived
}

Objektno orijentirano programiranje


49

Objektno orijentirano programiranje


50

j mo još ne ke
Pogleda
imj er e u Jav i
pr

Objektno orijentirano programiranje


package mypackage;
51

class Person {
private String firstname;
private String lastname;

protected void setFirstname(String firstname) {


this.firstname = firstname;
}

protected void setLastname(String lastname) {


this.lastname = lastname;
}

protected String getFirstname() {


return this.firstname;
}

protected String getLastname() {


return this.lastname;
}
}

Objektno orijentirano programiranje


package mypackage; 52

public class Company {


private ArrayList<Person> people;

public Company() {
this.people = new ArrayList<Person>();
}
public void addPerson(String firstname, String lastname) {
Person p = new Person();
p.setFirstname(firstname);
p.setLastname(lastname);
this.people.add(p);
}
public void printPeople() {
for(int i = 0; i < this.people.size(); i++) {
System.out.println(
this.people.get(i).getFirstname() + " " +
this.people.get(i).getLastname());
}
}
}

Objektno orijentirano programiranje


53
Različito se ponaša
package mypackage;
ako je MainDriver u
istom package-u i
import mypackage.*; ako je u drugom

public class MainDriver {


public static void main(String[] args) {
Company c = new Company();
c.addPerson("Nic", "Raboy");
c.printPeople();

Person p = new Person();


p.setFirstname("Maria");
p.setLastname("Campos");
}
}

Objektno orijentirano programiranje


54

U Javi

• private – samo ova klasa ima pristup poljima i


metodama
• protected – ova klasa, njeni nasljednici i sve
klase u istom packageu imaju pristup poljima
i metodama
• public – i ostale klase imaju pristup poljima i
metodama

Objektno orijentirano programiranje


55

š malo na C++
Vratimo se jo

Objektno orijentirano programiranje


56

Friend funkcije u C++


• Friend funkcija klase se definira izvan dosega klase, ali ona
ima pristup svim private i protected varijablama
• Iako se prototipovi friend funkcija pojavljuju u definiciji
klase, friend funkcije nisu member functions
• Koristimo ključnu riječ friend

• Prijateljstvo nije simetrično


• Prijateljstvo nije tranzitivno
• Prijateljstvo nije nasljedno

Objektno orijentirano programiranje


57
class Box {
double width;
public: Definicija member funkcije
friend void printWidth( Box box );
void setWidth( double wid );
};
void Box::setWidth( double wid ) {
width = wid; printWidth nije member funkcija!
}
void printWidth( Box box ) {
cout << "Width of box : " << box.width << endl;
}
int main() { Ali imamo pristup privatnim
Box box; atributima
box.setWidth(10.0);
printWidth( box );
return 0;
}

Objektno orijentirano programiranje


58

Linijske (inline) funkcije u C++


• Koristimo ključnu riječ inline
• Najčešće one funkcije koje imaju mali broj instrukcija u
tijelu
• Compiler će u toku kompajliranja zamijeniti svaki
poziv inline funkcije sa kodom koji se nalazi unutar
tijela inline funkcije
• Sve member funkcije klase čija se definicija nalazi
unutar tijela klase automatski postaju linijske (i bez
ključne riječi inline)
• Ipak, compiler odlučuje sam je li stvarno linijska
funkcija

Objektno orijentirano programiranje


59

tojani objekti
Pos

Objektno orijentirano programiranje


60

Postojani objekti - osnove


• eng. persistent objects
• Bez obzira na veličinu poslovne aplikacije, ona će gotovo
uvijek koristiti baze podataka
• Podaci su temelj programa
• Kada se objekt instancira u aplikaciji on živi maksimalno
koliko i aplikacija
• Da bi objekt nastavio „živjeti” i nakon što aplikacija završi
mora biti zapisan u neku vrstu sustava pohrane
• Stanje objekta je definirano vrijednošću njegovih atributa

Objektno orijentirano programiranje


61

Postojani objekti - osnove


• Koncept spremanja stanja
objekta na način da se može
Aplikacija 1
kasnije ponovno koristiti zove
se postojanost (eng. Zapiši objekt
persistence)
• Pojam postojani objekt (eng. Sustav
persitstent object) označava pohrane
objekt čije se stanje može vratiti
i koristiti neovisno o samo Učitaj objekt
Aplikacija 2
jednoj aplikaciji

Objektno orijentirano programiranje


62

Postojani objekti - osnove


Postoje različiti načini spremanja stanja objekta, neki od njih su:
• Spremanje u file
• Spremanje u relacijsku bazu podataka
• Spremanje u objektnu bazu podataka

• Najjednostavniji način je spremanje u datoteku, što nije


standard kod poslovnih aplikacija

Objektno orijentirano programiranje


63

Spremanje objekata u datoteku


• Zapisivanje objekta u datoteku je različito od zapisivanja
vrijednosti neke varijable u datoteku
• Spremanje varijabli u npr. tekstualnu datoteku (vrijednosti
odvojene delimiterom)
• Objekt nije samo kolekcija primitivnih tipova, može sadržavati
i druge objekte
• Da bi smo spremili objekt moramo ga razbiti u manje dijelove
koje onda možemo zapisati u datoteku
• Moramo znati na koji način objekt ponovno vratiti u izvorni
oblik

Objektno orijentirano programiranje


64

Serijalizacija
• Da bi objekt slali kroz kanal (npr. putem interneta) potrebno ga
je dekonstruirati (razbiti u elementarne podatke, npr. byte
stream), poslati i onda ga ponovno složiti na drugom kraju kanala
– ovaj proces naziva se serijalizacija (eng. serialization)
• Proces samog slanja kroz mrežu zove se „marshaling”
• Serijalizirani objekt se može zapisati u file i poslije opet vratiti u
originalno stanje
• Serijaliziacija i deserijalizacjia trebaju koristiti iste specifikacije
(metodu dekompozicije i kasnije vraćanja u stanje objekta) –
slično kao enkripcijski algoritam
• Java pruža interfejs – Serializable
• .NET jezici pružaju interfejs ISerializable

Objektno orijentirano programiranje


65

Spremanje objekata u datoteku


• Moderni jezici imaju ugrađene mehanizme za postojanost
objekata
• Kao i većina jezika Java koristi koncept toka za I/O
• Da bi spremili objekt u datoteku Java koristi Stream
• Da bi pisali u Stream objekt mora implementirati interfejs
Serializable ili Externaizable
• Ograničenje ovakvog pristupa je da se za vraćanje objekta
treba koristiti isti mehanizam/tehnologija (Java)
• Java mora biti na obje strane ovog procesa

Objektno orijentirano programiranje


66

Serijalizacija u Javi
package Serialization;
import java.util.*;
import java.io.*;
class Osoba implements Serializable{
private String ime;
public Osoba(){
}
public Osoba(String i){
System.out.println(“Konstruktor”);
ime = i;
}
String dohvatiIme() {
return ime;
}
}

Objektno orijentirano programiranje


67

Serijalizacija u Javi
public class SpremiOsobu implements Serializable{
public SpremiOsobu(){
Osoba osoba = new Osoba(“Ivo Ivić”);
try{
FileOutputStream fos = new FileOutputStream(“Dat.txt”);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(osoba);
oos.flush();
oos.close();
} catch(Exception e){
e.printStackTrace();
}
}
}

Objektno orijentirano programiranje


68

Serijalizacija u Javi
U ovom primjeru:

• Instancira se objekt Osoba


• Objekt se serijalizira
• Objekt se sprema u datoteku Dat.txt

• Objekt se jednostavno serijalizira sa:


• oos.writeObject(osoba);

Objektno orijentirano programiranje


69

Serijalizacija u Javi
package Serialization;
import java.io.*;
import java.util.*;
public class UcitajOsobu{
public UcitajOsobu(){
try{
FileInputStream fis = new FileInputStream(“Dat.txt”);
ObjectInputStream ois = new ObjectInputStream(fis);
Osoba osoba = (Osoba)ois.readObject();
System.out.print(“Učitano ime osobe: “);
System.out.println(osoba.dohvatiIme());
ois.close();
} catch(Exception e){
e.printStackTrace();
}
}
}

Objektno orijentirano programiranje


70

Što se događa s metodama pri serijalizaciji


• Objekti se po definiciji sastoje od atributa i metoda
• Atributi se serijaliziraju, ali što je s metodama?
• U primjeru Jave metode se ne serijaliziraju
• Pri ovakvoj serijalizaciji Java treba biti na obje strane procesa
(serijalizacija i deserijalizacija)
• Ako jedna aplikacija serijalizira, druga aplikacija koja radi
deserijalizaciju treba imati istu definiciju klase
• Ipak, što se tiče programera nema konceptualne razlike (iako
fizička implementacija ne odgovara točno konceptualnom
modelu)

Objektno orijentirano programiranje


71

Korištenje XML-a u procesu serijalizacije


• Vidjeli smo primjer
serijalizacije na jednoj
platformi [XmlRoot(“osoba”)]
• XML nam omogućuje public class Osoba
...
serijalizaciju/deserijalizaciju [XmlAttribute(“ime”)]
kroz različite platforme public String Ime
...
• Generira se XML file koji [XmlElement(“god_starosti”)]
predstavlja atribute klase public int God_starosti
Osoba
• Da bi u C# omogućili ovu
funkcionalnost potrebne su
dodatne definicije u klasi
Objektno orijentirano programiranje
72

Korištenje XML-a u procesu serijalizacije


public void Serialize()
{
Osoba[] ljudi = new Osoba[3];
ljudi[0] = new Osoba (“Ivo Ivić”, 32, 95);
ljudi[1] = new Osoba (“Mate Matić”, 35, 67);
ljudi[2] = new Osoba (“Jure Jurić”, 65, 77);
XmlSerializer serializator = new XmlSerializer(typeof(Osoba[]));
TextWriter writer = new StreamWriter(“osoba.xml”);
serializator.Serialize(writer, ljudi);
writer.Close();
}

Objektno orijentirano programiranje


73

Korištenje XML-a u procesu serijalizacije


<?xml version=”1.0” encoding=”utf-8”?>
<ArrayOfOsoba xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<Osoba ime=”Ivo Ivić”>
<god_starosti>32</god_starosti>
</Osoba>
<Osoba ime=”Mate Matić”>
<god_starosti>35</god_starosti>
</Osoba>
<Osoba ime=”Jure Jurić”>
<god_starosti>65</god_starosti>
</Osoba>
</ArrayOfOsoba>

Objektno orijentirano programiranje


74

Korištenje XML-a u procesu serijalizacije


public void DeSerialize()
{
Osoba[] ucitaniLjudi;
XmlSerializer serializator = new XmlSerializer(typeof(Osoba[]));
TextReader reader = new StreamReader(“osoba.xml”);
ucitaniLjudi = (Osoba[])serializator.Deserialize(reader);
Console.WriteLine(“Ucitani ljudi su:”);
foreach (Osoba osoba in ucitaniLjudi)
{
Console WriteLine(osoba.Ime + “ ima “ +
osoba.God_Starosti + “ godina.”);
}

Objektno orijentirano programiranje


75

Pisanje u relacijsku bazu podataka


• Relacijske baze podataka su jedan od najuspješnijih alata u IT
industriji
• Relacijske baze i danas igraju važnu ulogu iako možda postoje i
bolje tehnologije
• Velika većina poslovnih aplikacija koristi relacijske baze
podataka (Oracle, SQLServer, MSAccess…)
• Iako se radi o korisnom alatu, može doći do problema kada se
radi interakcija s objektima
• Objekt koji se potencijalno sastoji od drugih objekata želimo
zapisati u relacijski model koji nije dizajniran na OO način

Objektno orijentirano programiranje


76

Relacijske baze podataka sastoje se od tablica

Objektno orijentirano programiranje


77

Pisanje u relacijsku bazu podataka


• Objektno orijentirani model se ne temelji na tablicama
• Budući da se objekti ne mapiraju jednostavno u tablice
razvijene su objektno orijentirane baze podataka (90ih)
• Ipak, većina tvrtki koriste relacijske baze podataka i većina
ukupnih svjetskih podataka je spremljena u relacijskom
modelu
• Dodatna stavka u korist relacijskih baza je da one provjereno
funkcioniraju na različitim nivoima skaliranja

Objektno orijentirano programiranje


78

ZADATAK

• Serijalizacija u C#

Objektno orijentirano programiranje


class Program{
static void Main(string[] args){ 79
Student s = new Student("Ante", "Antić");
Serializator serializator = new Serializator();
int unos;
do{
Console.WriteLine("Odaberite opciju:");
Console.WriteLine("1) Serijalizacija");
Console.WriteLine("2) Deserijalizacija");
Console.WriteLine("0) Izlaz");
unos=Convert.ToInt32(Console.ReadLine());
switch (unos){
case 1:
serializator.Serijaliziraj(s);
Console.WriteLine("Student je serijaliziran");
break;
case 2:
Console.WriteLine("Deserijalizacija studenta...");
Student student = serializator.Deserijaliziraj();
Console.WriteLine("Ime deserijaliziranog studenta je: "
+ student.ime);
break;
}
} while (unos != 0);
}
}

Objektno orijentirano programiranje


80
[Serializable()]
class Student{
string prezime;
string strIme;
public Student(string _ime, string _prezime){
ime = _ime;
prezime = _prezime;
}
public string ime{
get{
return strIme;
}
set{
if (value == null) return;
strIme = value;
}
}
}

Objektno orijentirano programiranje


81
class Serializator{
public void Serijaliziraj(Student s){
FileStream fs = new FileStream("podaci.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, s);
fs.Close();
}
public Student Deserijaliziraj(){
FileStream fs = new FileStream("podaci.dat", FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
Student s = (Student)formatter.Deserialize(fs);
fs.Close();
return s;
}
}

Objektno orijentirano programiranje


Objektno orijentirano
programiranje

KRAJ

You might also like