36
MNPC, August 12, 2003 2:08 pm 01 MNCP fm 15 str 1: UVOD U OBJEKTE MaĆ£ina je dovela do informatiĆ„ke revolucije. Programski jezici zato podseƱaju na tu maĆ£inu.

1: UVOD U OBJEKTE

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

MNPC, August 12, 2003 2:08 pm01 MNCP fm 15 str

1: UVOD U OBJEKTEMaĆ£ina je dovela do informatiĆ„ke revolucije. Programski jezicizato podseƱaju na tu maĆ£inu.

16 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 16 str

RaĆ„unari nisu toliko maĆ£ine, koliko su pojaĆ„ala za misli (ā€œbicikli za umā€, Ć£to birekao Steve Jobs) i sredstvo za posebnu vrstu izraƦavaƧa. Zbog toga raĆ„unari svemaƧe predstavĆ aju maĆ£ine, a sve viĆ£e deo naĆ£eg miĆ£Ć eƧa, kao i drugi naĆ„iniizraƦavaƧa poput pisaƧa, slikaƧa, vajaƧa, animacije i filma. Objektno orijenti-sano programiraƧe je deo ovog pomeraƧa ka koriĆ£Ć±eƧu raĆ„unara kao sredstvaizraƦavaƧa.

Ovo poglavĆ e Ʊe vas uvesti u osnovne koncepte objektno orijentisanog pro-gramiraƧa (OOP), ukĆ uĆ„ujuƱi i pregled objektno orijentisanih razvojnih metoda.PretpostavĆ a se da imate iskustva u radu s proceduralnim programskim jezicima,mada C nije obavezan. Ako vam treba dodatna obuka za programiraƧe i sintaksujezika C pre nego Ć£to pristupite ovoj kƧizi, pogledajte multimedijski seminarā€œThinking in C: Foundations for C++ and Javaā€ na prateƱem kompakt disku.

Ovo poglavĆ e predstavĆ a podlogu i dopunski materijal. LakĆ£e Ʊete se otisnutiu vode objektno orijentisanog programiraƧa ako ga prvo sagledate kao celinu. Iznavedenih ideja steƱi Ʊete solidan pregled oblasti OOP-a. Meœutim, mnogi nemogu da sagledaju celinu dok ne vide Ƨene mehanizme i obeshrabre se akoodmah ne poĆ„nu da programiraju. Ako pripadate drugoj grupi i ako jedva Ć„ekateda saznate karakteristike jezika, slobodno preskoĆ„ite ovo poglavĆ e, to vas neƱespreĆ„iti da piĆ£ete programe, niti da nauĆ„ite jezik. MoƦda Ʊete poƦeleti da se vratitei da dopunite znaƧe, kako biste shvatili znaĆ„aj objekata i naĆ„in projektovaƧa.

Razvoj apstrakcijeSvi programski jezici sadrƦe apstrakcije. MoƦe se reƱi da je sloƦenost problemakoje reĆ£avate direktno povezana s vrstom i kvalitetom apstrakcije. Pod ā€œvrstomā€podrazumevam ā€œĆƒta apstrahujete?ā€. Asemblerski jezik je mala apstrakcija maĆ£inena kojoj radi. Mnogi imperativni jezici koji su kasnije nastali (kao Ć£to su Fortran,BASIC i C) bili su apstrakcije asemblera. Ovi jezici predstavĆ aju veliki napredak uodnosu na asembler, ali i daĆ e zahtevaju da razmiĆ£Ć ate o strukturi raĆ„unara, a neo strukturi problema koji reĆ£avate. Programer mora da uspostavi vezu izmeœumodela maĆ£ine (u ā€œoblasti reĆ£eƧaā€ gde modelujete problem, a to je raĆ„unar) imodela problema koji se reĆ£ava (u ā€œoblasti problemaā€ gde on postoji). Naporneophodan za ovo povezivaƧe, kao i Ć„iƧenica da ono nije ugraœeno u program-ski jezik, proizvodi programe koji se teĆ£ko piĆ£u i skupo odrƦavaju. Sporedni efekatje nastanak Ć„itave industrije ā€œmetoda programiraƧaā€.

Alternativa modeliraƧu maĆ£ine je modeliraƧe problema koji nastojite dareĆ£ite. Prvi jezici, kao Ć£to su LISP i APL, zagovarali su specifiĆ„ne poglede na svet(ā€œSvi problemi se svode na konaĆ„ne listeā€ ili ā€œSvi problemi su algoritamskiā€).PROLOG svodi sve probleme na lance odluĆ„ivaƧa. Napisani su jezici za pro-gramiraƧe zasnovano na ograniĆ„eƧima i za programiraƧe iskĆ uĆ„ivo grafiĆ„kimsimbolima. (Dokazano je da su ovi posledƧi previĆ£e restriktivni.) Svaki od ovihpristupa predstavĆ a dobro reĆ£eƧe za konkretnu klasu problema koju treba dareĆ£ava, ali su teĆ£ko upotrebĆ ivi izvan svojih domena.

Poglavlje 1: Uvod u objekte 17

MNPC, August 12, 2003 2:08 pm01 MNCP fm 17 str

Objektno orijentisani pristup ide korak daĆ e, pruƦa programeru sredstva zapredstavĆ aƧe elemenata iz oblasti problema. PredstavĆ aƧe je dovoĆ nouopĆ£teno, pa programer nije ograniĆ„en na odreœeni tip problema. Elemente uoblasti problema i Ƨihovo predstavĆ aƧe u oblasti reĆ£eƧa nazivamo ā€œobjektiā€.(BiƱe vam svakako potrebni i drugi objekti koji ne potiĆ„u iz oblasti problema.)Ideja je da se, dodavaƧem novih tipova objekata, program prilagoœava specifiĆ„-nom jeziku problema, tako da pri Ć„itaƧu koda koji opisuje reĆ£eƧe, Ć„itate i tekstkoji izraƦava problem. Ovo je fleksibilnija i moƱnija jeziĆ„ka apstrakcija od pre-thodnih. OOP vam omoguƱava da opiĆ£ete problem Ƨegovim terminima, a neterminologijom raĆ„unara na kome Ʊe se program izvrĆ£avati. I daĆ e postoji vezasa raĆ„unarom. Svaki objekat je kao mali raĆ„unar: ima svoje staƧe i operacije kojemoƦe izvrĆ£avati na zahtev. Analogija sa objektima u svetu oko nas nije tako loĆ£a:svi imaju osobine i ponaĆ£aƧa.

Neki projektanti jezika zakĆ uĆ„uju da objektno orijentisano programiraƧe neomoguƱava jednostavno reĆ£avaƧe svih programerskih problema i zalaƦu se zakombinaciju razliĆ„itih pristupa u programskim jezicima sa viĆ£e paradigmi.1

Alan Kay je saƦeto prikazao pet osnovnih osobina Smalltalka, prvog uspeĆ£nogobjektno orijentisanog jezika i jednog od jezika na kojima je C++ zasnovan. Oveosobine predstavĆ aju potpuni pristup objektno orijentisanom programiraƧu:

1. Sve je objekat. Mislite o objektu kao o drugaĆ„ijoj vrsti promenĆ ive: on Ć„uvapodatke, ali mu moƦete i ā€œslati zahteveā€, traƦeƱi da sam izvrĆ£i operacije.Teorijski, moƦete uzeti bilo koju konceptualnu komponentu problema kojireĆ£avate (psi, zgrade, usluge itd.) i predstaviti je u programu kao objekat.

2. Program je kolekcija objekata koji, porukama, jedan drugom saopĆ£ta-vaju Ć£ta da rade. Zahtev se objektu Ć£aĆ e kao poruka. Poruku shvatite kaopoziv funkcije koja pripada odreœenom objektu.

3. Svaki objekat ima sopstvenu memoriju saĆ„iƧenu od drugih objekata.Drugim reĆ„ima, od postojeƱih objekata moƦete napraviti novu vrstuobjekta. Na taj naĆ„in poveƱavate sloƦenost programa, ali je skrivate jedno-stavnoĆ£Ć±u objekata.

4. Svaki objekat ima tip. U struĆ„nom Ʀargonu, svaki objekat je primerak iliinstanca klase, pri Ć„emu je ā€œklasaā€ sinonim za ā€œtipā€. NajznaĆ„ajnija odlikaklase je ā€œKoje poruke joj se mogu poslatiā€.

5. Svi objekti odreœenog tipa mogu primati iste poruke. Ovo tvrœeƧe jeneprecizno, kao Ć£to Ʊete videti kasnije. PoĆ£to je svaki objekat tipa ā€œkrugā€istovremeno i tipa ā€œoblikā€, krug moƦe da prima i poruke za oblik. To znaĆ„i damoƦete napisati kĆ“d koji se odnosi na oblik i automatski obraœuje sve Ć£toodgovara opisu nekog oblika. Ova zamenĆ ivost je jedan od najmoƱnijihkoncepata OOP-a.

1 Videti Multiparadigm Programming in Leda, Timothy Budd, Addison-Wesley, 1995.

18 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 18 str

Objekat ima interfejsAristotel je verovatno prvi zapoĆ„eo paƦƠivo prouĆ„avaƧe pojma tip: govorio je oā€œklasi riba i klasi pticaā€. U prvom objektno orijentisanom programskom jeziku,Simula-67, Ć„ija osnovna rezervisana reĆ„ class (klasa) uvodi nov tip u program,prvi put je neposredno iskoriĆ£Ć±ena ideja da su svi objekti jedinstveni, ali su idelovi klase objekata sa zajedniĆ„kim osobinama i ponaĆ£aƧem.

Simula je, kao Ć£to samo ime jezika govori, napisana radi razvoja simulacijapoput klasiĆ„nog ā€œbankarskog problemaā€.2 U bankama imate mnoĆ£tvo bankarskihsluƦbenika, klijenata, raĆ„una, transakcija i novĆ„anih jedinica ā€“ veliki brojā€œobjekataā€. Objekti koji su identiĆ„ni po svemu osim po unutraĆ£Ć§em staƧu tokomizvrĆ£avaƧa programa, grupiĆ£u se u ā€œklase objekataā€, i otuda potiĆ„e rezervisanareĆ„ class. FormiraƧe apstraktnih tipova podataka (klasa) je osnovna tehnikaobjektno orijentisanog programiraƧa. Apstraktni tipovi podataka funkcioniĆ£uskoro potpuno isto kao tipovi ugraœeni u jezik: moƦete napraviti promenĆ iveodreœenog tipa (u objektno orijentisanom Ʀargonu nazivaju se objekti ili insta-nce) i raditi s Ƨima (to je slaƧe poruka ili zahteva, pri Ć„emu objekat otkriva Ć£ta daradi na osnovu poruke koju ste mu poslali). ƅlanovi (elementi) svake klase imajuneĆ£to zajedniĆ„ko: svaki raĆ„un ima saldo, svaki sluƦbenik moƦe primiti ulog itd.Istovremeno, svaki Ć„lan ima sopstveno staƧe, svaki raĆ„un ima drugaĆ„iji broj,svaki sluƦbenik ima ime. Zato se sluƦbenici, klijenti, raĆ„uni, transakcije itd. mogupredstaviti kao jedinstveni entiteti u programu. Ovaj entitet je objekat, a svakiobjekat pripada odreœenoj klasi koja definiĆ£e Ƨegove osobine i ponaĆ£aƧa.

Iako u objektno orijentisanom programiraƧu pravimo nove tipove podataka,svi objektno orijentisani programski jezici koriste termin ā€œklasaā€. Kada vidite reĆ„ā€œtipā€, pomislite na ā€œklasuā€, i obrnuto.3

PoĆ£to klasa opisuje skup objekata koji imaju identiĆ„ne osobine (podatke) iponaĆ£aƧa (funkcije), klasa je zapravo tip podataka, zato Ć£to, na primer, i broj uformatu pokretnog zareza poseduje skup osobina i ponaĆ£aƧa. Razlika je u tomeĆ£to programer definiĆ£e klasu koja odgovara problemu i nije prinuœen da koristipostojeƱe tipove podataka, koji samo opisuju naĆ„in beleƦeƧa informacija uraĆ„unaru. Programski jezik proĆ£irujete dodavaƧem tipova podataka premasvojim potrebama. Programski sistem prihvata nove klase i na isti naĆ„in radi sƧima, kao i sa ugraœenim tipovima.

Objektno orijentisani pristup nije ograniĆ„en na simulacije. Bez obzira na toda li se slaƦete da je svaki program simulacija sistema koji projektujete ā€“ kori-Ć£Ć±eƧem OOP tehnika, veliki skup problema se lako uproĆ£Ć±ava i reĆ£ava.

Kada definiĆ£ete klasu, moƦete napraviti proizvoĆ no mnogo Ƨenih objekata iraditi s Ƨima kao da su elementi problema koji reĆ£avate. Jedan od izazova objek-tno orijentisanog programiraƧa svakako je uspostavĆ aƧe jednoznaĆ„nog pre-slikavaƧa izmeœu elemenata u oblasti problema i objekata u oblasti reĆ£eƧa.

Kako da iskoristite objekat? Mora postojati naĆ„in da objektu uputite zahtevda neĆ£to uradi, na primer da izvrĆ£i transakciju, nacrta neĆ£to ili ukĆ uĆ„i prekidaĆ„.Svaki objekat ispuƧava samo odreœene zahteve. Zahtevi koje moƦete poslati

2 ZanimĆ ivo reĆ£eƧe ovog problema naƱi Ʊete u tomu 2 ove kƧige, koji se preuzima s adrese www.Bruce-Eckel.com

3 Neki prave razliku, tvrdeƱi da tip odreœuje interfejs, dok je klasa konkretna realizacija tog interfejsa.

Poglavlje 1: Uvod u objekte 19

MNPC, August 12, 2003 2:08 pm01 MNCP fm 19 str

objektu definisani su Ƨegovim interfejsom (engl. interface) koji je odreœentipom. Jednostavan primer predstavĆ a sijalica:

Sijalica lt;lt.ukĆ uci();

Interfejs definiĆ£e zahteve koje moƦete uputiti odreœenom objektu. Meœutim,negde mora postojati kĆ“d koji odgovara na taj zahtev. KĆ“d, zajedno sa skrivenimpodacima, Ć„ini realizaciju (engl. implementation). Sve ovo nije teĆ£ko razumeti sastanoviĆ£ta proceduralnog programiraƧa. Tip poseduje funkciju pridruƦenu sva-kom od moguƱih zahteva, i zahtevi se upuƱuju objektu pozivaƧem tih funkcija.Ovaj postupak se ukratko moƦe opisati kao ā€œslaƧe porukeā€ (upuƱivaƧe zahteva)objektu, koji odreœuje Ć£ta da uĆ„ini s tom porukom (izvrĆ£ava kĆ“d).

Ime tipa/klase je Sijalica, ime konkretnog objekta je lt, a objektu klase SijalicamoƦete uputiti zahteve da se ukĆ uĆ„i, iskĆ uĆ„i, pojaĆ„a ili priguĆ£i. Objekat klaseSijalica pravite deklarisaƧem imena (lt) za taj objekat. Da biste poslali porukuobjektu, navedite ime objekta i taĆ„kom ga poveƦite s porukom. Posmatrano sastanoviĆ£ta korisnika unapred definisane klase, to je sve Ć£to se tiĆ„e programiraƧaobjekata.

U prikazanom dijagramu koristi se zapis objediƧenog jezika modeliraƧa(engl. Unified Modeling Language, UML). Svaka klasa je predstavĆ ena pravouga-onikom, sa imenom tipa u gorƧem delu, podacima Ć„lanovima navedenim usrediĆ£Ć§em delu i funkcijama Ć„lanicama (funkcije koje pripadaju ovom objektu iprimaju sve poruke koje mu Ć£aĆ ete) u doƧem delu pravougaonika. U UML dija-gramima se Ć„esto prikazuju samo ime klase i javne funkcije Ć„lanice, tako da sesrediĆ£Ć§i deo izostavĆ a. Ako vas zanima samo ime klase, tada se ne mora prika-zati ni doƧi deo.

Skrivena realizacijaKorisno je podeliti razvojni tim u projektante klasa (oni koji prave nove tipovepodataka) i programere klijente4 (korisnike klasa, koji koriste ove tipove poda-taka u svojim aplikacijama). CiĆ  programera klijenta je da prikupi kolekcijuklasa radi brzog razvoja aplikacije. CiĆ  projektanta klasa je da napravi klasu kojaprikazuje samo ono Ć£to je neophodno programeru klijentu, a sve ostalo skriva.ZaĆ£to? Zato Ć£to programer klijent ne moƦe koristiti ono Ć£to je skriveno, Ć£to znaĆ„ida projektant klase moƦe da meƧa skriveni deo ne vodeƱi raĆ„una o uticaju na

4 Ovaj termin je izmislio moj prijateĆ  Scott Meyers.

Ime tipa

Interfejs

Sijalica

ukljuci()

iskljuci()

pojacaj()prigusi()

20 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 20 str

druge delove. Skriveni deo obiĆ„no predstavĆ a osetĆ ivi sadrƦaj objekta, koji pro-gramer klijent lako moƦe da oĆ£teti usled nepaƦƧe ili neznaƧa, tako da skrivaƧerealizacije umaƧuje broj greĆ£aka u programu. SkrivaƧe realizacije je izuzetnovaƦno.

U svakom odnosu je vaƦno postaviti granice koje poĆ£tuju svi uĆ„esnici. Kadapravite biblioteku, uspostavĆ ate odnos sa programerom klijentom koji praviaplikaciju koristeƱi vaĆ£u biblioteku, ili moƦda pravi veƱu biblioteku.

Ako su svi Ć„lanovi klase dostupni svima, tada programer klijent moƦe uĆ„initibilo Ć£ta s klasom i ne postoji nikakav naĆ„in da se prisili da poĆ£tuje pravila. Iakovam viĆ£e odgovara da programer klijent ne rukuje neposredno nekim Ć„lanovimaklase, ne postoji naĆ„in da to spreĆ„ite bez kontrole pristupa. Sve je dostupnosvakome.

Pristup treba kontrolisati da bi se programeri klijenti drƦali daĆ e od delovakoje ne bi trebalo da diraju ā€“ delova neophodnih za unutraĆ£Ć§e operacije nadtipom podataka, koji ne pripadaju interfejsu potrebnom za reĆ£avaƧe konkret-nih problema. To je istovremeno i usluga korisnicima, jer lako mogu uoĆ„iti Ć£ta jeznaĆ„ajno, a Ć£ta se moƦe zanemariti.

Kontrolom pristupa, projektantu biblioteke se omoguƱuje meƧaƧe unutra-Ć£Ć§eg rada klase, bez obzira na uticaj promene na programera klijenta. Naprimer, moƦete na jednostavan naĆ„in realizovati neku klasu, a zatim otkriti damorate da je ubrzate. Ako su interfejs i realizacija jasno odvojeni i zaĆ£tiƱeni, ovose moƦe lako reĆ£iti i zatim samo treba zahtevati od korisnika da ponovo poveƦeprojekat.

C++ koristi tri rezervisane reĆ„i za definisaƧe granica klase: public (javni), pri-vate (privatni) i protected (zaĆ£tiƱeni). Njihova upotreba i znaĆ„eƧe su sasvimjasni. Ovi specifikatori pristupa odreœuju ko moƦe da koristi naredne definicije.ReĆ„ public znaĆ„i da su naredne definicije svima dostupne. Rezervisana reĆ„ pri-vate oznaĆ„ava da niko osim projektanta tipa ne moƦe pristupati Ć„lanovima, a i toje moguƱe samo unutar funkcije Ć„lanice tog tipa. ReĆ„ private postavĆ a visoki zidizmeœu vas i programera klijenta. Ako neko pokuĆ£a da pristupi privatnom Ć„lanu,dobiƱe greĆ£ku prilikom prevoœeƧa. ReĆ„ protected se ponaĆ£a kao private, izuzevĆ£to izvedena klasa ima pristup zaĆ£tiƱenim, ali ne i privatnim Ć„lanovima. Izvo-œeƧe klasa nasleœivaƧem biƱe opisano ubrzo.

Ponovna upotreba realizacijeKada se klasa jednom definiĆ£e i testira, trebalo bi da, u idealnom sluĆ„aju, pred-stavĆ a korisnu celinu koda. IspostavĆ a se da ponovno koriĆ£Ć±eƧe nije ni pri-bliƦno lako postiƱi kako se mnogi nadaju ā€“ potrebno je iskustvo i znaƧe da bi senapravilo dobro reĆ£eƧe i tada ono sĆ¢mo traƦi da bude ponovo iskoriĆ£Ć±eno.Ponovna upotreba koda je jedna od najveƱih prednosti objektno orijentisanihjezika.

Najjednostavnije Ʊete ponovo upotrebiti klasu kada neposredno koristiteobjekat te klase, a moƦete ga smestiti i u novu klasu. Ovo zovemo ā€œdefinisaƧeobjekta Ć„lanaā€. Nova klasa moƦe sadrƦati proizvoĆ an broj drugih objekata, u bilokojoj kombinaciji koja vam treba za postizaƧe potrebne funkcionalnosti. PoĆ£tosastavĆ ate novu klasu od postojeƱih, ovaj koncept se naziva kompozicija (ili,

Poglavlje 1: Uvod u objekte 21

MNPC, August 12, 2003 2:08 pm01 MNCP fm 21 str

opĆ£tije, agregacija). Za kompoziciju se kaƦe da je relacija ā€œsadrƦiā€, kao u primeruā€œKola sadrƦe motorā€.

(PopuƧeni romb gorƧem UML dijagramu ukazuje na kompoziciju, Ć£to omo-guƱava da postoje samo jedna kola u relaciji. Uglavnom Ʊu koristiti jednostavnijioblik: liniju bez romba, Ć£to oznaĆ„ava asocijaciju.)5

Kompozicija je veoma fleksibilna. Objekti Ć„lanovi nove klase obiĆ„no su pri-vatni, Ć£to ih Ć„ini nedostupnim programerima klijentima koji koriste tu klasu.MoƦete ih promeniti bez naruĆ£avaƧa postojeƱeg klijentovog koda. Objekti Ć„la-novi se mogu meƧati i tokom izvrĆ£avaƧa, Ć„ime se dinamiĆ„ki meƧa ponaĆ£aƧeprograma. NasleœivaƧe, koje se opisuje u nastavku, nije toliko fleksibilno, poĆ£toprevodilac mora postaviti ograniĆ„eƧa na izvedene klase.

PoĆ£to je nasleœivaƧe tako znaĆ„ajno u objektno orijentisanom programiraƧu,Ć„esto se posebno naglaĆ£ava, i programer novajlija moƦe pomisliti da nasleœivaƧetreba svuda koristiti. To dovodi do nespretnih i preterano komplikovanih reĆ£eƧa.Pri definisaƧu novih klasa, prvo razmotrite kompoziciju koja je jednostavnija ifleksibilnija. VaĆ£i projekti Ʊe biti Ć„istiji ako prihvatite ovaj pristup. Kada steknetemalo iskustva, biƱe vam sasvim oĆ„igledno kada treba primeniti nasleœivaƧe.

NasleœivaƧe: ponovna upotreba interfejsaObjekat je sam po sebi zgodna alatka. OmoguƱava vam da grupiĆ£ete podatke ifunkcije prema konceptu, tako da pri opisivaƧu oblasti problema ne moratekoristiti idiome maĆ£ine. Ovi koncepti su osnovni elementi programskog jezikai definiĆ£u se pomoƱu rezervisane reĆ„i class (klasa).

ƃteta je ako proœemo kroz sve nevoĆ e definisaƧa jedne klase, da bismo zatimbili prinuœeni da napravimo potpuno novu klasu sa sliĆ„nom funkcionalnoĆ£Ć±u.Bilo bi boĆ e kada bismo uzeli postojeƱu klasu, klonirali je, a zatim dodavali imeƧali elemente klona. To, u suĆ£tini, dobijate nasleœivaƧem (engl. inheri-tance), samo Ć£to izmene originalne klase (nazvane osnovna klasa, natklasa iliroditeĆ ska) utiĆ„u i na ā€œklonā€ (izvedena klasa, potklasa ili potomak).

5 Ovo je obiƄno dovoƠno detaƠno za veƱinu dijagrama, pa ne morate precizirati da li koristite agregaciju ilikompoziciju.

Kola Motor

Osnovna

Izvedena

22 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 22 str

(Strelica na prethodnom UML dijagramu usmerena je od izvedene klase kaosnovnoj. Kao Ć£to Ʊete videti, moƦe postojati viĆ£e izvedenih klasa.)

Tip je neĆ£to viĆ£e od opisa ograniĆ„eƧa definisanih za skup objekata ā€“ on imarelacije s drugim tipovima. Dva tipa mogu imati zajedniĆ„ke osobine i ponaĆ£aƧa,ali jedan tip moƦe imati viĆ£e osobina i moƦe obraœivati viĆ£e poruka (ili obraœivatiiste poruke na drugi naĆ„in). NasleœivaƧe izraƦava ovu sliĆ„nost izmeœu tipovakoriĆ£Ć±eƧem osnovnih i izvedenih tipova. Osnovni tip sadrƦi sve osobine iponaĆ£aƧa koje imaju i tipovi izvedeni iz Ƨega. Osnovni tip treba da predstavĆ ajezgro vaĆ£ih ideja o nekim objektima u sistemu. Iz osnovnog tipa izvodite ostaletipove koji izraƦavaju razliĆ„ite naĆ„ine realizacije tog jezgra.

Na primer, aparat za recikliraƧe razvrstava delove otpada. Osnovni tip jeā€œotpadā€ i svaki komad otpada ima teƦinu, vrednost itd. i moƦe se usitniti, otopitiili razloƦiti. Iz ovoga mogu biti izvedeni posebni tipovi otpada s dodatnim karak-teristikama (flaĆ£a ima boju) ili ponaĆ£aƧima (aluminijum se moƦe savijati, Ć„elikse moƦe namagnetisati). Osim toga, neka ponaĆ£aƧa mogu biti razliĆ„ita (vred-nost hartije zavisi od vrste i staƧa). Primenom nasleœivaƧa, moƦete izgraditihijerarhiju tipova koja izraƦava problem.

Drugi klasiĆ„ni primer su oblici, koriĆ£Ć±eni u sistemima za projektovaƧepomoƱu raĆ„unara ili za simulaciju igara. Osnovni tip je ā€œoblikā€, a svaki oblik imaveliĆ„inu, boju, poloƦaj i sliĆ„no. Svaki oblik se moƦe nacrtati, izbrisati, pomeriti,obojiti itd. Iz ovoga se mogu izvesti posebni tipovi oblika: krug, kvadrat, trougao,i ostali, od kojih svaki moƦe imati dodatne osobine i ponaĆ£aƧa. Odreœeni tipovise mogu, na primer, osno preslikati. Neka ponaĆ£aƧa mogu se razlikovati, kao Ć£toje sluĆ„aj sa izraĆ„unavaƧem povrĆ£ina oblika. Hijerarhija tipova obuhvata isliĆ„nosti i razlike meœu oblicima.

KoriĆ£Ć±eƧe istog reĆ„nika za formulisaƧe reĆ£eƧa i problema naroĆ„ito je zgodnozato Ć£to vam ne treba mnoĆ£tvo razvojnih modela da biste od opisa problema doĆ£lido opisa reĆ£eƧa. Kada koristite objekte, hijerarhija tipova je primarni model, takoda od opisa sistema u stvarnom svetu neposredno stiƦete do opisa sistema u

Oblik

crtaj()brisi()pomeri()citajBoju()dodeliBoju()

Krug Kvadrat Trougao

Poglavlje 1: Uvod u objekte 23

MNPC, August 12, 2003 2:08 pm01 MNCP fm 23 str

kodu. ƅudno zvuĆ„i, ali Ć udi mogu imati problema s objektnim orijentisaƧemzato Ć£to je jednostavno. Um, izveƦban da traƦi sloƦena reĆ£eƧa, moƦe zbuniti ovo-lika jednostavnost.

NasleœivaƧem postojeƱeg tipa, pravite nov tip. Ovaj novi tip sadrƦi sve Ć„la-nove postojeƱeg tipa (iako su privatni Ć„lanovi skriveni i nedostupni), a Ć£to je joĆ£znaĆ„ajnije, sadrƦi i duplikat interfejsa osnovne klase. ZnaĆ„i da sve poruke kojemoƦete poslati objektima osnovne klase takoœe moƦete slati objektima izvedeneklase. PoĆ£to tip klase prepoznajemo po porukama koje joj moƦemo poslati, znaĆ„ida je izvedena klasa istog tipa kao osnovna klasa. U prethodnom primeru, ā€œkrugje oblikā€. Ova ekvivalentnost tipova dobijenih nasleœivaƧem, kĆ uĆ„na je za razu-mevaƧe objektno orijentisanog programiraƧa.

Kako i osnovna i izvedena klasa imaju isti interfejs, mora postojati realizacijauz taj interfejs. Drugim reĆ„ima, mora postojati kĆ“d koji se izvrĆ£ava kada objekatprimi odreœenu poruku. Ako samo izvedete klasu i ne uĆ„inite niĆ£ta viĆ£e od toga,metode iz interfejsa osnovne klase se prenose u izvedenu klasu. ZnaĆ„i da objektiizvedene klase imaju isti tip, ali i isto ponaĆ£aƧe, Ć£to i nije naroĆ„ito zanimĆ ivo.

Postoje dva naĆ„ina da napravite razlike izmeœu nove izvedene klase i izvorneosnovne klase. Prvi je priliĆ„no jednostavan: dodajte nove funkcije izvedenojklasi. Ove nove funkcije nisu deo interfejsa osnovne klase. ZnaĆ„i da osnovnaklasa nije radila sve ono Ć£to ste Ʀeleli, pa ste dodali nove funkcije. Ova jedno-stavna upotreba nasleœivaƧa je ponekad savrĆ£eno reĆ£eƧe problema. PaƦƠivorazmotrite da li su ove dodatne funkcije potrebne i osnovnoj klasi. Ovaj procesotkrivaƧa i iterativnog projektovaƧa uobiĆ„ajen je za objektno orijentisanoprogramiraƧe.

NasleœivaƧe samo ponekad podrazumeva dodavaƧe novih funkcija inter-fejsu. Drugi i znaĆ„ajniji naĆ„in da uĆ„inite novu klasu drugaĆ„ijom jeste promena

crtaj()brisi()pomeri()citajBoju()dodeliBoju()

Oblik

Krug Kvadrat Trougao

PreslikajVertikalno()PreslikajHorizontalno()

24 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 24 str

ponaĆ£aƧa funkcije postojeƱe osnovne klase. To se naziva redefinisaƧe (engl.overriding) funkcije.

Da biste redefinisali funkciju, uvedite novu definiciju funkcije u izvedenuklasu. KaƦite: ā€œKoristim istu funkciju iz interfejsa, ali Ʀelim da uradi neĆ£to drugou novom tipuā€.

Relacije ā€œjeā€ i ā€œje-kaoā€Pri razmatraƧu nasleœivaƧa moƦe nastati dilema: da li nasleœivaƧe treba samoda redefiniĆ£e funkcije osnovne klase (ne i da dodaje nove funkcije Ć„lanice koje nepostoje u osnovnoj klasi)? To bi znaĆ„ilo da je izvedeni tip potpuno isti kao tiposnovne klase, poĆ£to imaju isti interfejs. U tom sluĆ„aju, objekat izvedene klasemoƦete zameniti objektom osnovne klase. Ovo se smatra potpunom zamenom(engl. pure substitution) i Ć„esto se naziva princip zamene (engl. substitution prin-ciple). U izvesnom smislu, to je savrĆ£en naĆ„in posmatraƧa nasleœivaƧa. Relacijuizmeœu osnovne klase i izvedenih klasa tada nazivamo relacijom je (engl. is-a),poĆ£to moƦete reƱi ā€œkrug je oblikā€. NasleœivaƧe Ʊete ispitati ako utvrdite smislenurelaciju ā€œjeā€ izmeœu klasa.

U nekim situacijama morate dodati nove elemente interfejsu izvedenog tipa:proĆ£iriƱete interfejs i tako stvoriti nov tip. Novi tip joĆ£ uvek moƦe biti zameƧenosnovnim tipom, ali ta zamena nije savrĆ£ena poĆ£to nove funkcije nisu dostupne izosnovnog tipa. Ovaj sluĆ„aj se moƦe opisati relacijom je-kao (engl. is-like-a) ā€“ novitip ima interfejs starog tipa, ali sadrƦi i druge funkcije, tako da ne moƦete reƱi da supotpuno isti. Na primer, razmotrimo rashladni ureœaj. Pretpostavimo da je vaĆ£akuƱa opremĆ ena svim elementima za hlaœeƧe ā€“ znaĆ„i, ima interfejs koji vamomoguƱava da upravĆ ate hlaœeƧem. Zamislite da se rashladni ureœaj pokvari i daga zamenite klima-ureœajem koji moƦe i da greje i da hladi. Klima-ureœaj je-kao

Oblik

crtaj()brisi()pomeri()citajBoju()dodeliBoju()

crtaj()brisi()

crtaj()brisi()

crtaj()brisi()

Krug Kvadrat Trougao

Poglavlje 1: Uvod u objekte 25

MNPC, August 12, 2003 2:08 pm01 MNCP fm 25 str

rashladni ureœaj, ali ima veƱe moguƱnosti. Kako je sistem za regulisaƧe tempe-rature u vaĆ£oj kuƱi projektovan da upravĆ a samo hlaœeƧem, on je ograniĆ„en nakomunikaciju s rashladnim delom novog objekta. Interfejs novog objekta jeproĆ£iren, a postojeƱi sistem i daĆ e prepoznaje samo prvobitni interfejs.

Naravno, kada pogledate ovo reĆ£eƧe, postaje jasno da osnovna klasa ā€œrashla-dni sistemā€ nije dovoĆ no opĆ£ta i treba da bude preimenovana u ā€œsistem za reguli-saƧe temperatureā€, tako da moƦe da ukĆ uĆ„i i grejaƧe. Tada se moƦe primeniti iprincip zamene. GorƧi dijagram je primer onoga Ć£to se moƦe desiti pri projekto-vaƧu i u stvarnom svetu.

Kada razmotrite princip zamene, pomisliƱete da se samo primenom ovogprincipa moƦe obaviti posao i zaista jeste dobro ako imate takvo reĆ£eƧe. Meœu-tim, otkriƱete situacije kada je jasno da morate dodati nove funkcije interfejsuizvedene klase. Oba sluĆ„aja su prihvatĆ iva.

ZamenĆ ivi objekti i polimorfizamPri radu s hijerarhijama tipova, Ć„esto treba postupati s nekim tipom objekta kaosa Ƨegovim osnovnim tipom. To vam omoguƱava da piĆ£ete kĆ“d koji ne zavisi odkonkretnih tipova. U primeru oblika, funkcije rade s opĆ£tim oblicima bilo da sukrugovi, kvadrati, trouglovi ili neĆ£to drugo. Svi oblici se mogu nacrtati, izbrisati,pomeriti, tako da ove funkcije jednostavno Ć£aĆ u poruku objektu oblika i ne voderaĆ„una kako Ʊe objekat izaƱi na kraj s tom porukom.

DodavaƧe novih tipova ne utiĆ„e na takav kĆ“d i to je najĆ„eĆ£Ć±i naĆ„in proĆ£ireƧaobjektno orijentisanog programa radi obrade novih sluĆ„ajeva. Na primer, moƦeteizvesti nov podtip oblika, petougao, bez izmene funkcija koje rade samo sa opĆ£timoblikom. MoguƱnost jednostavnog proĆ£ireƧa programa izvoœeƧem novih podti-pova je znaĆ„ajna, poĆ£to se u velikoj meri poboĆ Ć£avaju reĆ£eƧa i pojevtiƧuje odrƦa-vaƧe softvera.

Problem nastaje kada pokuĆ£ate da radite sa objektima izvedenih tipova kao saopĆ£tim osnovnim tipovima (sa krugovima kao oblicima, biciklima kao vozilima,kormoranima kao pticama itd.). Ako neka funkcija zatraƦi da se opĆ£ti oblik nacrta

TermostatRashladni

sistemUpravlja

umanjiTemperaturu() rashladi()

rashladi() rashladi()

Rashladniureœaj

Klimaureœaj

zagrej()

26 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 26 str

ili da se opĆ£tim vozilom upravĆ a ili da se opĆ£ta ptica pomeri, prevodilac ne znataĆ„no koji deo koda Ʊe se izvrĆ£avati. SuĆ£tina je u tome Ć£to pri slaƧu poruke pro-gramer ne Ʀeli da zna koji deo koda Ʊe se izvrĆ£avati: funkcija za crtaƧe moƦe sepodjednako primeniti na krug, kvadrat ili trougao i objekat Ʊe izvrĆ£iti odgovara-juƱi deo koda, u zavisnosti od tipa. Ako ne morate znati koji deo koda Ʊe se izvrĆ£a-vati, kĆ“d u novom podtipu moƦe biti drugaĆ„iji, pri Ć„emu se ne meƧa pozivfunkcije. ƃta prevodilac radi kada ne zna koji deo koda se izvrĆ£ava? Na primer,objekat UpravĆ acPtice radi samo sa opĆ£tim objektima klase Ptica i ne zna kog sutipa. Iz perspektive objekta UpravĆ acPtice to je pogodno, zato Ć£to se ne morapisati poseban kĆ“d za prepoznavaƧe konkretnog tipa Ptice s kojom se radi, nitiƧenog ponaĆ£aƧa. Kako je moguƱe da poziv funkcije pomeri() dovodi doispravnog ponaĆ£aƧa iako nije poznato kog je tipa Ptica (Guska trĆ„i, leti ili pliva, aPingvin trĆ„i ili pliva)?

Odgovor na ovo pitaƧe je prvi preokret u objektno orijentisanom programi-raƧu: prevodilac ne moƦe pozvati funkciju na tradicionalni naĆ„in. Poziv funkcijekoji pravi proceduralni prevodilac dovodi do ranog povezivaƧa (engl. early bind-ing), o kome moƦda niste Ć„uli zato Ć£to nikada niste ni razmiĆ£Ć ali o alternativama.ZnaĆ„i da prevodilac poziva konkretnu funkciju po imenu, a povezivaĆ„ razreĆ£avapoziv pomoƱu apsolutne adrese koda koji treba izvrĆ£iti. Objektni program nemoƦe da odredi adresu koda do vremena izvrĆ£avaƧa, tako da treba drugim naĆ„i-nom poslati poruku opĆ£tem objektu.

Objektno orijentisani jezici reĆ£avaju taj problem primenom kasnog pove-zivaƧa (engl. late binding). KĆ“d koji treba pozvati pri slaƧu poruke objektu,odreœuje se tek u vreme izvrĆ£avaƧa. Prevodilac obezbeœuje da ta funkcija postojii proverava saglasnost tipova argumenata i povratne vrednosti (jezik u kome ovone vaƦi je slabo tipiziran), ali ne zna taĆ„no koji kĆ“d Ʊe se izvrĆ£avati.

Da bi se ostvarilo kasno povezivaƧe, C++ prevodilac postavĆ a specijalni deokoda umesto apsolutnog poziva. Ovaj kĆ“d izraĆ„unava adresu tela funkcije kori-Ć£Ć±eƧem informacija smeĆ£tenih u objekat (postupak je detaĆ no opisan u poglavĆ u15). Svaki objekat se ponaĆ£a razliĆ„ito, u zavisnosti od sadrƦaja ovog specijalnogdela koda. Kada poĆ£aĆ ete poruku objektu, on tada odluĆ„uje Ć£ta Ʊe uraditi sporukom.

premesti() pomeri()

pomeri()pomeri()

ƃta se deĆ£avapri pozivupomeri()?

UpravljacPtice Ptica

Guska Pingvin

Poglavlje 1: Uvod u objekte 27

MNPC, August 12, 2003 2:08 pm01 MNCP fm 27 str

Rezervisana reĆ„ virtual oznaĆ„ava da funkcija treba da ima fleksibilnost kasnogpovezivaƧa. Ne morate razumeti kako taj mehanizam radi da biste ga koristili, aliga morate koristiti da biste primenili objektno orijentisano programiraƧe uC++-u. Podrazumeva se da funkcije Ć„lanice nisu dinamiĆ„ki povezane, pa to svoj-stvo morate izriĆ„ito zahtevati navoœeƧem rezervisane reĆ„i virtual. Virtuelnefunkcije vam omoguƱavaju da izrazite razlike u ponaĆ£aƧu klasa iste porodice.Ove razlike dovode do polimorfnog ponaĆ£aƧa.

Razmotrimo primer oblika. Porodica klasa (sve su zasnovane na istom inter-fejsu) prikazana je grafiĆ„ki ranije u ovom poglavĆ u. Da bismo prikazali polimor-fizam, napisaƱemo deo koda koji zanemaruje posebne detaĆ e tipa i odnosi sesamo na osnovnu klasu. Ovaj kĆ“d je odvojen od informacija svojstvenih tipu izato se jednostavnije piĆ£e i lakĆ£e razume. Kada se novi tip, na primer Sestougao,doda putem nasleœivaƧa, napisani kĆ“d Ʊe raditi dobro s novim tipom, kao Ć£to jeradio i s postojeƱim tipovima. To znaĆ„i da je program proĆ£iriv.

Funkcija na C++-u (uskoro Ʊete saznati kako da je napiĆ£ete):

void uradiNesto(Oblik& s) { s.brisi(); //... s.crtaj();}

obraƱa se bilo kom objektu tipa Oblik i ne zavisi od konkretnog tipa objekta kojise crta i briĆ£e ('&' znaĆ„i ā€œUzmi adresu objekta koji se prosleœuje funkcijiā€, ali uovom trenutku nije bitno da razumete detaĆ e). U nekom drugom delu programamoƦemo da koristimo funkciju uradiNesto():

Krug c;Trougao t;Linija l;uradiNesto(c);uradiNesto(t);uradiNesto(l);

Funkcija uradiNesto() radi ispravno, bez obzira na konkretan tip objekta.Ovo je stvarno zaĆ„uœujuƱi trik. Razmotrimo sledeƱi red:

uradiNesto(c);

Krug se prosleœuje funkciji koja oĆ„ekuje objekat tipa Oblik. Krug je Oblik,pa ih funkcija uradiNesto() posmatra na isti naĆ„in. Krug moƦe da primi svakuporuku koju uradiNesto() moƦe da poĆ£aĆ e objektu tipa Oblik. ZnaĆ„i, ovo je sa-svim bezbedno i logiĆ„no.

Kada sa objektom izvedenog tipa radimo kao da je osnovnog tipa, postupaknazivamo konverzija naviĆ£e (engl. upcasting). Termin konverzija (engl. cast)odnosi se na promenu oblika, a naviĆ£e (engl. up) na naĆ„in ureœeƧa dijagramanasleœivaƧa, sa osnovnim tipom na vrhu i lepezom izvedenih tipova ispod Ƨega.Konverzija u osnovni tip je pomeraƧe naviĆ£e u dijagramu nasleœivaƧa, tj. ā€œkon-verzija naviĆ£eā€.

28 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 28 str

Objektno orijentisani programeri obiĆ„no koriste konverziju naviĆ£e, jer tada nemoraju znati s kojim konkretnim tipom rade. Pogledajmo kĆ“d u uradiNesto():

s.brisi();//...s.crtaj();

Zapazimo da u kodu ne postoji: ā€œ Ako je Krug, neka uradi ovo, ako je Kvadrat,neka uradi ono itd.ā€. Ako piĆ£ete kĆ“d koji proverava sve moguƱe tipove kojimamoƦe pripadati Oblik, on postaje zamrĆ£en i morate ga meƧati svaki put kadadodajete novu vrstu oblika. Ovde se samo kaƦe: ā€œObjekat je oblik, znam da moƦeda uradi brisi() i crtaj(), neka uradi to, i pobrine se da sve bude ispravnoā€.

U funkciji uradiNesto(), zanimĆ ivo je to Ć£to se, na neki naĆ„in, sve odvija kakotreba. Poziv crtaj() za Krug izvrĆ£ava drugaĆ„iji kĆ“d nego kada se pozove za Kvadratili Trougao, ali kada se poruka crtaj() poĆ£aĆ e nepoznatom obliku, ponaĆ£aƧe jetakoœe ispravno, prema tipu oblika. Ovo je zapaƧujuƱe zato Ć£to, kao Ć£to je ranijereĆ„eno, C++ prevodilac ne zna taĆ„no s kojim tipovima radi dok prevodi funkcijuuradiNesto(). OĆ„ekivali biste da prevodilac pozove verziju funkcija brisi() i crtaj()za Oblik, a ne za odreœeni Krug, Kvadrat ili Trougao. Razlog ispravnog ponaĆ£aƧaje polimorfizam. Time se bave prevodilac i izvrĆ£ni sistem. Bitno je da to znate i, Ć£toje joĆ£ vaƦnije, da poznajete naĆ„in koriĆ£Ć±eƧa ovih moguƱnosti u projektovaƧu.Ako je funkcija Ć„lanica deklarisana kao virtual, objekat Ʊe se ponaĆ£ati pravilnokada mu poĆ£aĆ ete poruku, Ć„ak i ako je primeƧena konverzija naviĆ£e.

Inicijalizacija i uniĆ£tavaƧe objekataU tehniĆ„kom smislu, OOP je oblast apstraktnih tipova podataka, nasleœivaƧa ipolimorfizma, ali i drugi aspekti mogu biti podjednako znaĆ„ajni. Ovde se razma-traju ta druga vaƦna pitaƧa.

NaĆ„in inicijalizacije i uniĆ£tavaƧa objekata posebno je znaĆ„ajan. Gde se nalazepodaci objekta i kako se odreœuje Ƨegov Ʀivotni vek? U razliĆ„itim programskimjezicima primeƧeni su razliĆ„iti pristupi ovim pitaƧima. C++ smatra da je efika-snost najvaƦnija, tako da izbor ostavĆ a programeru. Da bi se postigla maksimalnabrzina izvrĆ£avaƧa, smeĆ£taj i Ʀivotni vek se mogu definisati tokom pisaƧa pro-grama, postavĆ aƧem objekata na stek ili u statiĆ„ku memoriju. Stek je oblast

ā€œKonverzija naviĆ£eā€

Oblik

Krug Kvadrat Trougao

Poglavlje 1: Uvod u objekte 29

MNPC, August 12, 2003 2:08 pm01 MNCP fm 29 str

memorije koju mikroprocesor neposredno koristi za Ć„uvaƧe podataka tokomizvrĆ£avaƧa programa. PromenĆ ive na steku ponekad se nazivaju automatske(engl. automatic) ili oblasne (engl. scoped). StatiĆ„ka memorija je fiksni deo memo-rije, koji se rezerviĆ£e pre poĆ„etka izvrĆ£avaƧa programa. Upotrebom steka ilistatiĆ„ke memorije daje se prednost brzini zauzimaƧa i oslobaœaƧa prostora, Ć£tomoƦe biti znaĆ„ajno u nekim situacijama. Meœutim, time se umaƧuje fleksibil-nost, zato Ć£to morate taĆ„no znati koliĆ„inu, Ʀivotni vek i tip objekata tokom pisaƧaprograma. Ako reĆ£avate opĆ£tiji problem, kao Ć£to je projektovaƧe primenomraĆ„unara, upravĆ aƧe skladiĆ£tem ili vazduĆ£nim saobraƱajem, ovaj pristup je pre-viĆ£e restriktivan.

Drugi pristup je pravĆ eƧe objekata u dinamiĆ„koj memoriji (engl. heap). Uovom sluĆ„aju, do vremena izvrĆ£avaƧa se ne zna koliko je objekata potrebno,koliki je Ƨihov Ʀivotni vek, ni kog su tipa. Odluke se donose u trenutku izvrĆ£a-vaƧa. Kada vam zatreba objekat, pravite ga u dinamiĆ„koj memoriji, pomoƱurezervisane reĆ„i new (novi). Po zavrĆ£etku upotrebe memorije, ona se mora oslo-boditi koriĆ£Ć±eƧem rezervisane reĆ„i delete (briĆ£i).

PoĆ£to se memorijom upravĆ a dinamiĆ„ki tokom izvrĆ£avaƧa, rezervisaƧe pro-stora traje znaĆ„ajno duƦe od zauzimaƧa prostora na steku. (ZauzimaƧe pro-stora na steku Ć„esto se ostvaruje mikroprocesorskom instrukcijom koja pomerapokazivaĆ„ steka naniƦe; druga instrukcija pomera pokazivaĆ„ naviĆ£e.) DinamiĆ„kipristup polazi od uopĆ£tene logike da su objekti sloƦeni, tako da dodatno vremeza rezervisaƧe i oslobaœaƧe memorije nema znaĆ„ajnog uticaja na ukupnovreme potrebno za inicijalizaciju objekta. Neophodna je i veƱa fleksibilnost zareĆ£avaƧe opĆ£tih problema u programiraƧu.

SledeƱe pitaƧe je Ʀivotni vek objekta. Ako inicijalizujete objekat na steku ili ustatiĆ„koj memoriji, prevodilac odreœuje koliko Ʊe dugo objekat postojati i moƦega automatski uniĆ£titi. Meœutim, ako inicijalizujete objekat u dinamiĆ„kojmemoriji, prevodilac ne zna koliki je Ʀivotni vek objekta. Programer mora daodluĆ„i kada da uniĆ£ti objekat i ovu operaciju izvrĆ£ava upotrebom rezervisanereĆ„i delete. Postoji i drugo reĆ£eƧe: skupĆ aĆ„ smeƱa (engl. garbage collector). Onautomatski otkriva objekte koji se viĆ£e ne koriste i uniĆ£tava ih. PisaƧe programakoji koriste skupĆ aƧe smeƱa je svakako mnogo pogodnije, ali zahteva da sveaplikacije toleriĆ£u prisustvo skupĆ aĆ„a i dodatno procesorsko vreme koje mu jepotrebno. Ova moguƱnost nije bila u skladu s osnovnim zahtevima C++-a i zatonije bila ukĆ uĆ„ena direktno u jezik, iako za C++ postoje skupĆ aĆ„i smeƱa nezavi-snih proizvoœaĆ„a.

Obrada izuzetaka: rad s greĆ£kamaObrada greĆ£aka je jedan od najsloƦenijih postupaka pri programiraƧu, joĆ£ od na-stanka programskih jezika. PoĆ£to je toliko teĆ£ko napraviti dobru Ć£emu za obradugreĆ£aka, mnogi jezici zanemaruju ovaj zahtev. Problem se prenosi projektantimabiblioteka, pa oni daju poloviĆ„na reĆ£eƧa primenĆ iva na mnoge situacije, koja selako mogu zanemariti. Dok programer koristi Ć£emu za obradu podataka, moraveoma paƦƠivo pratiti odgovarajuƱe konvencije koje nisu obavezne na nivousamog jezika. Ako programeri nisu paƦƠivi, Ć£to se Ć„esto deĆ£ava u Ʀurbi, lako moguzaboraviti ove Ć£eme.

30 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 30 str

Obrada izuzetaka (engl. exception handling) neposredno povezuje obradu gre-Ć£aka sa programskim jezikom, nekada Ć„ak i sa operativnim sistemom. Izuzetak jeobjekat koji se ā€œbacaā€ (engl. throw) s mesta gde je greĆ£ka, a ā€œhvataā€ (engl. catch) gaodgovarajuƱi blok za obradu izuzetaka (engl. exception handler). Obrada greĆ£akaje drugaĆ„iji, paralelni pravac izvrĆ£avaƧa, kojim se kreƱe kada stvari poœu nizbrdo.PoĆ£to se koristi posebni tok izvrĆ£avaƧa, nije potrebno da on utiĆ„e na ostatakkoda. Takav kĆ“d se jednostavnije piĆ£e, poĆ£to ne morate neprekidno da provera-vate greĆ£ke. Osim toga, izbaĆ„eni izuzetak nije kĆ“d greĆ£ke koji vraƱa funkcija, nitiindikator koji funkcija definiĆ£e kako bi ukazala na nastanak greĆ£ke ā€“ oni se mogu izanemariti. Izuzetak se ne moƦe ignorisati, pa se garantuje da Ʊe na nekom mestubiti obraœen. KonaĆ„no, izuzeci obezbeœuju pouzdan oporavak od loĆ£ih situacija.Umesto izlaska iz programa, Ć„esto moƦete popraviti stvari i nastaviti izvrĆ£avaƧeprograma, Ć£to daje mnogo robusnije sisteme.

VaƦno je primetiti da obrada izuzetaka nije karakteristika objektno orijenti-sanog programiraƧa, ali je uobiƄajeno da se u objektno orijentisanim jezicimaizuzetak predstavƠa objektom. Obrada izuzetaka je postojala i pre objektnoorijentisanih jezika.

Obrada izuzetaka se samo povrĆ£no uvodi i koristi u ovom tomu. Tom 2 u pot-punosti pokriva obradu izuzetaka.

Analiza i projektovaƧeObjektno orijentisani pristup je novi i drugaĆ„iji naĆ„in razmiĆ£Ć aƧa o programi-raƧu i mnogi teĆ£ko savladavaju OOP projekte. Kada shvatite da se svaka stvarsmatra objektom, i dok uĆ„ite da sve viĆ£e razmiĆ£Ć ate na objektno orijentisaninaĆ„in, moƦete poĆ„eti da pravite dobre projekte koji koriste sve prednosti kojeOOP nudi.

Metodologija je skup postupaka i heuristika primeƧenih da se razloƦi sloƦenostprogramskog problema. Mnoge OOP metodologije su definisane od nastankaobjektno orijentisanog programiraƧa. Ovo izlagaƧe Ʊe vam stvoriti oseƱaj zaprobleme koji se reĆ£avaju primenom metodologija.

S metodologijama se puno eksperimentiĆ£e, naroĆ„ito u OOP-u, tako da jevaƦno razumeti koji problem metodologija pokuĆ£ava da reĆ£i pre nego Ć£to odlu-Ć„ite koju Ʊete usvojiti. Ovo posebno vaƦi za C++, programski jezik nameƧenpojednostavĆ eƧu (u poreœeƧu sa C-om) pisaƧa programa. Tako se i umaƧujepotreba za joĆ£ sloƦenijim metodologijama. ƃiroka klasa problema u C++-u obra-œuje se jednostavnijim metodologijama nego u proceduralnim jezicima.

VaƦno je razumeti da je izraz ā€œmetodologijaā€ Ć„esto preteƦak i previĆ£e obeƱava.Metodologija je sve Ć£to radite dok projektujete i piĆ£ete neki program. To moƦebiti vaĆ£a metodologija, Ć„ijih specifiĆ„nosti niste ni svesni, ali to je postupak krozkoji prolazite dok stvarate. Ako je postupak efikasan, moƦda se treba samoneznatno prilagoditi C++-u. U sluĆ„aju da niste zadovoĆ ni svojom produktivno-Ć£Ć±u i konaĆ„nim rezultatom, moƦda Ʊete usvojiti neku formalnu metodologiju iliizabrane delove veƱeg broja formalnih metodologija.

NajvaƦniji zahtev dok prolazite kroz postupak razvoja jeste: nemojte se izgu-biti. To se lako moƦe dogoditi. VeƱina metodologija analize i projektovaƧa je

Poglavlje 1: Uvod u objekte 31

MNPC, August 12, 2003 2:08 pm01 MNCP fm 31 str

nameƧena reĆ£avaƧu najveƱih problema. Zapamtite da najveƱi broj projekatane spada u kategoriju velikih problema, tako da analizu i projektovaƧe moƦeteuspeĆ£no izvesti primenom malog podskupa preporuka koje propisuje metodo-logija.6 Bilo koji postupak, koliko god bio ograniĆ„en, izvodi vas na pravi putmnogo brƦe nego ako odmah poĆ„nete da piĆ£ete program bez projekta.

Lako je upasti u zamku, u ā€œparalizu usled analizeā€, kada oseƱate da ne moƦetenapredovati poĆ£to niste razreĆ£ili sve pojedinosti tekuƱe faze. Bez obzira na tokoliko analizirate, neke stvari o sistemu neƱete otkriti sve do faze projektovaƧa.JoĆ£ viĆ£e Ʊete saznati kad poĆ„nete da piĆ£ete program, ili tek kad se programaktivira. Zato je veoma vaƦno proƱi prihvatĆ ivom brzinom kroz analizu i projek-tovaƧe i testirati planirani sistem.

PoĆ£to imamo iskustva s proceduralnim jezicima, naglaĆ£avamo: pohvalno je datim paƦƠivo radi i shvati svaki detaĆ  pre poĆ„etka projektovaƧa i realizacije. Sva-kako je pri izradi sistema za upravĆ aƧe bazama podataka neophodno potpunorazumeti potrebe kupca. Ovaj sistem pripada kategoriji dobro postavĆ enih idobro shvaƱenih problema, a u mnogim takvim programima struktura bazepodataka jeste problem nad kojim se treba zamisliti. U ovom poglavĆ u se razma-tra klasa programerskih problema iz skupa ā€œdƦokeraā€ (moj izraz). Do reĆ£eƧa ovihproblema se ne dolazi preoblikovaƧem nekog dobro poznatog reĆ£eƧa. U pro-blem se ukĆ uĆ„uje jedan ili viĆ£e ā€œnepoznatih Ć„inilacaā€ ā€“ elemenata za koje nepostoji prethodno dobro razraœeno reĆ£eƧe. Neophodno je istraƦivaƧe.7 PokuĆ£ajda se dƦokerski problem sveobuhvatno analizira pre prelaska na projektovaƧe irealizaciju dovodi do paralize u analizi, poĆ£to za reĆ£avaƧe ovakve vrste problemane stiĆ„ete dovoĆ no informacija tokom faze analize. ReĆ£avaƧe ovakvog problemazahteva iteraciju kroz ceo ciklus i prihvataƧe rizika (ima smisla, poĆ£to pokuĆ£avateda uradite neĆ£to novo i eventualna nagrada je veƱa). MoƦe izgledati da rizik potiĆ„eod ā€œuletaƧaā€ u realizaciju. Upravo ranim otkrivaƧem podobnosti konkretnogpristupa problemu smaƧujete riskantnost dƦokerskog projekta. Razvoj program-skog proizvoda ukĆ uĆ„uje i rizik od neuspeha.

ƅesto se predlaƦe da ā€œnapravite jedan projekat da biste ga baciliā€. U OOP-umoƦete odbaciti neki deo, ali kako je kĆ“d kapsuliran u klasama, tokom prve ite-racije Ʊete neminovno napraviti neke korisne klase i doƱi do vrednih ideja osistemu, koje ne bi trebalo odbaciti. Na taj naĆ„in, prvi brzi prolazak kroz pro-blem pruƦa znaĆ„ajne informacije za sledeƱu iteraciju analize, projektovaƧa irealizacije, i pravi osnovni kĆ“d za tu iteraciju.

Ako traƦite metodologiju koja obuhvata mnoĆ£tvo detaĆ a i preporuĆ„uje mnogokoraka i dokumenata, svakako Ʊe vam biti teĆ£ko da znate kada treba da sezaustavite. Imajte u vidu Ć£ta pokuĆ£avate da otkrijete:

1. ƃta su objekti? (Kako delite projekat na sastavne komponente?)2. ƃta su Ƨihovi interfejsi? (Koje poruke treba da Ć£aĆ ete svakom objektu?)

6 OdliĆ„an primer je UML Distilled, Martin Fowler, Addison-Wesley, 2000, koji redukuje ponekad preopĆ£iranUML proces.

7 Moje pravilo za procenu takvih projekata glasi: ako postoji viĆ£e dƦokera, nemojte ni pokuĆ£avati da planiratekoliko dugo Ʊe trajati projekat, niti koliko Ʊe koĆ£tati, sve dok ne napravite radni prototip. Postoji previĆ£enivoa slobode.

32 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 32 str

Kada dobijete spisak objekata i Ƨihovih interfejsa, moƦete napisati program.Verovatno Ʊe vam trebati viĆ£e opisa i dokumentacije, ali je ovo sigurnoneophodno.

Proces se moƦe odvijati u pet faza, dok se u nultoj fazi samo uvodi odreœenastruktura.

Faza 0: Pravimo planNa poĆ„etku morate odluĆ„iti koje korake Ʊete preduzeti u radu. ZvuĆ„i jedno-stavno (zapravo, sve ovo zvuĆ„i jednostavno), pa ipak Ć udi Ć„esto ne donesu ovuodluku pre poĆ„etka programiraƧa. Ako je vaĆ£ pristup ā€œhajde da odmah napiĆ£emprogramā€, to je u redu. (Nekada je ovo prihvatĆ ivo ako reĆ£avate mali i ispravnoshvaƱen problem.) Priznajte da je i takav pristup neka vrsta plana.

U ovoj fazi moƦete odluĆ„iti i da treba dodatno strukturirati proces, ali ne zaceo put koji treba preƱi. RazumĆ ivo je da ima programera koji rade u ā€œopuĆ£te-nom reƦimuā€, u kome se postupak razvoja ne planira unapred: ā€œBiƱe gotovo kadbude gotovoā€. Takav stav moƦe biti privlaĆ„an u kraƱem periodu. Otkrio sam danekoliko kontrolnih taĆ„aka na putu deluje stimulativno i usredsreœuje napor nate maƧe ciĆ eve, pa niste okupirani jednim jedinim ciĆ em da ā€œzavrĆ£ite projekatā€.Projekat je tako podeĆ en u maƧe celine i izgleda maƧe straĆ£no (osim toga,maƧi ciĆ evi stvaraju viĆ£e prilika za proslave).

Kada sam poĆ„eo da prouĆ„avam pisaƧe (znaĆ„i da Ʊu jednom napisati roman),imao sam otpor prema ideji o strukturi. OseƱao sam da ono Ć£to piĆ£em jedno-stavno sleƱe na stranicu. Kasnije sam shvatio da je struktura dovoĆ no jasna kadapiĆ£em o raĆ„unarima, tako da o Ƨoj i ne razmiĆ£Ć am mnogo. Ipak, i daĆ e struktu-riram svoj rad, makar i samo polusvesno. ƅak i ako mislite da je vaĆ£ plan dajednostavno zapoĆ„nete programiraƧe, vi ipak prolazite kroz sledeƱe faze dokpostavĆ ate izvesna pitaƧa i nalazite odgovore.

DefinisaƧe zadatkaSvaki sistem koji gradite, koliko god da je komplikovan, ima osnovnu namenu,instituciju kojoj pripada, osnovne potrebe koje ispuƧava. Ako pogledate daĆ eod korisniĆ„kog okruƦeƧa, detaĆ a specifiĆ„nih za hardver ili sistem, programskihalgoritama i problema efikasnosti, eventualno Ʊete otkriti jednostavnu i otvo-renu suĆ£tinu Ƨegovog postojaƧa. SliĆ„no takozvanoj osnovnoj zamisli holivud-skih filmova, suĆ£tina se moƦe opisati u jednoj ili dve reĆ„enice. Polazna taĆ„ka jeĆ„isti opis osnovne ideje.

Osnovna ideja je veoma vaƦna zato Ć£to daje ton vaĆ£em projektu: to je defini-cija zadatka. MoƦda je neƱete naƱi na samom poĆ„etku (ponekad se do Ƨe dolazitek u kasnijoj fazi projekta), ali pokuĆ£avajte dok ne osetite da je ideja prava. Naprimer, u sistemu za upravĆ aƧe vazduĆ£nim saobraƱajem, moƦete krenuti odosnovne ideje da se treba usredsrediti na sistem koji pravite: ā€œProgram kontrol-nog torƧa prati leteliceā€. Razmotrite Ć£ta se deĆ£ava kada suzite sistem na veoma

Poglavlje 1: Uvod u objekte 33

MNPC, August 12, 2003 2:08 pm01 MNCP fm 33 str

mali vazduĆ£ni prostor: moƦda postoji samo jedan kontrolor ili ga i nema. Kori-sniji model se ne odnosi na vaĆ£e konkretno reĆ£eƧe, veƱ opisuje problem: ā€œLete-lica sleƱe, iskrcava se, servisira se, ukrcava se i odleƱeā€.

Faza 1: ƃta pravimo?U prethodnoj generaciji programskih projekata (pod nazivom proceduralno pro-jektovaƧe), ova faza je nazvana analiza zahteva i definicija sistema. Na ovimmestima smo se mogli izgubiti: obeshrabrivali su nazivi dokumenta koji su, samipo sebi, mogli postati veliki projekti. Namera je, meœutim, bila dobra. Analizazahteva kaƦe: ā€œNapravimo listu vodeƱih principa koje Ʊemo koristiti da bismoznali kada je posao zavrĆ£en, a kupac zadovoĆ anā€. Definicija sistema kaƦe: ā€œOvdeje opis onoga Ć£ta Ʊe program raditi (ne i kako) da bi ispunio zahteveā€. Analizazahteva je zapravo ugovor izmeœu vas i korisnika (Ć„ak i ako korisnik radi u vaĆ£empreduzeƱu ili je korisnik neki drugi objekat ili sistem). Definicija sistema je rezul-tat ispitivaƧa problema na najviĆ£em nivou i otkrivaƧa da li se posao moƦe ura-diti i za koje vreme. PoĆ£to Ʊe oba dokumenta zahtevati konsenzus meœu Ć udima(i poĆ£to Ʊe se dokumenti verovatno vremenom meƧati), mislim da je najboĆ e,radi uĆ£tede vremena, da dokumentacija bude Ć£to jednostavnija, najboĆ e u vidulista i osnovnih dijagrama. Druga ograniĆ„eƧa Ʊe moƦda zahtevati proĆ£ireƧa, aliako je poĆ„etni dokument saƦet, moƦe se napraviti u nekoliko sesija intenzivnogkolektivnog rada, sa rukovodiocem koji opisuje reĆ£eƧa. Na taj naĆ„in se od sva-koga zahteva uĆ„eĆ£Ć±e, ali se i podstiĆ„e zalagaƧe na samom poĆ„etku i usaglaĆ£a-vaƧe tima. MoƦda je najvaƦnije poletno zapoĆ„eti projekat.

Neohodno je ostati usredsreœen na ono Ć£to pokuĆ£avate da reĆ£ite u ovoj fazi, ato je ustanovĆ ivaƧe Ć£ta sistem treba da radi. Najvrednije sredstvo u tome je skupsluĆ„ajeva koriĆ£Ć±eƧa (engl. use cases). SluĆ„ajevi koriĆ£Ć±eƧa identifikuju kĆ uĆ„nekarakteristike sistema i otkrivaju neke osnovne klase koje Ʊete upotrebiti. To su,u suĆ£tini, opisni odgovori na pitaƧa poput sledeƱih:8

ā€¢ ā€œKo Ʊe koristiti ovaj sistem?ā€ā€¢ ā€œĆƒta mogu ovi uĆ„esnici uĆ„initi sa sistemom?ā€ā€¢ ā€œKako Ʊe ovaj uĆ„esnik to uraditi ovim sistemom?ā€ā€¢ ā€œKako bi joĆ£ ovo moglo raditi ako bi to radio neko drugi ili ako bi isti izvo-

œaĆ„ imao neki drugi ciĆ ?ā€ (za otkrivaƧe varijacija)ā€¢ ā€œKakvi se problemi mogu pojaviti dok se to radi sa sistemom?ā€ (za otkri-

vaƧe izuzetaka)

Ako, na primer, projektujete bankomat, sluĆ„aj koriĆ£Ć±eƧa konkretne funkcijesistema je u staƧu da opiĆ£e Ć£ta bankomat radi u svakoj moguƱoj situaciji. Svakaod ovih situacija naziva se scenario, a sluĆ„aj koriĆ£Ć±eƧa je skup scenarija. MoƦeterazmiĆ£Ć ati o scenariju kao pitaƧu koje poĆ„iƧe sa: ā€œĆƒta sistem radi ako...? ā€. Naprimer: ā€œĆƒta radi bankomat ako je klijent uloƦio Ć„ek u intervalu od 24 sata, a naraĆ„unu nema dovoĆ no novca da bi se obezbedila traƦena isplata?ā€

8 ZahvaƠujem na pomoƱi Jamesu H Jarretu.

34 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 34 str

Dijagrami sluĆ„ajeva koriĆ£Ć±eƧa namerno su veoma jednostavni da bi vasspreĆ„ili da se prerano upuĆ£tate u detaĆ e realizacije sistema:

Svaki simbol Ć„oveka predstavĆ a ā€œuĆ„esnikaā€ (engl. actor) koji je uglavnom osobaili neka druga vrsta nezavisnog izvrĆ£ioca. (MoƦe biti Ć„ak i drugi raĆ„unarski sistem,kao Ć£to je bankomat.) Pravougaonik predstavĆ a granicu vaĆ£eg sistema. ElipsepredstavĆ aju sluĆ„ajeve koriĆ£Ć±eƧa, a to su opisi korisnog posla koji sistem moƦeobaviti. Linije izmeœu uĆ„esnika i sluĆ„ajeva koriĆ£Ć±eƧa predstavĆ aju interakcije.

Nije bitno kako je sistem stvarno realizovan, sve dok ga korisnik ovako vidi.SluĆ„aj koriĆ£Ć±eƧa ne mora biti uƦasno sloƦen, Ć„ak i ako je sistem u Ƨegovoj

osnovi sloƦen. Njegova jedina namena je da pokaƦe kako sistem izgleda kori-sniku. Na primer:

SluĆ„ajevi koriĆ£Ć±eƧa proizvode definicije zahteva, odreœujuƱi sve moguƱeinterakcije izmeœu korisnika i sistema. PokuĆ£ajte da otkrijete potpuni skup slu-Ć„ajeva koriĆ£Ć±eƧa svog sistema i imaƱete jezgro onoga Ć£to sistem treba da radi.Dobra strana usredsreœivaƧa na sluĆ„ajeve koriĆ£Ć±eƧa jeste Ć£to vas uvek vraƱa nasuĆ£tinu i spreĆ„ava da zalutate u zahteve nebitne za zavrĆ£etak posla. Ako imatepotpuni skup sluĆ„ajeva koriĆ£Ć±eƧa, moƦete opisati svoj sistem i preƱi na sledeƱufazu. Verovatno neƱe sve biti savrĆ£eno izvedeno u prvom pokuĆ£aju, ali to je uredu. Sve Ʊe se razjasniti vremenom, a ako sada zahtevate savrĆ£enu definicijusistema, upaĆ£Ć±ete u zamku.

Klijent

Banku

Uplati

PrikaƦi saldoraƄuna

Prenos izmeœuraĆ„una

SluƦbenik

Koristi

Isplati

Bankomat

BaĆ£tovan

Staklena baĆ£ta

OdrƦavajradnu

temperaturu

Poglavlje 1: Uvod u objekte 35

MNPC, August 12, 2003 2:08 pm01 MNCP fm 35 str

Ako se naœete u zamci, ovu fazu moƦete prevaziƱi primenom grube aproksi-macije: opiĆ£ite sistem u nekoliko pasusa, a zatim potraƦite imenice i glagole.Imenice ukazuju na uĆ„esnike, kontekst sluĆ„aja koriĆ£Ć±eƧa (na primer, ā€œpre-dvorjeā€) ili tvorevine sa kojima se radi u sluĆ„aju koriĆ£Ć±eƧa. Glagoli ukazuju nainterakcije izmeœu uĆ„esnika i sluĆ„ajeva koriĆ£Ć±eƧa i definiĆ£u korake unutarsluĆ„aja koriĆ£Ć±eƧa. OtkriƱete takoœe da imenice i glagoli proizvode objekte iporuke u fazi projektovaƧa (primetite da sluĆ„ajevi koriĆ£Ć±eƧa opisuju inter-akcije izmeœu podsistema, tako da tehnika ā€œimenica i glagolaā€ moƦe da se koristisamo kao pomoƱno sredstvo pri razmiĆ£Ć aƧu, poĆ£to se tako ne dobijaju sluĆ„ajevikoriĆ£Ć±eƧa).9

Granica izmeœu sluĆ„aja koriĆ£Ć±eƧa i uĆ„esnika moƦe ukazati na postojaƧekorisniĆ„kog okruƦeƧa, ali ona ne definiĆ£e to okruƦeƧe. Da biste se upoznali saprocesom definisaƧa i pravĆ eƧa korisniĆ„kih okruƦeƧa, pogledajte kƧigu Soft-ware for Use, autora Larry Constantine i Lucy Lockwood, Addison-Wesley Long-man, 1999. ili Web lokaciju www.ForUse.com.

U ovom trenutku je bitan osnovni raspored, mada to moƦe delovati mistiĆ„no.Imate pregled onoga Ć£to gradite, tako da Ʊete verovatno imati ideju koliko dugoƱe to trajati. U igri je veliki broj Ć„inilaca. Ako predvidite dug period, preduzeƱemoƦe odluĆ„iti da se sistem ne razvija (i da uloƦi resurse u neĆ£to isplatĆ ivije ā€“ to jedobra stvar). Rukovodstvo je moƦda veƱ odluĆ„ilo koliko Ʊe trajati projekat ipokuĆ£aƱe da utiĆ„e na vaĆ£u procenu. NajboĆ e je odmah prikazati poĆ£ten raspo-red i Ć„vrste odluke. Bilo je mnogo pokuĆ£aja da se lansiraju pouzdane tehnikerasporeœivaƧa (poput tehnika predviœaƧa zbivaƧa na berzi), ali je verovatnonajboĆ e da se pouzdate u svoje iskustvo i intuiciju. Poœite od svog oseƱaja kolikoƱe proces zaista trajati, zatim udvostruĆ„ite vreme i dodajte 10 procenata. VaĆ£unutraĆ£Ć§i oseƱaj je verovatno ispravan i vi moƦete doƱi do nekih reĆ£eƧa tokomtog perioda. ā€œUdvostruĆ„avaƧeā€ Ʊe rad uĆ„initi udobnijim, a 10 procenata ostajeza konaĆ„no doterivaƧe i detaĆ e.10 Kako god ga objasnili, i bez obzira na Ʀalbe imanipulacije koje Ʊe uslediti kada obelodanite svoj raspored, izgleda da tajnaĆ„in vodi ka uspehu.

Faza 2: Kako Ʊemo izgraditi sistem?U ovoj fazi morate doƱi do reĆ£eƧa koje opisuje kako klase izgledaju i kako Ʊesaraœivati. OdliĆ„na tehnika za prepoznavaƧe klasa i interakcija jeste karticaKlasa-Odgovornost-SaradƧa (engl. Class-Responsibility-Collaboration, CRC ).Ovo sredstvo je znaĆ„ajno zbog svoje jednostavnosti: zapoĆ„iƧete rad sa skupomkartica dimenzija 7 Ɨ 12 cm i piĆ£ete po Ƨima. Svaka kartica predstavĆ a jednuklasu i na Ƨoj ispisujete:

1. Ime klase. Bitno je da ovo ime obuhvata suĆ£tinu onoga Ć£to klasa radi, takoda na prvi pogled ima smisla.

9 ViĆ£e informacija o sluĆ„ajevima koriĆ£Ć±eƧa moƦete naƱi u kƧizi Applying Use Cases, Schneider & Winters,Addison-Wesley, 1998. i Use Case Driven Object Modeling with UML, Rosenberg, Addison-Wesley, 1999.

10 Moj pristup ovome se nedavno promenio. DupliraƧe i dodavaƧe 10 procenata Ʊe vam dati prihvatĆ ivopouzdanu procenu (uz pretpostavku da nema previĆ£e dƦokerskih Ć„inilaca), ali Ʊete i daĆ e morati vredno daradite kako biste zavrĆ£ili posao u roku. Ako vam je treba viĆ£e vremena za elegantno reĆ£eƧe, a pri tomehoƱete da uƦivate u radu, verujem da je Ć„inilac kojim treba pomnoƦiti tri ili Ć„etiri.

36 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 36 str

2. ā€œOdgovornostā€ klase: Ć£ta ona treba da radi. MoguƱe je saƦimaƧe nabraja-Ƨem imena funkcija Ć„lanica (poĆ£to ova imena u dobrom projektu treba dabudu opisna), ali se ne iskĆ uĆ„uju dodatne beleĆ£ke. Ako hoƱete da makarkako zapoĆ„nete proces, posmatrajte problem sa stanoviĆ£ta leƧeg pro-gramera: koji objekti bi trebalo da se pojave da bi reĆ£ili vaĆ£ problem?

3. ā€œSaradƧaā€ klasa: s kojim klasama ova klasa komunicira? Namerno je oda-bran Ć£irok pojam ā€œkomunikacijaā€, jer moƦe znaĆ„iti okupĆ aƧe ili samopostojaƧe neke druge klase koja obavĆ a usluge za objekte posmatraneklase. SaradƧa treba da uzme u obzir i okolinu klase. Na primer, akonapravite klasu Vatromet, ko Ʊe je prouĆ„avati: HemiĆ„ar ili PosmatraĆ„? PrviƱe Ʀeleti da zna hemijski sastav, a drugi Ʊe reagovati na boje i oblike kojinastaju pri eksploziji.

MoƦda vam se Ć„ini da kartice treba da budu veƱe zbog svih informacija koje Ʊeobuhvatati, ali su one namerno malih dimenzija, ne samo zato da bi vaĆ£e klasebile male, nego i da se ne biste prerano upustili u detaĆ e. Ako ne moƦete da sme-stite na karticu sve Ć£to treba da znate o klasi, klasa je previĆ£e sloƦena (moƦda steuneli previĆ£e detaĆ a ili bi trebalo da napravite viĆ£e od jedne klase). SavrĆ£ena klasatreba da bude razumĆ iva na prvi pogled. CRC kartice pomaƦu da napravite grubprojekat, tako da steknete globalnu sliku i potom doterujete svoje reĆ£eƧe.

Komunikacija je jedna od velikih prednosti CRC kartica. NajboĆ e je raditi ugrupi, neposredno, bez koriĆ£Ć±eƧa raĆ„unara. Svaki uĆ„esnik preuzima odgovor-nost za nekoliko klasa (one u poĆ„etku nemaju imena, niti sadrƦe bilo kakveinformacije). Tako obavĆ ate simulaciju uƦivo, reĆ£avajuƱi jedan po jedan scena-rio, odluĆ„ujuƱi koje se poruke Ć£aĆ u objektima da bi se scenario ostvario. Tokomovog procesa otkrivate koje vam klase trebaju, Ƨihove odgovornosti i saradƧu, ipri tome popuƧavate kartice. Kada proœete kroz sve sluĆ„ajeve koriĆ£Ć±eƧa, tre-balo bi da imate priliĆ„no kompletan prvi nacrt projekta.

Pre nego Ć£to sam poĆ„eo da koristim CRC kartice, najuspeĆ£nije konsultantskoiskustvo sam stekao kada sam zapoĆ„eo projekat s timom koji nikada ranije nijekoristio OOP i crtao objekte na tabli. Razgovarali smo o komunikaciji meœuobjektima, neke od Ƨih smo brisali i zameƧivali drugim objektima. Zapravo,radio sam sa ā€œCRC karticamaā€ na tabli. Tim, koji je znao namenu projekta,doĆ£ao je do reĆ£eƧa ā€“ nije im dato reĆ£eƧe, bilo je ā€œĆ§ihovo sopstvenoā€. Ja sam privoœeƧu projekta samo postavĆ ao prava pitaƧa, testirao sam pretpostavke, pri-mao povratne informacije od tima i meƧao polazna stanoviĆ£ta. Prava lepotaprocesa je bila u tome Ć£to tim nije uĆ„io objektno orijentisano projektovaƧe pre-gledajuƱi apstraktne primere, nego su radili na svom reĆ£eƧu, koje im je u tomtrenutku bilo najzanimĆ ivije.

Kada prikupite CRC kartice, moƦda Ʊete hteti da formalnije opiĆ£ete svojereĆ£eƧe primenom UML-a.11 UML ne morate upotrebĆ avati, mada moƦe bitikoristan, naroĆ„ito ako Ʀelite da stavite dijagram na zid, da ga svi mogu prouĆ„a-vati, Ć£to je dobra ideja. Alternativa UML-u je tekstualni opis objekata i Ƨihovihinterfejsa ili neki pseudokod, Ć£to zavisi od koriĆ£Ć±enog programskog jezika.12

UML obezbeœuje dodatnu grafiĆ„ku notaciju za opis dinamiĆ„kog modelasistema. To je korisno kada su promene staƧa sistema ili podsistema tako vaƦne

11 PoĆ„etnicima preporuĆ„ujem ranije spomenuti UML Distilled.12 Python (www.Python.org) Ć„esto se koristi kao ā€œizvrĆ£ni pseudokodā€.

Poglavlje 1: Uvod u objekte 37

MNPC, August 12, 2003 2:08 pm01 MNCP fm 37 str

da su potrebni posebni dijagrami (primer je sistem za upravƠaƧe). Opis struk-tura podataka sistema ili podsistema moƦe biti potreban ako su podaci najzna-Ƅajniji faktor sistema (sluƄaj baza podataka).

ZnaƱete da ste zavrĆ£ili fazu 2 kada budete opisali objekte i Ƨihove interfejse,ili bar veƱinu, poĆ£to neki uvek izmaknu i budu otkriveni tek u fazi 3. To je, u redu.Samo hoƱete da pronaœete sve objekte. Lepo je ako se otkriju na poĆ„etku pro-cesa, ali OOP obezbeœuje dovoĆ no materijala za rad, pa nije straĆ£no ni ako ihotkrijete kasnije. ProjektovaƧe objekata se odvija u pet nivoa, kroz proces raz-voja programa.

Pet nivoa projektovaƧa objekataObjekti se ne projektuju samo prilikim pisaƧa programa, veƱ se projekat objektapostupno razvija. Ova perspektiva je korisna, poĆ£to prestajete da oĆ„ekujete tre-nutno savrĆ£enstvo i shvatate da Ʊete vremenom uvideti Ć£ta objekat radi i kakotreba da izgleda. Ovaj pogled se moƦe primeniti i na projektovaƧe razliĆ„itihtipova programa: obrazac za projektovaƧe odreœenog tipa programa nazire setek posle duƦeg napora uloƦenog u reĆ£avaƧe problema (Obrasci projektovaƧasu opisani u tomu 2). Za objekte takoœe postoje obrasci koji nastaju kroz razu-mevaƧe, koriĆ£Ć±eƧe i ponovnu upotrebu.

1. OtkrivaƧe objekata. Ovo je nivo poĆ„etne analize programa. Objekti mogubiti otkriveni dok se traƦe spoĆ ni Ć„inioci i granice, ponavĆ aƧa elemenata usistemu i najmaƧe konceptualne celine. Neki objekti su oĆ„igledni ako veƱimate skup biblioteka klasa. SliĆ„nost meœu klasama, koja ukazuje naosnovne klase i nasleœivaƧe, moƦe se pojaviti na poĆ„etku ili kasnije, u pro-cesu projektovaƧa.

2. FormiraƧe objekta. Tokom pravĆ eƧa objekta, nastaƱe potreba za novimĆ„lanovima koji se nisu pojavili pri otkrivaƧu. UnutraĆ£Ć§e potrebe objektamogu zahtevati podrĆ£ku drugih klasa.

3. IzgradƧa sistema. U prethodnom nivou mogli su se pojaviti dodatnizahtevi. Objekte razvijate dok saznajete nove pojedinosti. Potreba za komu-nikacijom i povezivaƧem s drugim objektima u sistemu, moƦe izmenitipotrebe klasa i zahtevati nove klase. Na primer, moƦda Ʊe vam biti potrebnepomoƱne klase, kao Ć£to je povezana lista, s malo ili bez ikakvih informacija ostaƧu, koje pomaƦu rad drugih klasa.

4. ƃireƧe sistema. Dok dodajete nove osobine sistemu, moƦete otkriti daprethodno reĆ£eƧe ne omoguƱava jednostavno proĆ£irivaƧe sistema. Uznove informacije, moƦete restrukturirati delove sistema, i eventualnododati nove klase ili hijerarhije klasa.

5. Ponovna upotreba objekata. Ovo je pravi test optereƱeƧa za klasu. Akoneko pokuĆ£a da je ponovo upotrebi u sasvim novoj situaciji, verovatno Ʊeotkriti neke nedostatke. Dok meƧate klasu da biste je prilagodili novimprogramima, opĆ£te osobine klase se razjaĆ£Ć§avaju, sve dok ne dobijete tipkoji zaista moƦete ponovo koristiti. Nemojte oĆ„ekivati da Ʊete veƱinu obje-kata sistema ponovo upotrebĆ avati ā€“ sasvim je prihvatĆ ivo da veliki brojobjekata bude specifiĆ„an za odreœeni sistem. Ponovo upotrebĆ ivi tipovi sureœi i koriste se za reĆ£avaƧe opĆ£tijih problema.

38 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 38 str

Uputstva za razvoj objekataEvo nekih preporuka za razvoj klasa:

1. Neka klasa nastane iz konkretnog problema, a zatim je razvijajte tokomreĆ£avaƧa drugih problema.

2. Setite se da otkrivaƧe potrebnih klasa (i Ƨihovih interfejsa) Ƅini najveƱideo razvoja sistema. Da ste veƱ imali gotove klase, projekat bi bio jednosta-van.

3. Nemojte se prisiĆ avati da shvatite sve na samom poĆ„etku ā€“ uĆ„ite tokomrada. U svakom sluĆ„aju, sve Ʊete saznati.

4. ZapoĆ„nite programiraƧe, doœite do neĆ„eg Ć£to radi, tako da moƦete dokazatiili opovrgnuti svoje reĆ£eƧe. Nemojte se plaĆ£iti da Ʊete zavrĆ£iti sa procedu-ralnim Ć£pagete kodom ā€“ klase raĆ£Ć„laƧuju problem, lokalizujuƱi problema-tiĆ„ne delove i nepoznate elemenete. LoĆ£e klase ne naruĆ£avaju dobre klase.

5. ZadrƦite jednostavnost. Mali i jasni objekti, od kojih imate oĆ„igledne koristi,boĆ i su od velikih sloƦenih interfejsa. U Ć„asu donoĆ£eƧa odluke koristiteOccamov princip: razmotrite moguƱnosti i uzmite najjednostavniju, poĆ£tosu jednostavne klase uvek najboĆ e. PoĆ„nite od malog i jednostavnog inter-fejsa klase, koji Ʊete Ć£iriti tek kada ga budete boĆ e razumeli, poĆ£to je teĆ£kovremenom odstraƧivati elemente iz klase.

Faza 3: Gradimo jezgroOvo je prvi prelaz od nacrta projekta u prevoœeƧe i izvrĆ£avaƧe koda koji semoƦe testirati, i koji Ʊe dokazati ili opovrgnuti ispravnost vaĆ£e arhitekture. Pro-ces nije jednoprolazni, nego je poĆ„etak niza koraka koji Ʊe iterativno izgraditisistem, kao Ć£to Ʊete videti u fazi 4.

CiĆ  je da pronaœete jezgro konstrukcije sistema, koje treba realizovati da bi senapravio izvrĆ£ni sistem, bez obzira na nepotpunost u prvom prolazu. Pravite okvirkoji moƦete nadograœivati u sledeƱim iteracijama. Osim toga, sprovodite prvu odmnogih faza integracija i testiraƧa sistema, i pruƦate investitorima povratnuinformaciju o izgledu i napredovaƧu sistema. U najboĆ em sluĆ„aju, otkrivate ineke znaĆ„ajne rizike. Verovatno Ʊete otkriti Ć£ta treba promeniti u prvobitnojarhitekturi i kako Ʊete je poboĆ Ć£ati ā€“ da niste realizovali sistem, ovo ne biste nisaznali.

Deo izgradƧe sistema je provera podobnosti analize zahteva i definicijesistema (u kakvom god obliku postojali). Obezbedite da test proverava zahteve isluĆ„ajeve koriĆ£Ć±eƧa. Po uspostavĆ aƧu stabilnog jezgra sistema, spremni ste danastavite dodavaƧe novih moguƱnosti.

Faza 4: Razvijamo sluĆ„ajeve koriĆ£Ć±eƧaKada se napravi izvrĆ£ni okvir jezgra sistema, svaki skup osobina koji dodajete jejedan mali projekat. Skup osobina dodajete tokom iteracije, srazmerno kratkogperioda razvoja.

Koliko traje iteracija? U najboƠem sluƄaju, iteracija traje od jedne do tri sed-mice (moƦe varirati u zavisnosti od jezika na kome se projekat realizuje). Na kraju

Poglavlje 1: Uvod u objekte 39

MNPC, August 12, 2003 2:08 pm01 MNCP fm 39 str

ovog perioda imate integrisani, testirani sistem, s veƱim brojem moguƱnosti.Posebno je zanimĆ iva osnova iteracije: to je jedan sluĆ„aj koriĆ£Ć±eƧa. Svaki sluĆ„ajkoriĆ£Ć±eƧa je paket meœusobno povezanih funkcija koje odjednom ugraœujete usistem, tokom jedne iteracije. Ne samo da se ovako dolazi do taĆ„nijeg zakĆ uĆ„ka oopsegu sluĆ„aja koriĆ£Ć±eƧa, nego se on i proverava, poĆ£to se sluĆ„aj koriĆ£Ć±eƧa neodbacuje posle analize i projektovaƧa, veƱ ostaje osnovna celina razvoja tokomcelog procesa izgradƧe softvera.

Prekidate sa iteracijama kada dostignete ciĆ nu funkcionalnost ili kada isteknerok, a kupac je zadovoĆ an trenutnom verzijom. (Prisetite se, razvoj softvera jeplaƱeni posao.) Kako je proces iterativan, za isporuku proizvoda imate mnogomoguƱnosti, a ne samo krajƧi termin. Projekti otvorenog izvornog koda razvijajuse iskĆ uĆ„ivo u iterativnom okruƦeƧu, uz mnoĆ£tvo povratnih informacija, iupravo to ih Ć„ini uspeĆ£nim.

Iterativni proces razvoja je vaƦan iz mnogo razloga. Rano moƦete otkriti irazreĆ£iti bitne rizike, kupci imaju dovoĆ no moguƱnosti da promene miĆ£Ć eƧe,zadovoĆ stvo programera je veƱe i projektom se moƦe preciznije upravĆ ati. JoĆ£jedna znaĆ„ajna prednost je davaƧe povratne informacije investitorima, koji potrenutnom staƧu proizvoda mogu taĆ„no videti u Ć£ta ulaƦu. Tako se umaƧuje ilieliminiĆ£e potreba za iscrpĆ ujuƱim sastancima i poveƱava se povereƧe i podrĆ£kainvestitora.

Faza 5: EvolucijaOva taĆ„ka razvojnog ciklusa obiĆ„no se naziva ā€œodrƦavaƧeā€. Taj sveobuhvatni ter-min moƦe znaĆ„iti bilo Ć£ta, od ā€œpostizaƧa da radi na naĆ„in kako je prvobitnozamiĆ£Ć enoā€ do ā€œdodavaƧa moguƱnosti koje je kupac zaboravio da spomeneā€ ili,tradicionalnije, ā€œotklaƧaƧe otkrivenih greĆ£akaā€ i ā€œdodavaƧe novih moguƱnostikada se ukaƦe potrebaā€. Mnoge zablude izaziva termin ā€œodrƦavaƧeā€, jer poprimasumƧivo znaĆ„eƧe, delimiĆ„no zato Ć£to se nameƱe miĆ£Ć eƧe da ste zapravoodavno napravili program i potrebno je samo da zamenite delove, podmaƦete ihi ne dozvolite da zarœaju. MoƦda postoji boĆ i izraz koji opisuje Ć£ta se tokom ovefaze zaista deĆ£ava.

KoristiƱu termin evolucija.13 ZnaĆ„i, ā€œprvi put neƱe uspeti, zato dozvolite sebi dauĆ„ite, a zatim se vratite i napravite izmeneā€. MoƦda Ʊe biti potrebno mnogo izmenanakon Ć£to dubĆ e razumete osnovne zahteve. Elegantan kĆ“d koji Ʊete napravititokom daĆ eg razvoja dok se ne dobije sasvim odgovarajuƱi sistem, isplatiƱe se, ikratkoroĆ„no i dugoroĆ„no. Evolucija je proces u kome dobar program postaje sjajani u kome se razjaĆ£Ć§avaju sporna pitaƧa iz prvog prolaza. U tom procesu se klaseza upotrebu u jednom projektu razvijaju u ponovno upotrebĆ ive klase.

ā€œOdgovarajuƱi sistemā€ ne znaĆ„i samo da program radi prema zahtevima isluĆ„ajevima koriĆ£Ć±eƧa. To znaĆ„i i da razumete unutraĆ£Ć§u strukturu programa,da se sve dobro uklapa, da nema nejasne sintakse, prevelikih objekata ili nespre-tno izloƦenih delova koda. Osim toga, morate imati i uvid da li Ʊe struktura pro-grama preƦiveti promene kroz koje Ʊe neminovno prolaziti tokom svog Ʀivotnogveka i da li se te promene mogu uneti lako i jasno. To nije mali podvig. Ne samo

13 Bar jedan aspekt evolucije opisan je u kƧizi Refactoring: improving the design of existing code, Martin Fow-ler, Addison-Wesley, 1999. Upozoravam vas da kƧiga koristi iskƠuƄivo primere na jeziku Java.

40 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 40 str

da morate razumeti Ć£ta pravite, nego i kako Ʊe se program daĆ e razvijati (ja tonazivam vektor promene14). Objektno orijentisani programski jezici su, na sreƱu,u staƧu da podrƦe ovu vrstu neprekidnih promena ā€“ granice koje postavĆ ajuobjekti spreĆ„avaju raspad strukture. Takoœe vam omoguƱavaju da, bez iza-zivaƧa veƱih potresa u kodu, unosite izmene kakve bi delovale drastiĆ„no u pro-ceduralnom programu. PodrĆ£ka evolutivnom razvoju je moƦda i najveƱa koristod OOP-a.

U evolutivnom razvoju pravite neĆ£to bar pribliƦno onome Ć£to mislite da trebaizgraditi, zatim to isprobavate uporeœujuƱi sa zahtevima i pronalazite nedo-statke. MoƦete se vratiti i ponovo projektovati i realizovati delove programa kojinisu radili ispravno da biste otklonili nedostatke.15 MoƦda Ʊete morati da reĆ£a-vate problem, ili neki Ƨegov aspekt, nekoliko puta pre nego Ć£to doœete do pra-vog reĆ£eƧa. (Ovde moƦe biti korisno prouĆ„avaƧe obrazaca projektovaƧa,opisanih u tomu 2.)

Evolucija se deĆ£ava i kada napravite sistem koji odgovara zahtevima, a zatimotkrijete da to nije ono Ć£to ste hteli. Kada vidite sistem u radu, otkrijete da steƦeleli da reĆ£ite neki drugi problem. Ako oĆ„ekujete ovakav tok razvoja, Ć£to prenapravite prvu verziju, da biste rano otkrili da li je rezultat ono Ć£to ste zaistanameravali.

NajvaƦnije je zapamtiti da Ʊe, po definiciji, ako meƧate klasu, Ƨene natklasei potklase i daĆ e raditi. Ne morate se bojati izmena (naroĆ„ito ako imate ugraœeniskup testova za proveru Ƨihove ispravnosti). Izmena ne mora obavezno naruĆ£iticeo program, a rezultat bilo koje promene moƦe biti ograniĆ„en na potklase i/ilipojedine saradnike promeƧene klase.

PlaniraƧe se isplatiSvakako ne biste zidali kuƱu bez mnoĆ£tva paƦƠivo iscrtanih planova. Ako pravitekrov ili kuƱicu za psa, planovi neƱe biti toliko detaĆ ni, ali Ʊete krenuti od nacrtakoji Ʊe vas voditi. Razvoj softvera je otiĆ£ao u krajnosti. Dugo Ć udi nisu planski pri-stupali razvoju, pa su veliki projekti poĆ„eli da propadaju. Kao reakcija su nastajalemetodologije s neverovatno sloƦenom strukturom i obiĆ em detaĆ a, uglavnomnameƧene velikim projektima. Bilo je previĆ£e zastraĆ£ujuƱe koristiti te metodo-logije ā€“ izgledalo je kao da Ʊete sve vreme posvetiti pisaƧu dokumentacije inimalo neƱete programirati. (To je Ć„esto i bio sluĆ„aj.) Nadam se da pristup kojisam vam ovde prikazao preporuĆ„uje sredƧi put ā€“ liniju napredovaƧa. Koristitepristup koji odgovara vaĆ£im potrebama (i vaĆ£im osobinama). Bez obzira na to Ć£tomoƦe biti i minimalan, neki plan Ʊe svakako puno poboĆ Ć£ati vaĆ£ projekat, za raz-liku od rada bez plana. Zapamtite da, po veƱini procena, preko 50 procenata pro-jekata propada (neke procene idu do 70 procenata).

RadeƱi prema planu, po moguƱnosti jednostavnom i kratkom, i projek-tovaƧem strukture pre nego Ć£to poĆ„nete da programirate, otkriƱete da se stvari

14 Termin se koristi u poglavĆ u Obrasci projektovaƧa u tomu 2.15 Ovo izgleda kao ā€œbrza izrada prototipaā€, u kojoj ste napravili brzu i grubu verziju, tako da moƦete upoznati

sistem, posle Ć„ega odbacujete prototip i izgraœujete pravi sistem. Problem je Ć£to programeri nisu odbaciva-li brzi prototip, nego su ga nadograœivali. Kada se brzi prototip kombinuje s nedostatkom strukture u pro-ceduralnom programiraƧu, Ć„esto nastaju zamrĆ£eni sistemi Ć„ije je odrƦavaƧe skupo.

Poglavlje 1: Uvod u objekte 41

MNPC, August 12, 2003 2:08 pm01 MNCP fm 41 str

uklapaju mnogo jednostavnije nego ako se odmah bacite na programiraƧe.Moje iskustvo govori da je elegantno reĆ£eƧe izvor zadovoĆ stva na sasvim pose-ban naĆ„in: bliƦe je umetnosti nego tehnologiji. DostizaƧe elegancije se uvekisplati i to nije beznaĆ„ajan posao. Dobijate program koji se jednostavnije piĆ£e igreĆ£ke se lakĆ£e otklaƧaju, program se lakĆ£e razume i odrƦava, a tu se leƦi i finan-sijska dobit.

Ekstremno programiraƧeTehnike analize i projektovaƧa sam detaĆ no prouĆ„avao, joĆ£ od studija. Konceptekstremnog programiraƧa (engl. Extreme Programming, XP ) je najdetaĆ niji inajboĆ i koji sam video. Hroniku moƦete pronaƱi u kƧizi Extreme ProgrammingExplained, autor je Kent Beck, izdavaĆ„ Addison Wesley, 2000. i na Web adresiwww.xprogramming.com.

XP je i naĆ„in programiraƧa i skup uputstava. Neka od ovih uputstava odraƦa-vaju se i u drugim savremenim metodologijama, ali dva najvaƦnija posebnadoprinosa su ā€œprvo sastavite testoveā€ i ā€œprogramiraƧe u paruā€. Iako se Ć„vrstozalaƦe za proces u celini, Beck naglaĆ£ava da Ʊete znaĆ„ajno poveƱati produk-tivnost i pouzdanost ako usvojite bar ova dva naĆ„ela.

Prvo sastavite testoveTestiraƧe se tradicionalno ostavĆ alo za sam kraj projekta, poĆ£to ā€œsve radi, samose treba uveritiā€. Samo po sebi je imalo nizak prioritet, Ć udi koji su se specijali-zovali za testiraƧe nisu uƦivali naroĆ„it ugled i Ć„esto su premeĆ£tani u suteren,daleko od ā€œpravih programeraā€. Timovi za testiraƧe su odgovarali na svoj naĆ„in,iduƱi dotle da se oblaĆ„e u crno, a veselo su se razmetali svaki put kada otkrijuneku greĆ£ku (iskreno reĆ„eno, i ja sam se tako oseƱao dok sam obarao C++ prevo-dioce).

XP u potpunosti preokreƱe koncept testiraƧa, dajuƱi mu jednak (Ć„ak i viĆ£i)prioritet od pisaƧa programa. Testove piĆ£ete pre odgovarajuƱeg koda i oni ostajuzauvek uz kĆ“d. UspeĆ£no izvrĆ£avaƧe testova je obavezno posle svake integracijeprojekta (to se deĆ£ava Ć„esto, nekada i viĆ£e puta dnevno).

PisaƧe testova ima dve posebno vaƦne posledice.Prvo, pisaƧe testova primorava da se jasno definiĆ£e interfejs klase. ƅesto sam

kao pomoƱno sredstvo pri projektovaƧu sistema preporuĆ„ivao Ć udima daā€œzamisle savrĆ£enu klasu za reĆ£avaƧe odreœenog problemaā€. XP strategija testi-raƧa ide joĆ£ daĆ e: taĆ„no se definiĆ£e kako klasa mora izgledati Ƨenom korisniku ikako se mora ponaĆ£ati. Nije dozvoĆ ena nikakva neizvesnost. MoƦete sastavitikompletan tekst ili nacrtati sve dijagrame koji opisuju ponaĆ£aƧe i izgled klase, aliniĆ£ta nije tako stvarno kao skup testova. Tekst i dijagrami su lista ƦeĆ a, a testovi suugovor koji podrƦavaju prevodilac i izvrĆ£ni program. TeĆ£ko je zamisliti realnijiopis klase od testova.

Pri sastavĆ aƧu testova primorani ste da paƦƠivo pregledate klasu i Ć„esto Ʊeteotkriti neophodne funkcije koje mogu biti propuĆ£tene tokom eksperimenata saUML dijagramima, CRC karticama, sluĆ„ajevima koriĆ£Ć±eƧa itd.

42 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 42 str

Druga vaƦna posledica pisaƧa testova na poĆ„etku jeste to Ć£to se testoviizvrĆ£avaju svaki put kada sklapate program. IzvrĆ£avaƧe testova se nadovezujena provere koje sprovodi prevodilac. Ako iz ove perspektive pogledate evolucijuprogramskih jezika, videƱete da je napredak tehnologije uvek pratilo uvoœeƧestroƦih testova. Asemblerski jezik je proveravao samo sintaksu, ali je C namet-nuo neka semantiĆ„ka ograniĆ„eƧa koja spreĆ„avaju odreœene tipove greĆ£aka.OOP jezici donose dodatna semantiĆ„ka ograniĆ„eƧa koja su vidovi testiraƧa.ā€œDa li je ovaj tip podataka pravilno upotrebĆ en? Da li je ispravan ovaj pozivfunkcije?ā€ jesu testovi koje obavĆ a prevodilac ili izvrĆ£ni sistem. Videli smo rezul-tate ugraœivaƧa ovih testova u jezik: Ć udi prave sloƦenije sisteme i puĆ£taju ih urad, i za to im treba mnogo maƧe vremena i napora. Pitao sam se Ć£ta je razlog,ali sam shvatio da se radi o testovima: uĆ„inite neĆ£to pogreĆ£no i sigurnosni sistemugraœenih testova ukazuje na to da problem postoji i gde se nalazi.

Ali, testovi u samom jeziku nisu svemoƱni. U nekom trenutku morate vinastupiti i dopuniti skup testova (u saradƧi s prevodiocem i izvrĆ£nim sistemom)koji proverava ceo program. PoĆ£to shvatate koliko je korisno da vam prevodilacstalno gleda preko ramena, zar ne biste Ʀeleli da vam ovi testovi pomaƦu odsamog poĆ„etka? Zato ih i piĆ£ite na poĆ„etku i automatski izvrĆ£avajte pri svakomsklapaƧu. VaĆ£i testovi proĆ£iruju sigurnosni sistem programskog jezika.

Otkrio sam da me koriĆ£Ć±eƧe sve moƱnijih programskih jezika ohrabruje daeksperimentiĆ£em, poĆ£to znam da mi taj jezik neƱe dozvoliti da gubim vremeloveƱi greĆ£ke. XP Ć£ema testiraƧa radi istu stvar za ceo vaĆ£ projekat. PoĆ£to znate daƱe testovi pronaƱi sve greĆ£ke koje napravite (a vi redovno dodajete nove testovedok razmiĆ£Ć ate o Ƨima), moƦete po potrebi praviti velike promene, ne brinuƱi daƱete izazvati potpunu zbrku u projektu. Ovo je neverovatno moƱno.

ProgramiraƧe u paruProgramiraƧe u paru stoji nasuprot individualizmu kojim smo indoktriniraniod poĆ„etka, kroz Ć£kolovaƧe (uspeƱemo samostalno ili pasti, a rad sa susedimase smatrao ā€œprevaromā€) i medije, naroĆ„ito holivudske filmove u kojima se Ć„estojunak bori protiv bezumnog poretka.16 Programeri se, takoœe, smatraju uzorimaindividualizma ā€“ ā€œusamĆ eni kauboji programeriā€, Ć£to bi rekao Larry Constan-tine. XP, koji se bori protiv konvencionalnog naĆ„ina razmiĆ£Ć aƧa, tvrdi da pro-gram treba da piĆ£u dve osobe za jednom radnom stanicom. Osim toga, ovo trebaraditi u prostoriji s veƱim brojem radnih stanica, bez paravana koje vole projek-tanti raĆ„unarskih sala. Beck kaƦe da pri prelasku na XP prvo treba doneti kleĆ£tada bi se rasklopilo i bacilo sve Ć£to se nalazi na putu.17 (Ovo podrazumeva darukovodilac moƦe da vas zaĆ£titi od gneva osobĆ a za odrƦavaƧe.)

Vrednost programiraƧa u paru je Ć£to jedna osoba piĆ£e program, a drugarazmiĆ£Ć a o Ƨemu. Onaj koji razmiĆ£Ć a ima u vidu globalnu sliku i uputstva XP-a, ane samo trenutni problem. Ako radi dvoje, maƧe je verovatno, na primer, da Ʊe

16 Iako je ovo preteƦno ameriĆ„ko stanoviĆ£te, holivudski filmovi stiƦu svuda.17 UkĆ uĆ„ujuƱi (posebno) razglas. Jednom sam radio u kompaniji koja je preko razglasa obaveĆ£tavala o tele-

fonskim pozivima i to je neprekidno ometalo rad (direktori nisu mogli da zamisle da se ukine tako znaĆ„ajansistem kao Ć£to je razglas). KonaĆ„no, kada me niko nije gledao, poĆ„eo sam da seĆ„em kablove.

Poglavlje 1: Uvod u objekte 43

MNPC, August 12, 2003 2:08 pm01 MNCP fm 43 str

se jedno provuƱi sa stavom: ā€œNeƱu da piĆ£em testoveā€. Ako programer upadne uproblem, mogu zameniti mesta. Desi li se da oboje upadnu u problem, nekodrugi u prostoriji Ć„uƱe Ƨihove nedoumice i priteƱi u pomoƱ. Rad u parovimaodrƦava tok i pravac posla. MoƦda je joĆ£ vaƦnije to Ć£to programiraƧe postajehumanije i zabavnije.

PoƄeo sam da primeƧujem programiraƧe u parovima tokom veƦbi na nekimseminarima i iskustva svih uƄesnika bila su znatno boƠa.

ZaĆ£to C++ uspevaC++ je toliko uspeĆ£an delimiĆ„no zato Ć£to nije bio ciĆ  samo da se C pretvori u OOPjezik (iako je tako poĆ„elo), nego i da se reĆ£e mnogi drugi problemi s kojima sedanas suoĆ„avaju programeri, naroĆ„ito oni koji su mnogo uloƦili u C. Tvorci OOPjezika tradicionalno su nastojali da nateraju korisnike da zaborave sve i krenu izpoĆ„etka s novim skupom koncepata i novom sintaksom, uz obrazloƦeƧe da je,gledajuƱi dugoroĆ„no, boĆ e ostaviti stari prtĆ ag proceduralnih jezika. Na kraƱestaze, veƱina tog prtĆ aga je imala vrednost. Najvredniji element moƦda i nijepostojeƱa programska osnova (koja se, uz odgovarajuƱe alatke, moƦe prevesti),nego osnova razmiĆ£Ć aƧa. Ako ste aktivni C programer i morate napustiti sve Ć£toznate o C-u da biste usvojili nove jezike, smaƧuje vam se produktivnost tokomviĆ£e narednih meseci, sve dok se vaĆ£ naĆ„in razmiĆ£Ć aƧa ne uklopi u novu para-digmu. Oslonite li se na svoje poznavaƧe C-a i proĆ£irite ga, biƱete jednakoproduktivni dok se selite u svet objektno orijentisanog programiraƧa. PoĆ£to svakoima svoj mentalni model programiraƧa, ova promena je dovoĆ no komplikovana ibez dodatnih troĆ£kova zbog zapoĆ„iƧaƧa rada s novim jezikom od osnova. Razloguspeha C++-a je u suĆ£tini ekonomski: mora se platiti cena prelaska na OOP, ali jecena za C++ moƦda niƦa.18

CiĆ  C++-a je poveƱaƧe produktivnosti. Produktivnost se postiƦe na mnogonaĆ„ina, ali je jezik projektovan da vam Ć£to viĆ£e pomogne, ne ometajuƱi vas pre-viĆ£e strogim pravilima ili zahtevima da koristite neki odreœeni skup moguƱnosti.C++ je projektovan da bude praktiĆ„an: odluke pri projektovaƧu C++-a su bilezasnovane na pruƦaƧu Ć£to viĆ£e korisnih moguƱnosti programerima (bar sastanoviĆ£ta C-a).

BoĆ i CNapredovaƱete Ć„ak i ako nastavite da piĆ£ete kĆ“d na C-u, poĆ£to je C++ popuniomnoge praznine jezika C i uveo boĆ u proveru tipova i analizu pri prevoœeƧu.MoraƱete deklarisati funkcije, tako da prevodilac moƦe da proveri Ƨihovu upo-trebu. Pretprocesor je postao skoro nepotreban, bar se viĆ£e ne koristi za zamenuvrednosti i makroe, pa je ukloƧen uzrok niza greĆ£aka koje se teĆ£ko otkrivaju.C++ ima svojstvo pod nazivom referenca (engl. reference) Ć£to omoguƱava pogod-niju obradu adresa argumenata i povratnih vrednosti funkcija. Upotreba imenaje poboĆ Ć£ana uvoœeƧem preklapaƧa funkcija (engl. function overloading) koja

18 KaƦem ā€œmoƦdaā€ poĆ£to, s obzirom na sloƦenost C++-a, moƦe biti jeftinije preƱi na Javu. Odluka o izborujezika ima mnogo Ć„inilaca, a u ovoj kƧizi pretpostavĆ am da ste izabrali C++.

44 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 44 str

dozvoĆ ava upotrebu istog imena za razliĆ„ite funkcije. Imenski prostor (engl.namespace) takoœe unapreœuje upravĆ aƧe imenima. Postoje i brojne osobinekoje poveƱavaju bezbednost C-a.

VeƱ ste na uzlaznoj linijiProduktivnost je problem pri uĆ„eƧu novog jezika. Nijedno preduzeƱe ne moƦesebi priuĆ£titi da iznenada izgubi produktivnog inƦeƧera zato Ć£to uĆ„i nov jezik.C++ je proĆ£ireƧe C-a, koje nema potpuno novu sintaksu i model programiraƧa.To vam omoguƱava da nastavite pisaƧe korisnog koda i primeƧujete postepenonove moguƱnosti dok ih uĆ„ite i usvajate. Ovo moƦe biti jedan od najvaƦnijihrazloga uspeha C++-a.

Osim toga, svi vaĆ£i postojeƱi C programi i daĆ e su upotrebĆ ivi u C++-u. PoĆ£toje prevodilac C++-a usavrĆ£en, Ć„esto Ʊete pronaƱi skrivene greĆ£ke C koda dok gaprevodite u C++.

EfikasnostPonekad treba smaƧiti brzinu izvrĆ£avaƧa zarad veƱe produktivnosti progra-mera. Na primer, finansijski model moƦe biti upotrebĆ iv samo u kratkom peri-odu, tako da je vaƦniji brz razvoj modela od brzine izvrĆ£avaƧa programa.Meœutim, veƱina aplikacija zahteva izvestan stepen efikasnosti, pa C++ Ć„estodaje prednost efikasnosti u odnosu na lakoƱu programiraƧa. PoĆ£to C programeriuglavnom veoma paze na efikasnost, ovo je argument protiv tvrœeƧa da je jezikpreviĆ£e glomazan i spor. Veliki broj moguƱnosti C++-a je nameƧen poboĆ -Ć£avaƧu performansi ako se ispostavi da izvrĆ£ni program nije dovoĆ no efikasan.

Pored istih moguƱnosti niskog nivoa za upravĆ aƧe kao u C-u (i moguƱnostida koristite asemblerski jezik unutar C++ programa), u praksi je dokazano da jebrzina objektno orijentisanog C++ programa u intervalu Ā±10% u odnosu nabrzinu C programa, a Ć„esto je razlika u brzini veoma mala.19

Projekat napravƠen za OOP program moƦe biti mnogo efikasniji nego zatakav program na C-u.

Sisteme je lakĆ£e opisati i razumetiKlase, projektovane radi savladavaƧa problema, sluƦe Ƨegovom boĆ em izraƦa-vaƧu. ZnaĆ„i da prilikom pisaƧa programa opisujete reĆ£eƧe u terminima obla-sti problema (ā€œStavite prsten na gomiluā€), umesto terminologijom raĆ„unara kojije prostor reĆ£eƧa (ā€œPostavite vrednost bita u Ć„ipu tako da se relej zatvoriā€). Takoradite sa pojmovima viĆ£eg nivoa i mnogo viĆ£e moƦete postiƱi samo jednim pro-gramskim redom.

Druga dobit od ove jednostavnosti izraƦavaƧa potiĆ„e od odrƦavaƧa na koje(ako je verovati izveĆ£tajima) odlazi veliki deo troĆ£kova tokom Ʀivotnog veka pro-grama. LakĆ£e je odrƦavati razumĆ iviji program. SniƦava se i cena pisaƧa i odrƦa-vaƧa dokumentacije.

19 Podatke o znaƄajnim istraƦivaƧima performansi C++ biblioteke moƦete naƱi u Ƅasopisu C/C++ User' Jour-nal, u kolumni Ƅiji je autor Dan Saks.

Poglavlje 1: Uvod u objekte 45

MNPC, August 12, 2003 2:08 pm01 MNCP fm 45 str

Maksimalna dobit od bibliotekaNajbrƦe Ʊete napisati program ako koristite veƱ napisan kĆ“d ā€“ biblioteku.ZnaĆ„ajni ciĆ  C++-a jeste jednostavija upotreba biblioteka. Ovo je reĆ£eno pret-varaƧem biblioteka u nove tipove podataka (klase), tako da se uvoœeƧem bibli-oteke jeziku dodaju novi tipovi. PoĆ£to C++ prevodilac vodi raĆ„una o upotrebibiblioteke, garantuje ispravnu inicijalizaciju i brisaƧe i obezbeœuje ispravnostpoziva funkcija, moƦete se usredsrediti na ono Ć£to biblioteka treba da uradi a nena to kako biblioteka radi.

PoĆ£to imena funkcija mogu biti podeĆ ena po delovima programa, pomoƱuimenskih prostora C++-a moƦete koristiti koliko god biblioteka hoƱete, bezsukoba imena koji se deĆ£avaju u C-u.

Ponovna upotreba izvornog koda uz Ć£ablonePostoji znaĆ„ajna klasa tipova koji zahtevaju izmenu izvornog koda da bi se mogliefikasno ponovo koristiti. ƃablon (engl. template) C++-a automatski meƧaizvorni program i moƱno je sredstvo za ponovnu upotrebu biblioteka. ƃablonkoji radi s jednim tipom radiƱe bez problema s mnogim drugim tipovima.ƃabloni su posebno moƱni poĆ£to od programera klijenta skrivaju sloƦenost ovognaĆ„ina ponovne upotrebe koda.

Obrada greĆ£akaObrada greĆ£aka u C-u je ozloglaĆ£ena i Ć„esto se ignoriĆ£e, pa se programeri Ć„estooslaƧaju na sreƱu. Ako pravite velik, sloƦen program, nema niĆ„eg neugodnijegod greĆ£ke koja je negde skrivena, a nema nikakvog pokazateĆ a odakle potiĆ„e.Obrada izuzetaka C++-a (opisana u ovom tomu, a detaĆ no obraœena u tomu 2)garantuje da Ʊe se greĆ£ka otkriti i da Ʊe biti obraœena.

ProgramiraƧe sloƦenih sistemaUpotrebĆ ivost mnogih tradicionalnih jezika ograniĆ„ava veliĆ„ina i sloƦenost pro-grama. Na primer, BASIC moƦe biti sjajan za brzo reĆ£avaƧe odreœenih kategorijaproblema, ali ako program preraste nekoliko strana ili izaœe iz domena problemauobiĆ„ajenih za taj jezik, daĆ i rad liĆ„i na pokuĆ£aj plivaƧa kroz gustu teĆ„nost. I jezikC ima ovakva ograniĆ„eƧa. Na primer, kada program premaĆ£i otprilike 50000redova koda, nailazi se na problem kolizije imena koji potiĆ„e od prekoraĆ„eƧabroja imena funkcija i promenĆ ivih. Posebno teƦak problem su sitne pukotineC-a: greĆ£ke skrivene u velikom programu se jako teĆ£ko pronalaze.

Ne postoji jasna granica koja bi ukazala da je programski jezik ispod vaĆ£ihoĆ„ekivaƧa, a i da postoji, vi biste je ignorisali. Ne kaƦete: ā€œMoj BASIC program jepostao prevelik i moram ga ponovo napisati na C-u! ā€. Umesto toga, pokuĆ£avateda na silu umetnete joĆ£ nekoliko redova kako biste dodali novu moguƱnost. Takovam se neosetno pribliƦavaju dodatni troĆ£kovi.

46 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 46 str

C++ je projektovan da podrƦi velike projekte, Ć£to znaĆ„i da izbriĆ£e graniceizmeœu malog i velikog programa pri postepenom poveƱavaƧu sloƦenosti. Sva-kako ne morate koristiti OOP, Ć£ablone, imenske prostore i obradu izuzetaka kadapiĆ£ete mali usluƦni program u stilu ā€œzdravo, sveteā€, ali ove moguƱnosti su tu kadavam budu zatrebale. Osim toga, prevodilac detaĆ no traƦi greĆ£ke, kako u malim,tako i u velikim programima.

Strategije unapreœivaƧaAko vam se dopadne OOP, verovatno je vaĆ£e sledeƱe pitaƧe: ā€œKako da prido-bijem Ć£efa/kolege/odeĆ eƧe/susede da poĆ„nu da koriste objekte? ā€ Pomislite nato kako biste vi, jedan nezavisni programer, uĆ„ili da koristite novi jezik i novuprogramsku paradigmu. Vi ste to veƱ uradili. Na prvom mestu su obrazovaƧe iprimeri, a zatim se radi probni projekat da biste nauĆ„ili osnove, bez zbuƧujuƱihdetaĆ a. Zatim stiƦe projekat iz ā€œstvarnog svetaā€ koji zaista radi neĆ£to korisno.Tokom prvog projekta nastavĆ ate uĆ„eƧe Ć„itajuƱi, postavĆ ajuƱi pitaƧa struƄƧa-cima i razmeƧujuƱi saznaƧa s prijateĆ ima. Ovaj pristup prelasku s C-a na C++preporuĆ„uju mnogi iskusni programeri. Prelazak celog preduzeƱa na C++sigurno je dinamiĆ„niji, ali je korisno prisetiti se kako bi to uradila jedna osoba.

UputstvaPri prelasku na OOP i C++ treba uzeti u obzir naredna uputstva:

1. ObukaPrvi korak je obrazovaƧe. Prisetite se koliko je preduzeƱe uloƦilo u C programe ipokuĆ£ajte da spreĆ„ite haos tokom sledeƱih Ć£est do devet meseci, dok su svizaokupĆ eni odgonetaƧem kako radi viĆ£estruko nasleœivaƧe. Izaberite malugrupu za indoktrinaciju, po moguƱnosti sastavĆ enu od radoznalih osoba kojedobro rade timski i mogu delovati kao mreƦa za podrĆ£ku tokom uĆ„eƧa C++-a.

Alternativni pristup koji se ponekad preporuĆ„uje jeste istovremeno obuĆ„a-vaƧe na svim nivoima preduzeƱa, ukĆ uĆ„ujuƱi informativne kurseve za rukovo-dioce koji definiĆ£u strategiju, kao i kurseve projektovaƧa i programiraƧa za onekoji se bave razvojem projekata. Ovo je posebno pogodno za maƧa preduzeƱakoja suĆ£tinski meƧaju naĆ„in rada ili za organizacione celine veƱih preduzeƱa.PoĆ£to je cena viĆ£a, neki mogu odluĆ„iti da zapoĆ„nu obuĆ„avaƧe na nivou projekta,naprave pilot projekat (eventualno uz pomoƱ spoĆ nog savetnika), posle Ć„egaprojektni tim moƦe poduĆ„avati ostale u preduzeƱu.

2. Projekat niskog rizikaPoĆ„nite od projekta niskog rizika i slobodno greĆ£ite. Kada steknete izvesno isku-stvo, Ć„lanovi prvog tima mogu zapoĆ„eti druge projekte ili postati tehniĆ„ka podr-Ć£ka. Prvi projekat ne bi trebalo da bude znaĆ„ajan za preduzeƱe, poĆ£to moƦdaneƱe od poĆ„etka raditi sasvim korektno. Trebalo bi da bude jednostavan, neza-visan i pouĆ„an, Ć£to znaĆ„i da obuhvata stvaraƧe klasa koje Ʊe biti znaĆ„ajne dru-gim programerima u preduzeƱu kada doœe red na Ƨih da uĆ„e C++.

Poglavlje 1: Uvod u objekte 47

MNPC, August 12, 2003 2:08 pm01 MNCP fm 47 str

3. Modelirajte na osnovu uspelih reĆ£eƧaPotraƦite primere dobrih objektno orijentisanih projekata pre nego Ć£to poĆ„neteod praznog lista hartije. Postoji velika verovatnoƱa da je neko veƱ reĆ£io vaĆ£ pro-blem, a Ć„ak i ako nije reĆ£en baĆ£ taj, verovatno moƦete apstrahovati i izmenitipostojeƱi projekat tako da odgovara vaĆ£im potrebama. Ovo je opĆ£ti konceptobrazaca projektovaƧa, opisanih u tomu 2.

4. Koristite postojeƱe biblioteke klasaOsnovni ekonomski motiv za prelazak na OOP jeste jednostavnost upotrebepostojeƱeg koda u vidu biblioteka klasa (konkretno, standardnih C++ bibliotekakoje su detaĆ no opisane u tomu 2 ove kƧige). NajkraƱi ciklus razvoja aplikacijepostiƦete ako ne napiĆ£ete niĆ£ta osim funkcije main(), inicijalizujuƱi i koristeƱiobjekte iz gotovih biblioteka. Neki poĆ„etnici ovo ne shvataju, nisu svesni posto-jeƱih biblioteka klasa ili, oduĆ£evĆ eni jezikom, Ʀele da piĆ£u klase koje veƱ moƦdapostoje. NajveƱi uspeh uz OOP i C++ postiƱi Ʊete ako se potrudite da na poĆ„etkuprelaznog perioda pronaœete i koristite kĆ“d drugih autora.

5. Nemojte na C++-u ponovo pisati postojeƱi kĆ“dIako prevoœeƧe C programa C++ prevodiocem Ć„esto daje (nekada ogromne)koristi jer se pronalaze problemi u starom kodu, ponovno pisaƧe ispravnihpostojeƱih programa na C++-u Ć„esto nije najboĆ i naĆ„in da se iskoristi vreme.(Ako ga morate pretvoriti u objekte, moƦete ā€œomotatiā€ C kĆ“d C++ klasama.) Nekakorist od toga postoji, naroĆ„ito ako je kĆ“d nameƧen ponovnoj upotrebi. MoƦdaneƱete uoĆ„iti oĆ„ekivano veliko poveƱaƧe produktivnosti, osim ako projekat nijepotpuno nov. C++ i OOP se pokazuju u punom sjaju kada projekat radite odideje do realizacije.

TeĆ£koƱe upravĆ aƧaAko ste na rukovodeƱoj poziciji, vaĆ£a zaduƦeƧa su da nabavite resurse za tim, daprevaziœete prepreke na putu do uspeha i, uopĆ£te, da pokuĆ£ate da obezbeditenajproduktivnije i najugodnije okruƦeƧe, tako da vaĆ£ tim moƦe da stvori sva onaĆ„uda koja se uvek traƦe od vas. Prelazak na C++ spada u sve tri navedene kate-gorije i bilo bi sjajno kada ne biste morali niĆ£ta da platite. Iako prelazak na C++moƦe biti jeftiniji, Ć£to zavisi od ograniĆ„eƧa,20 nego druge OOP moguƱnosti zatim C programera (i verovatno za programere na drugim proceduralnimjezicima), ovaj jezik nije besplatan i postoje teĆ£koƱe kojih morate biti svesni prenego Ć£to zapoĆ„nete prelazak na C++ unutar preduzeƱa i upustite se u troĆ£kove.

PoĆ„etni troĆ£koviTroĆ£kovi prelaska na C++ prevazilaze cenu nabavke C++ prevodioca (GNU C++prevodilac, jedan od najboĆ ih, besplatan je). SredƧoroĆ„ni i dugoroĆ„ni troĆ£kovi Ʊese smaƧiti ako investirate u obuku (ako je moguƱe, angaƦujte i savetnika za prviprojekat) i ako izaberete i naruĆ„ite biblioteke klasa koje reĆ£avaju problem, kako te

20 S obzirom na poboĆ Ć£aƧa produktivnosti, trebalo bi razmotriti i jezik Java.

48 Misliti na jeziku C++

MNPC, August 12, 2003 2:08 pm01 MNCP fm 48 str

biblioteke ne biste pravili sami. Ovo su veliki troĆ£kovi, i moraju se uzeti u obzir priplaniraƧu. Postoje i skriveni troĆ£kovi pri uĆ„eƧu novog jezika, eventualno i novogprogramskog okruƦeƧa. Oni se svakako smaƧuju kroz obuku i savetovaƧe, aliĆ„lanovi tima moraju uloƦiti i sopstveni napor pri usvajaƧu nove tehnologije. Zato vreme tim Ʊe viĆ£e greĆ£iti (ovo je prirodno, poĆ£to je uviœaƧe greĆ£aka najbrƦinaĆ„in uĆ„eƧa) i biƱe maƧe produktivan. ƅak i tada, s nekim problemima u pro-gramiraƧu, uz prave klase i u odgovarajuƱem okruƦeƧu, moguƱe je ostvaritiveƱu produktivnost (uzimajuƱi u obzir i veƱi broj greĆ£aka i maƧi broj program-skih redova na dan) nego ako se zadrƦite na C-u.

PitaƧa performansiUobiĆ„ajeno pitaƧe je: ā€œZar OOP mnogo ne uveƱava i ne usporava moje pro-grame?ā€. Odgovor je: ā€œZavisiā€. VeƱina tradicionalnih OOP jezika napravĆ ena jetako da omoguƱi eksperimentisaƧe i brzu izradu prototipova, a ne izradu efika-snih sistema. Zato je delovalo da Ʊe objektni programi biti veƱi i sporiji. C++ jenameƧen produktivnom programiraƧu. Kada se usredsredite na brze prototi-pove, moƦete ubacivati komponente zanemarujuƱi pitaƧa efikasnosti. Ako kori-stite gotove biblioteke, one su obiĆ„no veƱ optimizovane, pa vi to ne morate raditidok razvijate prototip. Kada doœete do odgovarajuƱeg sistema koji je dovoĆ nomali i brz, posao je zavrĆ£en. U suprotnom zapoĆ„iƧete podeĆ£avaƧe parametara,otkrivajuƱi Ć£ta se sve moƦe ubrzati jednostavnom primenom ugraœenih opcijaC++-a. Ako to ne pomogne, ispitujte kako se moƦe promeniti program, ne meƧa-juƱi kĆ“d koji koristi pojedinaĆ„ne klase. U sluĆ„aju da niĆ£ta ne uspe, meƧajte pro-jekat. ƅiƧenica da su performanse veoma vaƦne u nekom delu projekta jepokazateĆ  da one moraju biti deo poĆ„etnih kriterijuma. Korisno je da to ranootkrijete primeƧujuƱi brzi razvoj.

Ranije je reĆ„eno da se razlika u brzini izmeœu C-a i C++-a najĆ„eĆ£Ć±e nalazi uintervalu Ā±10%, a Ć„esto je sasvim mala. Veliko skraƱivaƧe izvornog koda i ubrza-vaƧe programa primenom C++-a moƦe poticati od razlike u projektima pravĆ e-nim za C i C++.

Podaci o poreœeƧima C-a i C++-a su anegdotski i verovatno Ʊe tako i ostati.Iako neki preporuĆ„uju da se isti projekat realizuje i na C-u i na C++-u, to sebimogu priuĆ£titi samo velika preduzeƱa, zainteresovana za ovakve istraƦivaĆ„keprojekte. ƅak i tada izgleda da je novac mogao biti boĆ e uloƦen. NajubedĆ ivijiargument je da su skoro svi programeri koji su sa C-a (ili nekog drugog proce-duralnog jezika) preĆ£li na C++ (ili neki drugi OOP jezik) znatno poboĆ Ć£ali svojuproduktivnost.

UobiĆ„ajene greĆ£ke pri projektovaƧuPri uvoœeƧu tima u OOP i C++, programeri Ʊe najĆ„eĆ£Ć±e prolaziti kroz niz uobi-Ć„ajenih greĆ£aka. ƅesto je razlog nedostatak struĆ„nih saveta tokom projektovaƧai realizacije prvih projekata, poĆ£to u preduzeƱu joĆ£ nema struƄƧaka za C++, amoƦe postojati otpor prema angaƦovaƧu savetnika. MoƦete prerano steƱi utisakda razumete OOP i krenuti pogreĆ£nim putem. Ono Ć£to je iskusnom programeruoĆ„igledno, moƦe biti izvor velikih nedoumica za poĆ„etnika. Mnoge nevoĆ e semogu izbeƱi ako se za obuku i savetovaƧe angaƦuje spoĆ ni saradnik.

Poglavlje 1: Uvod u objekte 49

MNPC, August 12, 2003 2:08 pm01 MNCP fm 49 str

Sa druge strane, Ć„iƧenica da je lako napraviti ove greĆ£ke u projektovaƧu uka-zuje na osnovni nedostatak C++-a: povratnu kompatibilnost sa C-om (to je,naravno, i Ƨegova osnovna moƱ). Da bi se izveo podvig prevoœeƧa C programa,jezik je morao da napravi neke kompromise, Ć£to je dovelo do nastanka ā€œtamnihstranaā€. Takvi problemi postoje i Ć„esto se javĆ aju tokom uĆ„eƧa C++-a. U ovojkƧizi i narednom tomu (i u drugim kƧigama ā€“ videti dodatak C) pokuĆ£avam darazotkrijem najveƱi broj zamki na koje Ʊete naiƱi radeƱi u C++-u. Uvek morateimati na umu da u bezbednosnom sistemu postoje pukotine.

SaƦetakNamena ovog poglavĆ a je da vas uvede u Ć£iroki skup osobina objektno orijenti-sanog programiraƧa i C++-a, ukĆ uĆ„ujuƱi razliĆ„itosti OOP-a i posebno C++-a,ideje OOP metodologija i vrste zahteva na koje Ʊete u preduzeƱu nailaziti priprelasku na OOP i C++.

OOP i C++ moƦda nisu dobri za sve situacije. VaƦno je proceniti sopstvenepotrebe i da li ih C++ optimalno ispuƧava ili bi bilo boĆ e nastaviti sa nekimdrugim programskim sistemom (ukĆ uĆ„ujuƱi i onaj koji trenutno koristite). Akoznate da Ʊe vaĆ£e potrebe biti sasvim posebne u doglednoj buduƱnosti i imatejasna ograniĆ„eƧa koja C++ moƦda neƱe ispuniti, tada bi trebalo da prouĆ„ite idruga reĆ£eƧa.21 ƅak i ako izaberete C++, razumeƱete kakav izbor ste imali iimaƱete jasnu sliku zaĆ£to ste izabrali taj put.

Znate kako izgledaju proceduralni programi: definicije podataka i pozivifunkcija. Da biste otkrili znaĆ„eƧe takvog programa i stekli sliku modela, moratepratiti pozive funkcija i shvatiti osnovne ideje. Zato su nam potrebni pomoƱninaĆ„ini predstavĆ aƧa reĆ£eƧa proceduralnog programa ā€“ sami po sebi, ovi pro-grami zbuƧuju poĆ£to je izraƦavaƧe reĆ£eƧa viĆ£e orijentisano ka raĆ„unaru negoka problemu.

PoĆ£to C++ dodaje mnoĆ£tvo novih svojstava jeziku C, prirodna pretpostavka jeda Ʊe funkcija main() u C++ programu biti mnogo komplikovanija nego u ekvi-valentnom C programu. Ovo je prijatno iznenaœeƧe: dobro napisan C++ pro-gram, u opĆ£tem sluĆ„aju, mnogo je jednostavniji i razumĆ iviji od ekvivalentnog Cprograma. VideƱete definicije objekata koji predstavĆ aju problem (a ne speci-fiĆ„nosti raĆ„unara) i poruke poslate objektima koje predstavĆ aju aktivnosti. Jednaod pogodnosti objektno orijentisanog programiraƧa jeste lakoƱa razumevaƧadobro projektovanog programa. ObiĆ„no ima i mnogo maƧe koda, poĆ£to ƱeveƱina problema biti reĆ£ena ponovnom upotrebom postojeƱih biblioteka.

21 Posebno preporuƄujem da pogledate Web lokacije jezika Java (http://java.sun.com) i Python (http://www.Python.org).