Objektno orijentirano programiranje

**Objektno orijentisano programiranje** (OOP) u računarstvu je jedna od programskih paradigmi. Od ranih 1980-ih pa do danas ova paradigma je postala najuticajnija paradigma u komercijalnom razvoju softvera. Programski jezici poput C++ i Java programski jezik su svojom popularnošću utvrdili vodeći status OOP-a kao *de facto* obaveznog pristupa pri razvoju softvera danas, te i jezici koji tradicionalno nisu bili objektno orijentisani su naknadno dodali OOP koncepte (npr. Visual Basic, Pascal programski jezik itd.).

## Osnovni principi
* *[[Klasa (računari)|Klasa]]* (engl. *class*) sadrži opis (definiciju) *nečega*, npr. *klasa Osoba*. Ovaj opis sadrži informaciju (npr. ime, godište, spol) i ponašanje, ili funkcionalnost (npr. metoda umri()). Ona je osnovica modularnosti i strukture objektno-orijentisanog programa. Kao takva treba biti poznata osobama koje nisu programeri, ali su upoznati sa okvirom problema koji treba riješiti računarskim programom i izvorni kod klase treba (po mogućnosti) biti cjelovit i nezavisan (*opisati coupling*). Samo sa takvom modularnošću klasa je u stanju da odgovara aspektu problema koji program treba da riješi i istovremeno pojednostavi odnos (mapiranje) između problema i programa.
* *[[Objekat (računari)|Objekat]]* (engl. *object*) ili instanca je jedinica klase, koji postoji sa određenom informacijom (tzv. *stanje* ili engl. *state*), npr. `Davor` instanca `Osobe` je *runtime* reprezentacija Osobe u programskom prostoru. Svaki objekat ima samo svoju informaciju (stanje) koje može biti dijeljeno između više instanci, što se u računarstvu zove *[[reentrant]]*. Tako npr. naš Mujo objekat bi imao 
:* `ime::"Davor Tokić"`
:* `spol::"Muški"`
:* `godiste::"1962"`.
* *[[Zatvorenost]]* (engl. *encapsulation*) je koncept po kojem je informacija u klasi zaštićena od direktnog pristupa i jedini način da se promjeni informacija je kroz utemeljene metode. Tako npr. ako napravimo metodu `ideNaPosao()`, kojom Mujo ide na posao biciklom, onda kad on kupi auto i ide autom na posao, ta promjena je skrivena unutar metode koja samo prikaže rezultat (tj. da je na putu na posao a ne čime ide).
* *[[Nasljedstvo (računari)|Nasljedstvo]]* (engl. *inheritance*) je koncept po kojem se može definisati klasna hijerarhija, tj. obiteljska loza klase gdje jedna klasa može da proširi (*extend*) drugu klasu. Tako u našem primjeru možemo definisati klasu *Muškarac* koja proširuje klasu *Osoba* i definiše novu metodu `preselioNaAhiret()`, te klasu *Ženu* koja također proširuje klasu *Osoba* ali ima metodu `preselilaNaAhiret()`. I *Muškarac* i *Žena* nasljeđuju činjenike ime, spol i godište, te metodu, tj. ponašanje umri() (i muškarci i žene umiru) ali se samo objekat muškarca `preselioNaAhiret()` dok se žena `preselilaNaAhiret()`.
* *[[Kompjuterska apstrakcija|Apstrakcija]]* (engl. *abstraction*) je pojednostavljivanje karakteristika objekta, gdje se zanemaruju detalji i uzimaju se samo zajedničke karakteristike klase. Npr. Mujo Tokić je ćelav ali ta karakteristika nije opisana ni u klasi *Osoba* ni u klasi *Muškarac*.
* *[[Polimorfizam]]* (engl. *polymorphism*) jeste karakteristika klase čije ponašanje se mijenja ovisno o implementaciji. Tako u našem primjeru, metoda `sahrana()` može biti implementirana kao *ukopavanje*, *kremiranje* ili *mumifikacija*.

Ubiti, klasa je poput arhitektonskog nacrta zgrade, po kojoj graditelj (kompajler i linker), tj. izvođač radova (*runtime*) je u stanju da izgradi objekat te zgrade.

## Povezano
* Računarska dizajn šema
## Razvoj objektno orijentisanih programskih jezika
Algol
Fortran LISP
----
1960

PL/1
Simula
Smalltalk-72
Cobol
----
1970

Prolog
Smalltalk-76
Smalltalk-74
Smalltalk-78
Smalltalk-80
Loops
Pascal 
C
----
1980

Eiffel
Ada
C++ 
ObjectPascal
Objective C
CLOS
----
1990

Ada 9
Delphi
Java
ObjectCobol
----
2000

C#

Najbolji način za razumijevanje šta je to objektno orijentisano programiranje je da se razumiju razlike između strukturalnog i objektno orijentisanog programiranja. Te razlike se fundamentalne.

# Strukturalno programiranje:
  o Zadaci se uvijek u manje razvojene korake razgrađuju
  o Top-Down izrada
  o Podaci u poređu sa funkcijama igraju podređenu ulogu
*/
# Objektno orijentisani razvoj:

  o Fundament grade objekti a ne funkcije i procedure
         +Objekat je manje ili vise apstraktan element u oblasti primjene
         +Objekti i tipovi objekata (klase) predstavljaju podatke, koji imaju sopstvene funkcije,
        i samo od tih sopstvenih funkcija smiju biti obrađivane
  o Objekti su ustvari struktura podataka, koji imaju jedan poseban odnos, koji je u metodama utvrđen

# Dan Ingals (smalltalk veteran):

Ključna razlika između klasičnog proceduralnog programiranja i objektno orijentisanog programiranja je nepostojanje jasne podele na podatke i funkcije/operacije koje se treba nad podacima izvršiti.

Naime, u objektno orijentisanom programiranju - polazi se od toga da se za bilo kakvu operaciju koristi podatak a da se nad svakim podatkom može izvršiti određeni niz operacija/radnji koje za taj podatak imaju smisla - stoga se umjesto razdvajanja na podatke i funkcije koje procesiraju podatke na određene načine, podacima direktno definišu metodi za operisanje nad njima samima.

umjesto:

podatak A (broj)
funkcija smanji_za_jedan(broj)
pa se obrada vrsi zvanjem fukcije smanji_za_broj(A)
koja izvrši smanjivanje vrednosti brojcanog podatka A za jedan

koristi se:

podatak A (broj)
metod podatka A poznaje metod smanji_za_jedan
odnosno - da bi smanjili A za jedan
jednostavno mu kazemo A.smanji_za_jedan