# Objektno orijentirano programiranje

**Objektno orijentirano programiranje** (**OOP**) jeste programska paradigma zasnovana na konceptu "objekata", koji mogu sadržavati podatke i kod: podaci u obliku polja (često poznati kao *atributi* ili *svojstva*), i koda, u formi procedura (često poznatih kao *metoda*).

Osobina objekata je da vlastite procedure objekta mogu pristupiti i često mijenjati svoja polja podataka (objekti imaju pojam `this` ili `self`). U objektno orijentiranom programiranju, računarski programi su dizajnirani iz objekata koji međusobno djeluju jedan s drugim. Programski jeziki OOP-a su različiti, ali najpopularniji među njima su oni zasnovani na klasama, što znači da su objekti instance klasa, što također određuje njihove tipove.

Veći dio najpoznatijih programskih jezika (kao što su C++, Java, Python, itd.) su višestruke paradigme te podržavaju objektno orijentirano progrmairanje u većem ili manjem stepenu, obično u kombinaciji sa imperativnim i/ili proceduralnim programiranje. Značajni objektno orijentirani jezici su među ostalim: (redoslijed prema TIOBE indeksu) Java, C++, C#, Python, R, PHP, Visual Basic.NET, JavaScript, Ruby, Perl, Object Pascal, Objective-C, Dart, Swift, Scala, Kotlin, Common Lisp, MATLAB i Smalltalk.

## Osobine

Objektno orijentirano programiranje koristi objekte, ali nisu sve povezane tehnike i strukture podržane direktno u jezicima koji tvrde da podržavaju OOP. Značajke navedene u nastavku uobičajene su među jezicima koji se smatraju da su snažno klasno i objektno orijentirani (ili višestruke paradigme sa podrškom za OOP), sa značajnim izuzecima pobrojanim.

### Osobine dijeljene sa jezicima koji nisu OOP

* Varijable koje mogu pohraniti informacije formatirane u malom broju ugrašenih tipova podataka kao što su cijeli brojevi i alfanumerički simboli. Ovo može uključivati podatkovne strutkure poput stringova, listi i hash tabela koje su ili ugrašene ili rezultat kombinacije varijabli korištenjem memorijskih pokazivača.
* Procedure – poznate i kao funkcije, metode, rutine ili subrutine – koje uzimaju inpute, generišu outpute te manipuliraju podacima. Savremeni jezici uključuju konstrukte struktuiranog programiranja kao što su petlje i uslovi.

Modularno programiranje podržava omogućavanje grupisanja procedura u datotekama i modulima za organizacijske svrhe. Moduli su imenski prostori tako da identifikatori u jednom modulu neće imati konflikt sa procedurom ili variablom koja dijeli isto ime u drugoj datoteci ili modulu.

### Objekti i klase

Jezici koji podržavaju objektno orijentirano programiranje (OOP) obično podržavaju nasljeđivanje za ponovnu upotrebu i proširivost koda u obliku klase ili prototipova. Oni koji koriste klase podržavaju dva glavna koncepta:

* Klase – definicije formata podataka i dostupne procedure za datu vrstu ili klasu objekta; mogu sadržavati i same podatke i postupke (poznate kao metode klasa), tj. klase sadrže članove podataka i funkcije članova
* Objekti – instance klasa

Objects sometimes correspond to things found in the real world. For example, a graphics program may have objects such as "circle", "square", "menu". An online shopping system might have objects such as "shopping cart", "customer", and "product". Sometimes objects represent more abstract entities, like an object that represents an open file, or an object that provides the service of translating measurements from U.S. customary to metric.

>
> Objektno orijentirano programiranje nije više od klasa i objekata; to je čitava programska paradigma zasnovana na 'objektima' (strukture podataka) koji sadrže polja podataka i metode. Bitno je to razumjeti; korištenje klasa za organiziranje gomile nepovezanih metoda zajedno nije objektna orijentacija.
>
>
>

Junade Ali, *Mastering PHP Design Patterns*

Za svaki objekt se kaže da je instanca određene klase (naprimjer, objekt čiji je naziv postavljen "Amar" može biti instanca klase Zaposlenik). Postupci u objektno orijentiranom programiranju poznati su kao metode; varijable su poznate i kao polja, članovi, atributi ili svojstva. To dovodi do sljedećih izraza:

* Klasa varijable - pripadaju *klasi kao cjelini* ; postoji samo jedna kopija svake
* Varijabla instance ili atributi - podaci koji pripadaju pojedinačnim  *objektima* ; svaki objekt ima svoju kopiju svakog
* Varijabla člana - odnosi se i na varijablu klase i instance koje su definirane određenom klasom
* Metode klase - pripadaju  *klasi kao cjelini*  i imaju pristup samo varijablama klase i ulazima iz poziva procedure
* Metode instance - pripadaju  *pojedinačnim objektima*  i imaju pristup varijablama instance za određeni objekt na koji se pozivaju, ulazima i varijablama klase

Objektima se pristupa nekako poput varijabli sa složenom unutrašnjom strukturom, a u mnogim su jezicima učinkovito pokazivači], služeći kao stvarne reference na jednu instancu spomenutog objekta u memoriji unutar hrpe ili stoga. Oni pružaju sloj apstrakcija koji se može koristiti za odvajanje unutarnjeg od vanjskog koda. Vanjski kôd može koristiti objekt pozivanjem određene metode instance s određenim skupom ulaznih parametara, čitanjem varijable instance ili pisanjem u varijablu instance. Objekti se kreiraju pozivanjem posebne vrste metode u klasi poznatoj kao konstruktor. Program može stvoriti mnogo primjeraka iste klase dok se izvodi, a koji djeluju nezavisno. Ovo je jednostavan način da se isti postupci koriste na različitim skupovima podataka.

Objektno orijentirano programiranje koje koristi klase ponekad se naziva klasno programiranje, dok prototipno programiranje obično ne koristi klase. Kao rezultat toga, značajno različita, ali analogna terminologija koristi se za definisanje pojmova *objekt* i *instanca*.

U nekim se jezicima klase i objekti mogu sastaviti koristeći druge koncepte poput osobina i mixina.

## Također pogledajte

* Računarska dizajn šema

## Reference