Koncepti objektno-orijentisanog programiranja

Istorija razvoja programskog jezika C++

Pregled osnovnih objektno-orijentisanih koncepata jezika C++


 

Koncepti objektno-orijentisanog programiranja

·         Savremeni programski sistemi su često izuzetno složeni.

·         Trendovi softverske industrije su u pravcu sve složenijih programskih sistema.

·         Projektovanje, a naročito održavanje, složenih programskih sistema je izuzetno skupo.

·         Pod održavanjem se podrazumeva otklanjanje grešaka i funkcionalno proširivanje sistema.

·         Osnovni razlog visoke cene projektovanja i održavanja leži u slaboj reupotrebljivosti koda.

·         Konvencionalni jezici kakav je C podržavaju ponovno korišćenje na nivou biblioteka funkcija.

·         Funkcije iz postojeće biblioteke moraju odgovarati po broju i tipu parametara novim potrebama.

·         Funkcionalno proširenje sistema često zahteva proširenje struktura podataka novim poljima.

·         Ne postoji prirodan način da se postojeća funkcija primeni na proširenu strukturu podataka.

·         Mora se ili pisati nova funkcija ili menjati postojeća.

·         Ako se piše nova funkcija: novi trud se ulaže i određeni deo koda se duplira.

·         Ako se menja postojeća funkcija: već testirani kod postaje ponovo sklon greškama.

·         Jedan od osnovnih ciljeva objektno-orijentisanih jezika jeste podrška reupotrebljivosti koda.

·         Jedna od osnovnih karakteristika OO jezika jeste podrška za izvođenje novih tipova iz postojećih.

·         Prilikom izvođenja novi tip nasleđuje svojstva osnovnog tipa i dodaje neka specifična.

·         Stari programski kod se ne mora menjati i ponovo testirati – nova funkcionalnost se lako dodaje.

·         Jezici kakvi su npr. Pascal, FORTRAN i C podržavaju sekvencijalno, proceduralno programiranje.

·         OO programiranje je nova paradigma – razmišljanje programera je znatno drugačije.

·         Paradigma programiranja = fundamentalni način razmišljanja (model, stil) pri programiranju.

·         Kod proceduralnog programiranja u žiži je algoritam.

·         Kod OO programiranja u žiži su apstrakcije tipova objekata (klase) i njihove relacije.

·         Važniji elementi OO paradigme koje podržava većina OO jezika su:

·         apstrakcija bitnih svojstava skupova sličnih objekata i opisivanje zajedničkom klasom

·         kapsulacija implementacije - reprezentacije stanja i realizacije ponašanja

·         objavljivanje interfejsa objekta kroz "potpise"  funkcija (ime i lista argumenata)

·         modularno prevođenje (modul je fizička jedinica za razliku od klase koja je logička)

·         izvođenje novih tipova (klasa) uz nasleđivanje svih elemenata osnovne klase

·         dinamičko povezivanje i polimorfizam

·         Primeri OO jezka: C++, Java, Ada95, Smalltalk, Eifel, ObjectPascal.

VRH


 

Istorija razvoja programskog jezika C++

   U evoluciji programskih jezika zapažaju se tri značajna napretka:

1.    Apstrakcija izraza (rane '50.) FORTRAN. Registri mašine su postali skriveni za programera.

2.    Apstrakcija kontrole (rane '60.) Algol60. Strukturiran tok kontrole programa.

3.    Apstrakcija podataka (rane '70.) Pascal. Razdvajanje detalja prezentacije podataka
od apstraktnih operacija koje se definišu nad podacima (npr. nabrojivi tip).

   Još neki važni koncepti koji su otvorili put objektno-orijentisanim jezicima:

1.    Zasebno prevođenje programskih modula (FORTRAN, C, Ada).

2.    Razdvajanje specifikacije (interfejsa) od implementacije (Ada: specifikacija i telo paketa).

3.    Koncept klase: apstrakcija objekta i kapsulacija podataka i pridruženih operacija (Simula67).

   Razvoj jezika C++:

1972. jezik C – D. Ritchie u Bell laboratorijama.

1980. jezik "C sa klasama" za simulacije vođene događajima

1983. jezik C++ B. Stroustrup u AT&T Bell laboratorijama

1989. ANSI standard za C.

1997. (14.Novembar) ANSI/ISO komitet prihvatio finalni draft standarda za C++.

1998. (1.Septembar) publikovan standard ISO/IEC 14882:1998.

      Motiv za razvoj:
dekomponovanje kompleksnih softverskih sistema na prirodan način radi lakšeg održavanja.

   Dva aspekta koje je po Stroustrupu trebalo da ispuni programski jezik:

·         da bude dovoljno blizak mašini tako da se arhitekturom može jednostavno upravljati

·         da bude dovoljno blizak problemu koji se rešava
tako da se ideje mogu izraziti neposredno i koncizno

·       Prvi aspekt - ispunjava jezik C koji je iskorišćen kao osnova za jezik C++.

Jezik C++ je praktično nadskup jezika C (osim malih odstupanja).

Ime jezika C++ je simbolično (to je inkrementirani C, doduše lepše bi bilo ++C).

·       Drugi aspekt - inspiracije u jezicima Simula67 (klase), Algol (preklapanje operatora).

·       Spontani razvoj: nikada nije postojao "odbor za projektovanje C++".

VRH

 

 

Pregled osnovnih objektno-orijentisanih koncepata jezika C++

Klase i objekti

·         OO jezici proširuju pojam konvencionalnog tipa podataka uvođenjem pojma klase.

·         Klase su apstrakcije zajedničkih atributa i zajedničkog ponašanja jednog skupa srodnih objekata.

·         Klase sadrže podatke članove (opisuju atribute) i funkcije članice (definišu ponašanje).

·         Primerci odgovarajućih klasa nazivaju se objektima.

·         Objekat je određen svojim stanjem (skup vrednosti atributa), ponašanjem i identitetom.

·         Pristupačnost određenim članovima klase (npr. javni i privatni) deklariše programer.

·         Klasa ima svoj interfejs i svoju implementaciju.

·         Implementaciju klase čine privatni podaci članovi i definicije (zaglavlje sa telom) funkcija.

·         Interfejs klase čine javni podaci članovi (relativno retko) i deklaracije funkcija.

·         Primer: klasa za opis publikacija

VRH

Konstruktori i destruktori

·         Prilikom kreiranja i uništavanja objekata pogodno je da se obave izvesne aktivnosti.

·         Pri kreiranju objekta treba dovesti objekat u početno stanje inicijalizacijom njegovih članova.

·         Pri uništavanju složenih objekta delovi treba da se uništavaju automatski pri uništenju celine.

 

 

 

·         Konstruktori su specifične funkcije članice koje se automatski izvršavaju pri kreiranju objekata.

·         Destruktori su specifične funkcije članice koje se automatski izvršavaju pri uništavanju objekata.

·         Primer:

class Publikacija {

public:

      Publikacija();                // podrazumevani konstruktor

      Publikacija(int, char*);      // konstruktor sa dva argumenta

//...

};

#include <string.h>

Publikacija::Publikacija(){}        // prazno telo konstruktora

Publikacija::Publikacija(int i, char* n){id=i;strcpy(naslov,n);}

void main () {Publikacija knjiga1(1,"Alhemicar"), knjiga2;}

 

VRH

Izvođenje, nasleđivanje i polimorfizam

·         Iz jedne opštije klase moguće je izvoditi proizvoljan broj specifičnijih klasa.

·         Na primer, iz klase geometrijskih tela mogu se izvoditi klase sfere, kvadra, prizme, valjka, itd.

·         Izvedene klase nasleđuju članove podatke i funkcije članice i dodaju nove podatke i funkcije.

·         Objekti izvedenih klasa su specijalne vrste objekata osnovne klase.

·         Oni se mogu pojavljivati u izrazima na svim mestima gde se očekuje objekat osnovne klase.

·         Nasleđene funkcije članice se mogu redefinisati.

·         Redefinicija f-je u izvedenoj klasi mora imati identičan potpis (ime i listu argumenata).

·         Ako se u osnovnoj klasi funkcija proglasi virtuelnom – na nju se primenjuje dinamičko vezivanje.

·         Rešavanje poziva u vreme izvršavanja se naziva dinamičkim ili kasnim vezivanjem.

·         Adrese virtuelnih funkcija se ne određuju u vreme prevođenja/povezivanja već u vreme izvršavanja.

·         Preduslov dinamičkog vezivanja je da se objektu pristupa preko pokazivača na osnovnu klasu.

·         Poziva se virtuelna funkcija klase objekta na koji ukazuje pokazivač, a ne klase pokazivača.

·         Polimorfizam: ponašanje objekta na koji ukazuje pokazivač ne zavisi samo od tipa pokazivača.

·         Objekat sa virtuelnim funkcijama na koji ukazuje pokazivač pokazuje polimorfno ponašanje.

·         Virtuelne funkcije omogućavaju unificiranu obradu objekata osnovne i izvedenih klasa.

·         Primer:

class Casopis: public Publikacija {

public:

      Casopis();

      Casopis(int,int,int,char*);

      void unos();      //redefinicija funkcije Publikacija::unos()

      void ispis();     //redefinicija funkcije Publikacija::ispis()

private:

      int no,vol;

};

 

void ispisi_sve(Publikacija *p[], int n){

      for (int i=0; i<n; i++) { p[i]->ispis(); cout<<endl; }

}

 

·         p[i] je po tipu pokazivač na objekat tipa Publikacija.

·         U vreme izvršenja p[i] može pokazivati na objekat tipa Publikacija ili Casopis.

·         Izvršiće se funkcija ispis()klase onog objekta na koji ukazuje pokazivač p[i].

·         Jezici koji podržavaju apstrakciju, kapsulaciju i modularnost nazivaju se objektno-baziranim (Ada83).

·         Jezici koji podržavaju još i princip hijerarhije (nasleđivanja) nazivaju se objektno-orijentisanim.


 

Izuzeci

·         Često se u praksi pojavljaju izuzetne situacije pri izvršenju programa.

·         Primeri ovakvih situacija su otvaranje nepostojeće datoteke, prekoračenje opsega indeksa i sl.

·         U proceduralnim jezicima izuzetne situacije se obrađuju u pojedinim granama selekcija.

·         Kada se u nekoj funkciji pojavi izuzetak funkcija vraća neku vrednost koja signalizira izuzetak.

·         Ovako vraćana vrednost se analizira u kodu koji je pozvao funkciju i preduzimaju se akcije.

·         Kod postaje prilično nepregledan – obrada izuzetnih situacija zamagljuje osnovnu obradu.

·         Mehanizam obrade izuzetaka nije svojstven samo OO jezicima (npr. Ada83 podržava izuzetke).

·         Iako mehanizam nije svojstven samo OO jezicima – dobro se uklapa u objektnu koncepciju.

·         U C++ izuzetak je objekat koji se "baca" (throw) u trenucima kada se pojavi izuzetna situacija.

·         Delovi koda se pišu tako da se "pokuša" (try) neka obrada.

·         Ako se pojavi izuzetak pokušana obrada se automatski prekida i prelazi se na obradu izuzetka.

·         Izuzetak se "hvata" (catch) ukoliko se dogodi i prepoznaje na osnovu klase objekta izuzetka.

 

Preklapanje operatora

·         Standardni jezički operatori se mogu preklopiti novim definicijama.

·         Piše se funkcija operator<simbol>(<argumenti>).

·         Ne mogu se preklopiti svi operatori, a za neke važe specijalna pravila.

VRH
 

Generički mehanizam (šabloni)

·         Određene obrade ne zavise od tipa podataka koji se obrađuje.

·         Na primer:

·          uređivanje (sort) niza podataka ne zavisi od toga da li se uređuju celi ili realni brojevi;

·         stek i kružni bafer implementiraju LIFO, odnosno FIFO, protokol bez obzira na tip elementa.

·         Pogodno je da se klase i funkcije mogu pisati generički, parametrizovano tipovima podataka.

·         Takve generičke klase i funkcije nazivaju se u jeziku C++ šablonima (templates).

·         Iz šablona se generišu stvarne klase, odnosno funkcije, za konkretne tipove (stvarne parametre).

·         Generički mehanizam je u potpunosti statički – substitucija parametara je u vreme prevođenja.

VRH