App Inventor II - Procedure in funkcije

App Inventor II - Procedure in funkcije

Avtor: Milan Brumec (prevod in priredba), Wolber. David..(avtorji knjige)

Učni cilji: Učni cilji: Poznam osnovne programske konstrukte in jih smiselno uporabljam: prireditveni stavek in spremenljivke, Odločitveni (pogojni) stavek, Seznam, Zanka, Funkcija (procedura)

Uvod

Programski jeziki kot je App Inventor nudijo osnovni nabor vgrajenih funkcij – v našem primeru so to bloki. Programski jeziki prav tako ponujajo možnost da jim sami dodajamo funkcije (bloke). V App Inventorju to naredimo z definicijo procedure (neki sekvenci blokov damo ime), ki jo aplikacija kliče natanko tako kot kliče že sicer predefinirane bloke.

V nekaterih programskih jezikih take sekvence navodil imenujejo funkcije ali podprogrami. V App Inventorju jih imenujemo procedure. Procedura je torej sekvenca blokov, ki ima svoje ime in jo lahko v aplikaciji kličemo od koder koli.

Slika 1 kaže primer procedure, ki oceni razdaljo v miljah med dvema podanima GPS koordinatama.

(slika 21_1.png)
Slika 1: Procedura za izračun razdalje med dvema točkama.

Naj vas še ne skrbi preveč vsebina te procedure; za zdaj morate vedeti le to, da vam lahko procedura kot je ta, razširi programski jezik s katerim načrtujete in izdelujete program.

Odstranjevanje redundanc

Bloki na sliki 2 so iz aplikacije Beležka. Dobro si oglej bloke in ugotovi ali so v njih redundance!

(slika 21_2.png)
Slika 2: Redundance v aplikaciji Beležka

Redundantni bloki so tisti, ki vsebujejo for each bloke (natančno for each in ugnezdene bloke ter set NotesLabel.Text to pod njlim). V vseh treh for each pojavitvah, je delo, ki ga opravljajo bloki, prikazovanje seznama z beležkami. V tej aplikaciji se ti bloki pojavijo v treh dogodkih in sicer ko je dodan element, ko je element odstranjen in ko je seznam naložen pri zagonu aplikacije. Ko izkušen programer opazi tako redundanco se, še preden najprej kopira in lepi take bloke odloči, da redundanco zapiše kot proceduro. To naredi program razumljivejši, kasneje pa tudi lažje spreminjanje.

Definiranje procedure

Naredimo proceduro ki bo opravila delo redundantne kode blokov iz slike 2. V App Inventorju definiramo procedure podobno kot definiramo spremenljivke. Iz Procedure drawer lahko izvlečemo to procedure blok ali pa to procedure result blok. Slednje uporabite, če vam procedura nekaj izračuna in vrne rezultat.

Ko izvlečemo ven to procedure blok mu lahko spremenimo ime tako, da kliknemo na besedo »procedure« in vnesemo novo ime. Ker redundantni bloki, ki jih želimo v proceduri prikazujejo seznam, mu damo ime displayList kot je prikazano na sliki 3.

(slika 21_3.png)
Slika 3: Klikni na »procedure« da ji spremeniš ime

Naslednja stopnja je dodajanje bokov znotraj procedure. V našem primeru bomo uporabili bloke, ki že obstajajo, torej bomo iz tistih treh dogodkov prenesli redundantne bloke v našo (displayList) proceduro kot kaže slika 4.

(slika 21_4.png)
Slika 4: Redundantna koda v proceduri displayList

Definiranje procedure

Procedure opravljajo neko operacijo samo če jo pokličemo da to opravi. Ustvarili smo torej proceduro nismo pa je še klicali. Da pokličemo proceduro pomeni, da se sklicujemo nanjo oz. da se izvede. Ko definiramo proceduro se v App Inventorju v predal procedur (Procedures draver) avtomatsko doda tudi blok za klicanje te procedure, kot kaže slika 5.

(slika 21_5n.png)
Slika 5: Blok za klicanje se avtomatsko ustvari ob definiranju procedure

Verjetno ste v App Inventorju že uporabljali predefinirane funkcije kot so Ball.MoveTo in Texting.SendMessage. Ko definirate proceduro v bistvu ustvarite svoj novi blok in hkrati širite programski jezik App inventorja. Z uporabo novega call bloka lahko kličete to ustvarjeno proceduro.

V našem primeru aplikacije Beležka bomo uporabili tri bloke call displayList in jih nadomestili s redundantnimi bloki v treh dogodkih. Na primer dogodek ListPicker1.AfterPicking (za brisanje zapiska) bo spremenjena kot je na sliki 6

(slika 21_6.png)
Slika 6: Uporaba bloka call displayList za klicanje blokov ki so sedaj v proceduri

Dodajanje parametrov v proceduro/I

Da bi bile procedure bolj splošno uporabne App Inventor in ostali jeziki nudijo mehanizem imenovan parametri. Parametri so podatki, ki jih procedura potrebuje da opravi svojo nalogo.

Parametre procedure definiramo s klikom na modro ikono v levem zgornjem kotu definicije procedure. Za proceduro displayList bomo definirali parameter imenovan »list« kot je prikazano na sliki 7.

(slika 21_7.png)
Slika 7: Procedura zdaj sprejme seznam kot parameter.

Dodajanje parametrov v proceduro/II

Čeprav ima procedura definiran parameter za seznam se blok še vedno sklicuje neposredno na seznam z imenom »notes«. Ker bi radi, da bi procedura uporabljala seznam, ki ga dobi preko parametra, moramo spremeniti sklic na global notes z sklicem na list kot kaže slika 8.

(slika 21_8.png)
Slika 8: for each bo sedaj uporabila seznam ki ga dobi s parametrom.

Dodajanje parametrov v proceduro/III

Nova verzija procedure je bolj splošna. Klic (call displayList) za prikaz je lahko poslan za katerikoli seznam in ta bo prikazan. Ko dodate parameter v proceduro bo App Inventor avtomatsko dodal pripadajočo vtičnico v call blok. Ko je torej parameter seznam dodan v displayList, call blok izgleda tako kot sliki 9.

(slika 21_9n.png)
Slika 9: Call displayList sedaj zahteva da določite kateri seznam naj prikaže.

Parameter list v definiciji procedure imenujemo fomalni parameter. Odgovarjajoča vtičnica v call bloku pa se imenuje aktualni parameter. Ko kličemo proceduro v aplikaciji moramo za vsak formalni parameter podati aktualni parameter procedure. To storimo tako, da zapolnimo vse vtičnice v call bloku.

Dodajanje parametrov v proceduro/IIII

V primeru aplikacije Beležka (Note Taker) za aktualni parameter vnesemo referenco get global notes. Slika 10 kaže, kako zgleda dogodek ListPicker.AfterSelection po spremembi.

(slika 21_10.png)
Slika 10: Klicanje procedure displayList z aktualnim parametrom notes.

Ko je displayList poklican je seznam notes poslan preko procedure v parameter list. Programski števec izvaja bloke v proceduri, ki se sklicuje na parameter list, v bistvu pa dela s spremenljivko notes.

Ker imamo parameter, lahko proceduro displayList uporabimo za prikaz katerega koli seznama, ne samo notes. Če bi v aplikaciji (Note Taker) imeli tudi seznam uporabnikov, in bi ga želeli prikazat, bi poklicali displayList in ji poslali seznam uporabnikov (userList) kot je prikazano na sliki 11.

(slika 21_11n.png)
Slika 11: Proceduro displayList lahko sedaj uporabimo za prikaz katerega koli seznama, ne samo notes.

Vračanje rezultata iz procedure/I

Glede procedure displayList obstaja še eno vprašanje glede njene splošne uporabnosti? Lahko uganeš katero? Kot je bilo pravkar zapisano lahko prikaže kateri koli seznam, ampak ga prikaže vedno v enakem oknu (NotesLabel). Kaj če bi želeli seznam prikazati na drugačen način (na primer da bi za prikaz seznama uporabnikov imeli drugo okno)?

Ena od rešitev je, da spremenimo koncept procedure in namesto da prikaže seznam v nekem oknu, le tega spemeni v besedilni objekt, ki ga lahko prikažeš kjerkoli. To lahko storimo tako, da namesto bloka procedure uporabimo blok procedure result kot kaže slika 12.

(slika 21_12n.png)
Slika 12: Procedure result blok.

Vidite da, če blok procedure primerjamo s procedure result ima le ta še dodatno vtičnico na dnu. V to vtičnico damo spremenljivko in ta jo vrne klicatelju. Torej podobno kot klic pošlje podatke v proceduro s parametrom, lahko procedura vrne podatke z vrnjeno vrednostjo.

Vračanje rezultata iz procedure/II

Slika 13 kaže predelano verzijo prejšnjega postopka; tokrat z uporabo bloka procedure result. Glede na to, da procedura sedaj opravlja drugo nalogo, spremenimo tudi njeno ime iz displayList v listToText.

(slika 21_13.png)
Slika 13: Procedura listToText vrne besedilni objekt ki ga klicatelj lahko vstavi v katerokoli okno.

V bloku na sliki 13 je lokalna spremenljivka text definirana, da se v njej shranjujejo podatki ko procedura iterira po elementih v seznamu. text je inicializirana kot lokalna in ne globalna spremenljivka ker se uporablja le v proceduri.

Spremenljivka text nadomešča prejšnjo komponento NotesLabel, ki je bila uporabljena v prejšnji verziji procedure diplayList. Kos se for each zanka zaključi, vsebuje spremenljivka text elemente seznama ločene z znakom za novo vrstico \n (n.pr. "element1\nelement2\nelement3"). spremenljivka text je nato vstavljena v vtičnico za vračanje vrednosti.

Vračanje rezultata iz procedure/III

Ko je procedure result definirana zgleda odgovarjajoči blok malo drugače kot blok za procedure. Primerjaj klic procedute listToText s klicem procedure diplayList.

(slika 21_14.png)
Slika 14: Klic na desni vrne vrednost, zato mora biti v nekaj vtaknjena.

Razlika je ta, da ima klic listToText vtikač na levi strani. To je zato, ker ko je klic aktiviran, procedura opravi svoje delo in vrne vrednost call bloku. Ta vrnjena vrednost mora biti nekam priključena.

V primeru Beležke (Note Taker aplikacije) lahko vsi trije dogodki, ki potrebujejo prikaz seznama, uporabijo (kličejo) to proceduro kot kaže slika 15.

(slika 21_15.png)
Slika 15: Pretvorba seznama notes v besedilo in nato prikaz v NotesLabel.

Pomembno tukaj je to, da ker je procedura povsem splošna in se ne nanaša na noben seznam ali prikaz jo lahko drugi del aplikacije uporabi za prikaz kateregakoli seznama na kakršen koli način kot kaže slika 16.

(slika 21_16.png)
Slika 16: Procedura ni več vezana na določen prikaz.

Ponovna uporaba blokov v drugih aplikacijah

Ponovna uporaba blokov (procedur) ni nujno da je omejena na samo eno aplikacijo. Veliko je procedur, kot na primer listToText, ki jo lahko uporabimo v prav vsaki aplikaciji. V praksi si organizacije in programerske skupnosti ustvarjajo knjižnice procedur, ki so v njihovih interesih.

Tipično programski jeziki omogočajo možnost uvoza (import) s katerim lahko iz knjižnice vključimo kodo v vsako aplikacijo. App Inventor še nima te možnosti. Edini način da prenašamo procedure je ta, da si zgradimo knjižnico aplikacij, ter novo aplikacijo začnemo delati iz kopije ene od teh.

0%
0%