Objektno orijentisano programiranje

14 Objektno orijentisano programiranje 

U svim primerima koje sam ti pokazivao do ovoga trenutka, celo naše razmišljanje o rešavanju problema i dizajn programa se vrteo oko rada na definisanju funkcija kojima prosleđujemo nešto, i koje nama vraćaju nešto, što mi dalje koristimo u našem radu. Takav način razmišljnja i rada se zove proceduralno orijentisano programiranje. Za razliku od ovog pristupa, postoji još jedan način razmišljanja, rada i organizovanja prilikom rešavanja problema, koji se dobija jednostavnim kombinovanjem podataka i funkcionalnosti u jednu celinu koju nazivamo objekat. Takav način rada se naziva objektno orijentisano programiranje. U mnogobrojnim slučajevima je sasvim OK da se koristi proceduralni način programiranja, ali ukoliko moramo da pišemo neki veliki projekat ili da rešavamo neke specifične probleme, ipak je bolje koristiti objektno orijentisanu tehniku programiranja.
Mnogo puta do sada sam ti rekao da je u Pythonu sve objekat, i odlagao sam objašnjavanje cele te pojave, ali je sada vreme da i nju „raskrinkamo“.
Verovatno je prvo pitanje koje ti se vrzma u glavi: šta će mi još jedan način za pristup rešavanju problema, kada već znam jedan koji dobro radi?
Ako je to tvoje pitanje, ono je sasvim na mestu. Možda ti OOP (skraćenica za Objektno Orijentisano Programiranje) nikada i ne bude trebao. Ali da krenemo u rikverc – možda ti ne trebaju ni moduli, jer možeš uvek da sve što ti treba ubaciš u jednu skriptu. A, na kraju krajeva, šta će nam i funkcije? Pa mi možemo da kucamo u našoj skripti delove programa nanovo, i nanovo, i nanovo, i nanovo? Da li možeš sada da shvatiš? OOP je samo logičan produžetak NAŠIH mogućnosti, i OOP nam pruža neke pogodnosti.
Evo ti primer za funkcionalno programiranje iz realnog života: „Otkucaj dokument na pisaćoj mašini. Odnesi papir do fotokopir mašine. Stavi papir u gornji deo mašine. Otkucaj koliko želiš kopija. Pritisni dugme. Pokupi kopije, ne zaboravi original! Dođi do radnog stola, lupi pečat i stavi potpis na svaki primerak....“
Evo ti primer iz OOP-a u realnom životu: „Zaposli sekretaricu čiji je posao da odkuca dokument, i donese ti gomilu primeraka na potpisivanje.“.
Poenta OOP-a je da definisanje nekog posla potrebnog za rešavanje neke karakteristične grupe problema prebacimo na neku klasu, u našem primeru sekretarice. Ukoliko smo mi zaposlili na poslu sekretarice (to je sada klasa) neku Radojku Minotaurić, ona postaje objekat u našem programu.
Znači razlika između kreiranja funkcija i objekata je ta, da kada koristimo funkcionalni pristup, mi u stvari kreiramo pojedinačna pomagala (fotokopir, pisaća mašina, papir itd...) koje mi uzimamo kada nam je potrebno i radimo sa njima šta nam je potrebno. A kod OOP-a, mi sve to definišemo, strpamo u „opis radnog mesta“ (što se u programiranju naziva klasa) i na kraju „zaposlimo“ nekoga (objekat) da sav posao uradi umesto nas! Ovo u stavari nas „čuva“, jer više ne moramo da mislimo o fotokopiru, mašini i sl, već moramo samo da mislimo o našem potpisu na dobijenim primercima, tj nije nam više bitno na koji način su primerci došli do nas – bitno je da su tu, spremni za obradu.
Ovo se naziva abstraktan način razmišljanja, i postoji širok spektar problema na kojima se može primeniti, na primer simulacije nečega, pri čemu mi ne znamo, i nemoramo da znamo sve što utiče na željeni rezultat, već nam je poznato samo ponašanje određenih objekata. Kod funkcionalnog pristupa, morali bi smo da znamo sve relevantne uticaje i sve promenljive od kojih zavisi rezultat, a samo razmišljanje i prikupljanje podataka može biti i teško, ali i vremenski zahtevno.
Možda si primetio, iz mojih primera, da sam naglašavao dve reči: klase i objekti. A naglašavao sam ih namerno, jer upravo klase i objekti su dva najvažnija pojma u objektno orijentisanom programiranju, i zato je važno razumeti šta svaka od ovih reči znači. Klasa je deo programa koja definiše neku novu vrstu (tip) neke grupe objekata, pri čemu je objekat kreacija (u programiranju se kaže instanca) te klase. 
Prostim rečima je jako teško objasniti, jer su sve ovo imaginarne stvari, koje na kraju imaju konkretan rezultat. Zato izvini, ali moram koristiti primere.
U našem primeru u kojem sam objasnio deo kancelarijskog poslovanja je sasvim jasno – opisom posla ja sam kreirao klasu sekretarice. Meni treba sekretarica, pa sam zaposlio Radojku Minotaurić koja je objekat klase sekretarica. Taj objekat je konkretizacija klase, i ima neke svoje osobine. Ako želim, mogu da zaposlim još jedan objekat – Milunku Pržigačić, koja će isto biti klase sekretarica, i radiće isti opis posla, ali je sasvim neki novi objekat, apsolutno nezavisan od Radojke. Ukoliko mi ne treba sekretarica, ne trebaju mi ni ti objekti, a ni sama klasa (možda gasim firmu, ili želim sam da radim posao sekretarice) onda neću koristiti OOP, već ću definisati funkcije koje služe meni. Znači, na ovakvom primeru, klasa je skup definicija funkcija i promenljivih koji služe da kreiraju objekat koji će te funkcije raditi umesto nas. Ako nam je jedan objekat nedovoljan, možemo od klase zatražiti još jedan, dva... hiljadu.... I tako možemo kazati da nam sekretarice donesu 1000 različitih dokumenata u po pet primeraka u isto vreme!
Drugi, još „imaginarniji“ primer smo upravo – ja i ti! Mi smo objekti klase koja se naziva ljudi. Ja imam zelene oči, braon kosu, i ja mogu da mašem rukom, da hodam, trčim, da pišem ili da pričam. Ti, takođe možeš sve isto ili slično, ali imaš neke druge osobine (kraću kosu od mene, drugu boju očiju, navijaš za „Pobednik“ iz Male Mokre Gaćanice, dok ja navijam za „Ciglanu“ sa Besne Kobile).
No, da se mi vratimo iz realnosti u programiranje. Tipičan primer za objekte u nekom programu je taj da možeš imati više promenljivih koje u sebi čuvaju neke brojeve. One će biti tipa int, što znači da su sve te varijable u stvari instance (objekti) klase int. 
Ako si ranije programirao u nekom statičkom jeziku moraš da imaš na umu to, da se u Pythonu čak i celi brojevi (integeri) tretiraju kao objekti (int klase), što se dosta razlikuje od jezika C++ ili Jave (pre verzije 1.5), gde su celi brojevi tzv primitivni - nativni tip podataka. Dovoljno je pogledati help(int) pa da se sazna više detalja o ovoj klasi.
Objekti mogu da za nas skladište neke podatke, pri čemu mi koristimo obične promenljive, koje će da  pripadaju tom objektu. Takve promenljive, koje pripadaju nekom objektu ili klasi, se nazivaju polja (fields). Objekti takođe mogu da imaju funkcionalnosti, uz pomoć funkcija koje su definisani u klasi. Takve funkcije se nazivaju metode klase. To je upravo ono što sam objašnjavao – ja imam zelene oči – promenljiva koja pripada samo meni, tj moj fields, a ja mogu da napišem knjigu je neka od mojih funkcionalnosti, metoda. Kada želiš da ja nešto uradim, reći ćeš autoru – napiši knjigu, što je u Pythonu ekvivalent autor.pisi_knjigu(). Ako želiš da mi ofarbaš kosu u plavo – promeniš moju varijablu, kazaćeš autor sada ima plavu kosu, što se u Pythonu piše kao autor.boja_kose = 'plava'. Jel ti deluje poznato ovakva sintaksa? Terminologija reči polje i metoda nam je važna, jer pomaže da napravimo razliku između funkcija i promenljivih koje smo definisali u našem programu potrebnih za rad samog programa i onih funkcija i promenljivih koje pripadaju klasi ili objektu. Ove dve stvari, polja i metode se nazivaju i atributi (osobine) klase. 
Polja koja definišemo mogu biti dve vrste – ona koja pripadaju svakoj instanci (objektu) neke klase ili pak, mogu da pripadaju samoj klasi. Šta ovo znači? Pa uzmimo primer broja ljudi koji su ikada živeli na našoj planeti – klasa ljudi ga zna, ja ili ti, ili najbolji naučnik, kao instance (objekti) klase ljudi teško da možemo da ga saznamo, a i kada bi ga saznali veoma malo bi nam koristio. Sa druge strane, ja znam koliko imam poznanika i prijatelja, ti ne znaš koliko ja imam poznanika ili prijatelja, niti ja znam koliko ih imaš ti. To su promenljive koje služe samo nama, kao objektima. Iz tog razloga se polja nazivaju promenljive instance ili promenljive klase, u zavisnosti čemu/kome su potrebne.
Toliko priče oko svega ovoga, a nigde nisam rekao kako se klasa kreira. U Pythonu jednostavno, kao i sve ostalo:
class ImeKlase:
    telo_klase
Vidimo da smo upotrebili ključnu reč class iza koje navodimo ime koje želimo da klasa ima. Polja i metode te klase se zatim navode u telu klase koja je samo jedan uvučen blok.

13.8 Rezime Indeks 14.1 Promenljiva
self

Primjedbe

Popularno

Kako televizija štetno utiče na Vaše zdravlje finansije?

Da li je TV kviz Slagalica "prevara"?

Tu je novi Qt creator 4.4.0!

Kada prijatelji odlaze

Microsoft objavio - nova verzija Windowsa stiže...

Opet su se pojavili lažni kuponi brenda "IDEA" na društvenim mrežama

Najgore obrade velikih rock hitova

Sitnije promene na blogu...

Poslednji pozdrav izgubljenom vremenu

Prevelika očekivanja