Objektno programiranje
Objektno programiranje
1. Problemi kompatibilnosti, kontinuiteta i ponovnog koriscenja
Problem KOMPATIBILNOSTI je direktna posledica algoritamske orjentisanosti
izrade programa. Primera radi, ako razliciti timovi realizuju razlicite potprograme
jednog programa, oni jednu vrstu podataka mogu definisati kao razlicite strukture i
tada se svi potprogrami ne bi mogli implementirati u jedinstven program. Dakle,
postoji potreba da se na pocetku definisu i naprave sve strukture podataka i tek
onda pristupi izradi algoritama.
Problem KONTINUITETA zahteva da se moraju praviti programi za dugotrajnu
upotrebu, dakle, da to bude jedan projekat koji ce se vremenom nadogradjivati, jer
da bi projekat trajao na trzistu, u njega se moraju unositi izmene (tj. da se prave
verzije). Ove izmene najcesce znace uvodjenje novih funkcija, sto je izuzetno
nezgodno raditi kod algoritamski orjentisanih programa jer je skoro nemoguce uvek
menjati algoritam programa, dok je ove izmene dosta lako naciniti ukoliko se one
unose u strukturu podataka, pri cemu algoritam programa ostaje skoro netaknut.
Problem MOGUCNOSTI VISESTRUKE UPOTREBE (Reusability) zahteva da se
napisani softver moze koristiti ponovo vise puta, s tim da se dodaju neke izmene.
Primer: problem izrade prozora – da se prozor napravi jednom i da se svi ostali
prozori realizuju preko ovog postojeceg ubacivanjem nekih dodataka. Ovaj problem
je NEMOGUCE ostvariti algoritamski.
2. Odnos algoritma i strukture podataka
Objektni programer se dugo zadrzava u DOMENU PROBLEMA (deo realnosti gde
se nalazi ono sto zelimo resiti). Cilj mu je da IDENTIFIKUJE ENTITETE koji
postoje u tom domenu. Primer: u problemu resavanja sistema jednacina A*x=b
postoje entiteti matrice A i dva vektora x i b. Sledci korak je da se ENTITETI
KLASIFIKUJU – u nasem primeru su to klasa entiteta matrica i klasa entiteta
vektora. Zatim se ide na MODELOVANJE – izdvajanje za nas bitnih osobina klasa
entiteta i samih entiteta. Tek posle toga ide REALIZACIJA tj. pisanje softvera.
Potrebno je napomenuti da se u svaki model ukljucuje AKTIVNA
KOMPONENTA tj. sta se sa modelom moze raditi.
Primer modela klase MATRICA:
- Naziv klase: Matrica
NIVO DOMENA PROBLEMA
NIVO MODELOVANJA
NIVO REALIZACIJE
ENTITETI
KLASE ENTITETA
OBJEKTI
KLASA OBJEKATA
-
Podaci
: broj_vrsta, broj_kolona, vrenosti_elemenata
-
Operacije
: Upisati, Prikazati, ZadatiElement(i,j), OcitatiElement(i,j),
Invertovati, Transponovati, ...
Svaka klasa ima PRIVATNU STRUKTURU PODATAKA i time je problem
kompatibilnosti resen jer NEMA centralne strukture podataka. Takodje, svaka klasa
ima PRIVATNE ALGORITME, pa je zato svaka klasa SAMODOVOLJNA tj. ona
je struktura za sebe. Jednom napravljena klasa se vise ne treba menjati, vec se ona
koristi uz dodavanje nekih novih osobina, sto se postize mehanizmom
NASLEDJIVANJA.
Principi objektnog programiranja:
a) Princip APSTRAKCIJE – odabiranje osobina koje su nam bitne za dato
razmatranje.
b) Princip SKRIVANJA INFORMACIJA – stavljanje u drugi plan detalja
realizacije, koji su pri tome klijentu nedostupni.
c) INKAPSULACIJA – mehanizam za ostvarivanje prethodna dva principa
d) MODULARIZACIJA – (C++ koristi C-ove module)
e) POLIMORFIZAM – oznacava kontekstno zavisno ponasanje
f) Objektni program ima sve osobine sistema ciji su delovi povezani relacijama
(glavna osobina je nasledjivanje).
3. Definicija klase i objekta
Nasa definicija za objekat ce biti na nivou modelovanja.
Def.
Objekat je MODEL ENTITETA koji ima IDENTITET, STANJE i
PONASANJE.
STANJE je deo proslosti i sadasnjosti je neophodan za odredjivanje
buduceg ponasanja objekta.
IDENTITET je slicno nazivu, nesto po cemu razlikujemo objekte. Moze se
zadati kao naziv, preko adrese (pokazivacem) ili kljucem (koji bi trebao biti
drugi po redu posle naziva).
PONASANJE je reakcija objekta na pobudu u vidu izvodjenja operacija.
Sinonim za objekat je INSTANCA KLASE (Instance).
Def.
Klasa objekta predstavlja model klase entiteta koji obuhvata objekte sa
istom strukturom i ponasanjem. Opisno receno, ono sto je objekat za klasu,
to je promenjljiva za tip podataka.
Struktura objekta:

class Point{
private:
double x,y;
public:
void SetPoint(double xx, double yy) {x=xx; y=yy;}
double GetX() {return x;}
double GetY() {return y;}
double Distance();
};
//Naziv datoteke: POINT.CPP
#include “point.h”
double Point::Distance()
{
return sqrt(x*x+y*y);
}
Rec “private:” oznacava deo klase koji je zatvoren za klijenta, tj. nije mu dostupan
direktno. Rec “public:” oznacava deo klase koji je otvoren za klijenta, tj. direktno
mu je dostupan. Postoji jos i naredba “protected:”, koja oznacava segment dostupan
samo za privilegovane klijente.
Napomena: ako se u klasi ove labele ne navedu, onda se podrazumeva da vazi
PRIVATE, sto znaci da bi u klasi sve bilo zatvoreno za klijenta i klasa bi bila
neupotrebljiva – tako nas programski jezik navodi da razmisljamo o zastiti
podataka. Zato se “private:” cesto i ne pise jer ono vazi do dela sa labelom
“public:”.
Za funkcije clanice su podaci clanovi uvek OTVORENI (sto je prirodno, jer inace
ne bi imali smisla), bez obzira sto se nalaze pod naredbom “private:” i time je
klijentu omogucen pristup podacima clanovima samo preko funkcija clanica – tako
se vrsi kontrola pristupa podacima!
Funkcije clanice (metode) se mogu zadati na dva nacina:
a) INLINE funkcije – one se cele pisu u okviru klase i u celosti su zamene za
makrodirektive (makrodirektive su uvedene jer su brze od potprograma, one se
u celosti prevode i kao takve ugradjuju u program, dakle, kod njih nema ni
skokova, ni smestanja podataka na stek). Ovo znaci da se inline funkcije
prevode i direktno ugradjuju u program (dakle, nisu funkcije vec slozenije
naredbe), ali posto kod njih NE SME BITI PROGRAMSKOG SKOKA, KAO
NI STAVLJANJA NA STEK, ne smeju se koristiti slozenije naredbe, kao ni
naredbe skoka (while, if, switch,...). U nasem primeru, inline funkcije su:
void SetPoint(double xx, double yy) {x=xx; y=yy;}
double GetX() {return x;}
double GetY() {return y;}
b) OUTLINE funkcije – one koje nisu inline, a priradaju klasi, za njih se unutar
klase navodi samo prototip. U nasem primeru takva funkcija je :
double Distance();
Ova funkcija se mora cela napisati izvan klase, a da bi se oznacilo da ona
pripada datoj klasi stavlja se kvalifikator klase:
Ime_Klase::Naziv_Funkcije(...) {...}
U nasem primeru je to:
double Point::Distance()
{
return sqrt(x*x+y*y);
}
Ove funkcije clanice klase su potpuno ravnopravne sa inline funkcijama.
Primer: instanciranje klase (kreiranje objekta):
//Naziv datoteke: “PROBA.CPP”
#include “point.h”
void main(void)
{
Point a,b;
double r;
a.SetPoint(1,2);
b=a;
r=b.Distance()+3;
}
Neisparavno bi bilo napisati:
r=a.y;
Ovo ne bi radilo, jer je y u delu pod “private:”, pa je zatvoren za klijenta!
Koji delovi klase se zatvaraju, a koji otvaraju za klijenta?
-
Podaci clanovi
su u najvecem broju slucajeva zatvoreni, da bi se njihova izmena
vrsila pod kontrolom. Dakle, kontrola promene sadrzaja podataka clanova je
glavni razlog zatvaranja podataka clanova.
-
Objekti clanovi
se mogu ostaviti otvorenim ili se mogu zatvoriti, sto zavisi od
opredeljenja. Ako zatvorimo objekat, onda se za njega moraju napraviti
Napomena: da smo ovde ispred
double stavili naredbu “inline”
(inline double Point::Distance()) ,
funkcija bi postala INLINE iako
se fizicki ne nalazi unutar klase!
Postavice vrednosti podataka
clanova za tacku (objekat) a
na x=1 i y=2

Primer koriscenja ove klase u slobodnoj funkciji:
Complex Add(Complex z1, Complex z2)
{
Complex w;
w.Create(z1.Re()+z2.Re(), z1.Im()+z2.Im());
return w;
}
5. Definicija i vrste apstrakcije. Princip skrivanja informacija
Apstrakcija je klucni mehanizam naseg razmisljanja (lat.
apstrahere
– izdvojiti
bitno). Primene apstrakcije:
-
izdvajanje bitnih informacija
-
detalji realizacije se proglasavaju nebitnim
Primer: y = sin(x); mi ovom naredbom dobijamo rezultat ttrazene funkcije, ali kako
je to realizovano nas ne interesuje.
U praksi postoje tri vrste apstrakcije:
-
apstrakcija entiteta (materijalna tacka)
-
aps. akcije (u klasu se smestaju logicki srodne funkcije)
-
aps. tipa virtuelne masine (postoje nivoi operacija – jedna operacija na visem
nivou zamenjuje se skupom operacija na nizem).
Princip skrivanja informacija: (information hiding principle – postavio ga je Parnas)
Detalji realizacije su razdvojeni od interfejsa i moraju biti nedostupni klijentu (tj.
skriveni od njega). Interfejs klase je ono sto se nalazi u delu pod “public:”.
6. Pojam inkapsulacije i realizacija u C++. Pravilo inkapsulacije
Inkapsulacija i modularnost su sredstva za realizaciju klase tako da budu postovane
sledece stavke:
-
inkapsulacija je objedinjavanje strukture i ponasanja u softversku celinu uz
ostvarivanje strukture ponasaanja
-
naredba
class
sluzi za inkapsuliranje tj. objedinjavanje
-
PRAVILO INKAPSULACIJE: objekat treba koristiti disciplinovano u skladu
sa dokumentacijom proizvodjaca.
Vidimo da se pristup podatku clanu “r” vrsi preko
metode Re(). Da smo napisali
z1.r
ne bi radilo, jer je ovo
slobodna funkcija (ona nije clanica klase i za nju su
podaci clanovi zatvoreni!)
Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti