12. Neka nasa funkcija vrati podatak. Govorili smo vec o funkcijama kao delovima programskog koda, koji vrse jasno definisane zadatke. Videli smo da se funkciji moze poslati parametar, ali komunikacija postaje potpuna tek upotrebom jos jedne osobine funkcije, a to je njena sposobnost da nam izruci povratnu vrednost na mesto u kodu odakle je bila pozvana. Do sada je rezultat rada nase funkcije, a to je odabir poruke, bio dostupan nasoj skripti posredstvom globalne promenljive Poruka. Ovo nije dobro. Neko ce se opravdano upitati: "Zasto smo onda upotrebili taj nacin?" Zato sto je to bio najbezbolniji nacin da uvedemo apstraktni koncept upotrebe funkcija, korak po korak. Ako zelimo da nas kod bude jasan i lak za odrzavanje, globalne promenljive treba upotrebljavati tek ako konkretan problem ne mozemo resiti ni na koji drugi nacin. O ovome cemo govoriti detaljnije na nekom od narednih casova, a sada idemo na primer koji ce nam pokazati upotrebu povratne vrednosti funkcije i osloboditi nas upotrebe globalne promenljive. Napravicemo sledece izmene na nasem skript fajlu sa prethodnog casa: 1. Dodajmo i u skriptu i u funkciju lokalnu string promenljivu Poruka. 2. Izbrisimo sa pocetka fajla rec Globals i deklaraciju globalne string promenljive Poruka. 3. Postavimo kursor na tekst funkcije i pomocu "control+d" otvorimo "Script information", prozor sa dokumentacijom za nasu funkciju. 4. Pomerajmo se tabom dok ne dodjemo na "Function Returns", i tu strelicama na dole ili gore odaberimo "string" kao povratnu vrednost. 5. Pritisnimo enter da sacuvamo promene i zatvorimo prozor. Nas skript fajl bi trebalo sada da izgleda ovako: ;pocetak skript fajla Script PozdravnaPoruka () Var int Cas, string Poruka Let Cas = StringToInt (SysGetTime ("HH")) OdaberiPoruku (Cas) SayString (Poruka) EndScript String Function OdaberiPoruku (int Sat) Var string Poruka If Sat < 18 Then Let Poruka = "Dobar dan" Else Let Poruka = "Dobro vece" EndIf EndFunction Pocetni red funkcije, sada je dobio umesto reci "Void", rec "string" na svom pocetku. Ova rec u zaglavlju funkcije pre nego sto se navede rec Function, predstavlja povratnu vrednost ili tip funkcije. Setite se da smo u vezi funkcije "SysGetTime", koju upotrebljavamo za ocitavanje vremena iz sistemskog casovnika, rekli da se njen upis na nekom mestu u programskom kodu, moze posmatrati kao da se na tom mestu nalazi upisan string koji predstavlja zapis vremena. Za tu funkciju smo jos rekli da joj je povratna vrednost string. Sada je i funkcija koju smo mi definisali, dobila svoju povratnu vrednost tipa string. Tako se i za citavu nasu funkciju moze reci da je string tipa jer joj je povratna vrednost string. Znaci da ce moci biti upotrebljena na mestu gde nam je potreban string poruka sto je njena povratna vrednost. Da bi ovo profunkcionisalo, treba napraviti jos par izmena u kodu koje jos nisu napravljene. 1. Na kraju funkcije, odmah iznad reda EndFunction, upisite sledeci red: Return Poruka 2. Red u skripti kojim se poziva funkcija: OdaberiPoruku (Cas) dopunite da stoji: Let Poruka = OdaberiPoruku (Cas) Sada bi skript fajl trebalo da izgleda ovako: ;pocetak skript fajla Script PozdravnaPoruka () Var int Cas, string Poruka Let Cas = StringToInt (SysGetTime ("HH")) Let Poruka = OdaberiPoruku (Cas) SayString (Poruka) EndScript String Function OdaberiPoruku (int Sat) Var string Poruka If Sat < 18 Then Let Poruka = "Dobar dan" Else Let Poruka = "Dobro vece" EndIf Return Poruka EndFunction Da objasnimo sada ova dva veoma tesno vezana koraka. U funkciji smo upotrebili programsku rec return iza koje smo naveli promenljivu Poruka. Na ovaj nacin smo nasoj funkciji direktno rekli: "Vrati kao svoju povratnu vrednost sadrzaj string promenljive Poruka. Sa druge strane, u nasoj skripti smo u redu: Let Poruka = OdaberiPoruku (Cas) uz pomoc programske reci "Let" i operatora jednako , dodelili lokalnoj string promenljivoj Poruka, povratnu string vrednost nase funkcije koju smo u funkciji naveli iza reci return. Obicnim jezikom receno ovaj red bi glasio: "Neka promenljiva Poruka dobije vrednost koju kao svoju povratnu vrednost isporuci funkcija odaberiPoruku". Kompilirajte skript fajl i isprobajte skriptu. Da li radi kao i prethodno? Cemu onda sva ova premetanja koda? Dosli smo konacno do sledeceg: 1. Potreban nam je u kodu servis ili usluga koju vrsi nasa funkcija. 2. Pozivamo funkciju i saljemo joj podatak koji joj je neophodan za izvrsenje. 3. Dobijamo povratni podatak koji nam je potreban i koristimo ga na mestu na kome smo pozvali funkciju. Najbitnije je uociti da se funkcija sada ponasa kao potpuno nezavistan modul u kodu i da je jedino sto je neophodno znati kako bi se funkcija upotrebila, odnosno pozvala su sledece informacije: 1. Cemu funkcija sluzi. 2. Da li ima parametre i kog tipa su parametri. 3. Da li ima povratnu vrednost i kog tipa je povratna vrednost. Sve Jaws-ove ugradjene funkcije su dokumentovane. To znaci da do ovih podataka mozemo doci upotrebom helpa, ili dokumentacije koja nam je na raspolaganju. Mozete li stvoriti predstavu, koliko se toga moze napraviti kombinovanjem sedam ili osam stotina Jaws-ovih funkcija i neogranicenog broja funkcija koje mozemo sami napraviti ukoliko izmedju vec postojecih ne postoji takva kakva je nama potrebna za savladavanje odredjenog programskog zadatka. Ovu riznicu cemo otvoriti na nekom od sledecih casova, a sada da kazemo jos par reci o novoj programskoj reci "Return" i mogucim tipovima povratne vrednosti funkcije. Rec return, moze se upotrebiti kako u funkcijama, tako i u Skriptama. U okviru jedne skripte ili funkcije moze biti navedena vise puta ukoliko se kod grana na vise mogucnosti. Tako bi nasa funkcija bila takodje ispravna i da je napisana ovako: String Function OdaberiPoruku (int Sat) If Sat < 18 Then Return "Dobar dan" Else Return "Dobro vece" EndIf EndFunction Na mestu gde se pri izvrsenju naidje na rec return, izvrsenje skripte ili funkcije se trenutno prekida i ukoliko je potrebno, odnosno ukoliko je navedena povratna vrednost, funkcija je vraca na mesto odakle je bila pozvana. U skripti, rec return samo prekida izvrsenje skripte jer skripte nemaju povratnu vrednost. Povratna vrednost funkcije, navodi se u zaglavlju funkcije ispred reci Function i moze biti: int string handle object sto smo vec vise puta navodili kao cetiri moguca tipa promenljivih u JSL-u, ili Void sto predstavlja oznaku da funkcija nema povratne vrednosti. Cesto je ova rec u programskom kodu izostavljena, tako da se ako zaglavlje funkcija pocinje neposredno recju Function, podrazumeva da je funkcija tipa "Void", odnosno da nema povratnu vrednost. Sada znate sve o funkcijama, ili gotovo sve. Na narednom casu cemo se upoznati sa jos nekim osobinama parametara. Sve smo blizi trenutku kada ce nam sve mogucnosti JSL programskog jezika biti poznate, i kada cemo moci da se posvetimo tehnickoj strani pisanja skripti. Na raspolaganju su nam razni programski alati koji ce nam zivot uciniti laksim. Do tada, ne zalite truda da biste u potpunosti shvatili funkcije, jer ce one biti osnovni gradivni materijal za vas kod. "Lekcija 13." "Skok na sadrzaj "