Uzlabota CoffeeScript izmantošana

Satura rādītājs
Iepriekšējās apmācībās mēs strādājām ar klasēm, tādējādi padarot mūsu lietojumprogrammu modulārāku, mēs pat padziļināti redzējām, kā veikt asinhronu darbu, izmantojot CoffeeScript kā valoda, tādējādi dodot mums plašākas iespējas strādāt ar to.
Apgūstot šos jēdzienus, ir pienācis laiks spert soli tālāk un izmantot to, ko mēs zinām, lai rakstītu tīrāku, funkcionālāku un, protams, jaudīgāku kodu. Ir pienācis laiks iemācīties kļūt par enerģijas lietotājiem CoffeeScript.
Tagad, kad mēs zinām, kā lietotnē izmantot klases, ir tikai laika jautājums, pirms mēs ar to saskaramies. kontekstā. Ja izmantojam vienkāršas funkcijas, ir diezgan viegli redzēt, kādi dati šai funkcijai ir tās darbības jomā, tā zina globālos mainīgos, funkcijā definētos mainīgos un visus mainīgos, kas tika definēti vietējā tvērumā, kad funkcija tika izveidota.
Bet, kad metodes ir saistītas ar objektiem, tas kļūst nedaudz sarežģītāk. Lai to ilustrētu, aplūkosim piemēru, kur mēs varam redzēt šo problēmu, un tad mēs redzēsim, kā CoffeeScript var mums palīdzēt:
 klase Kuģa pacelšanas enkurs: (doneCallback) -> console.log "Pacelšanas enkurs." setVel: (ātrums) -> console.log "Ātruma iestatīšana uz # {speed}" izlido: -> @levantarAncla @ fixVel 70
Pieņemsim, ka saskaņā ar mūsu kodu mēs vēlamies nekavējoties doties ceļā, lai to izdarītu, mēs rīkojamies šādi:
 bot = jauns Barco bot.zarpar ()
Ja mēs rūpīgi ieskatāmies un pārnesam šo kodu uz reālo pasauli, mēs varam saprast, ka enkura pacelšana nenotiek uzreiz, mums jāgaida, līdz enkurs būs pilnībā pacelts, lai varētu sākt burāt. Mēs varam atrisināt šo problēmu, pievienojot a atzvani un jautājot, vai tā ir pabeigta, tāpēc mēs zināsim, cik ilgi šī darbība ilgst, un zvanīsim mūsu funkcijai, kad tā būs pabeigta, redzēsim:
 liftAnchor: (doneCallback) -> console.log "Pacelšanas enkurs". ja izdarītsAtsauc? setTimeout doneCallback, 1000
Kā redzam, mēs atsaucamies tikai uz atzvanīšanu, ja tas pastāv, tādā veidā mēs pārliecināmies, ka šis process ir pabeigts, un tāpēc mums ir jāmaina sava funkcija izkāpt:
 izlieciet buras: -> @levantarAncla -> @ fixVel 70
Tagad mēs izmantojam funkciju izkāpt Pēc enkura pacelšanas tas nodrošina, ka mēs nekustēsimies, kamēr enkurs nebūs pilnībā pacelts. Tas izskatās diezgan labi, mēs apkoposim savu kodu un iekļausim ģenerēto .js failu HTML, lai redzētu konsoles atbildi:

Kā redzam attēlā, mēs esam ieguvuši kļūdu, kur teikts, ka funkcija neeksistē. Kas notika? Tas ir ļoti vienkārši, JavaScript ir iestatījis vērtību Este veids, kādā funkcija tika izsaukta, kopš zvana bot.zarpar vērtība Este ir saistīts ar objektu bot, tāpēc tas ir saistīts ar globālo kontekstu, un tas nav tas, ko mēs vēlamies.
Tas, ko mēs vēlamies darīt, ir pārliecināties Este vienmēr ir saistīta ar gadījumu bot atzvanīšanas korpusa iekšpusē, un mums ir paveicies, jo CoffeeScript tam ir funkcionalitāte šajā gadījumā. Šim nolūkam mēs deklarēsim funkciju ar resna bulta vai bieza bulta, tādā veidā funkcijai būs Este saistībā ar kontekstu, kurā tas tika deklarēts, redzēsim, kā izskatās mūsu kods ar šīm izmaiņām:
 klase Kuģa pacelšanas enkurs: (doneCallback) -> console.log "Pacelšanas enkurs." ja izdarītsAtsauc? setTimeout doneCallback, 1000 setVel: (ātrums) -> console.log "Ātruma iestatīšana uz # {speed}" iestatiet bura: -> @levantarAncla => @fixVel 70 bot = new Barco bot.zarpar ()
Apkoposim savu failu un redzēsim, kā CoffeeScript Sasniegumu saistīšana ar biezas bultiņas funkcionalitāti:

Ko tas dara CoffeeScript pirms pasludināt atzvani ir iestatīt vietējo mainīgo _Este, kas attiecas uz Este, jo, lai gan atzvani ir dinamiski piesaistīta vērtībai, joprojām ielādējot vietējo kontekstu, kurā tā tika deklarēta. Visbeidzot, mēs izpildīsim mūsu ģenerēto failu un pēc tam redzēsim, kā kļūda tika atrisināta:

Jau redzot, kā mūsu lietojumprogrammās atrisināt konteksta problēmu ar CoffeeScript Mēs redzēsim diezgan vienkāršu, bet spēcīgu paņēmienu, kas palīdzēs ietaupīt darbu. Tā nav uzlabota tehnika, taču tas ir loģisks veids, kā uzlabot mūsu kodu bez lielām pūlēm.
MemoizācijaKāda tehnika iegaumēšana ir saglabāt funkcijas vērtības, nevis tās pārrēķināt katru reizi, kad funkcija tiek izsaukta. Tagad, kad mēs zinām, kā izmantot klases un objektus, mēs varam izmantot šīs zināšanas, lai tās piemērotu sevī CoffeeScript un izmantot attiecīgo tehniku.
Ir daudz veidu, kā veikt procesu iegaumēšana, šīs apmācības gadījumā mēs padarīsim lietas vienkāršas. Šim nolūkam mēs darīsim to, ka, pieprasot noteiktu informāciju, mēs pārbaudīsim, vai tā ir saglabāta, ja tā, mēs to nekavējoties atdodam, pretējā gadījumā mēs varam to aprēķināt un saglabāt turpmākai lietošanai. Šī metode ir ārkārtīgi noderīga, ja atbildes saņemšanai jāizmanto sarežģīts algoritms vai ja informācijas iegūšanai izmantojam lēnu tīklu.
Apskatīsim kodu, lai ilustrētu šo tehniku:
 klases raķešu getPath: -> @path? = @doMathComplexProcess ()
Lai labāk izskaidrotu šo koda daļu, mēs to apkoposim, lai redzētu, kā CoffeeScript veidot JavaScript ka mūsu tehnikai būs jāglābj mūsu darbs mūsu izstrādē, redzēsim, kā izskatās mūsu kods:

PALIELINĀT

Kā redzams mūsu kodā, trajektorijas aprēķins tiks veikts tikai pirmo reizi pieprasījumu un saglabātā vērtība tiks izmantota no šī brīža. Mēs varētu redzēt arī mūsu kodā CoffeeScript ka mums palīdzēja terciārais operators ?= kas novērtēs izteiksmi gadījumā, ja ceļš ir nulle, turklāt mums būs palīdzība no netiešas funkciju atgriešanas, kas atgriezīs izteiksmes rezultātu, šajā gadījumā vērtību @trajektorija vai tas ir iepriekš uzglabāts vai tikko aprēķināts.
Bet tas nav viss, ko mēs varam darīt ar mūsu jauno tehniku CoffeeScript, mēs pat varam saglabāt vairāk nekā vienu vērtību, izmantojot datu struktūru. Apskatīsim, kā to izdarīt:
 klases SecurityGateway hasAccess: (sargs) -> @piekļuve? = {} @piekļuve [sargaplates_numurs]? = = verifikācijas akreditācijas dati
Šī koda daļa ir tāda, ka mūsu objektā rezultāts tiek saglabāts katram sargam, kurš ir pieprasījis piekļuvi, mums būtu nepieciešams tikai kaut kas unikāls, lai mēs varētu tos identificēt mūsu objektā, tāpēc šim uzdevumam mēs izmantojam numura zīmi. kā tiek tulkots mūsu kods, kad to apkopojam:

PALIELINĀT

Ir svarīgi pieminēt, ka šo paņēmienu drīkst izmantot tikai ar informāciju, kas nemainīsies mūsu programmas izpildes laikā, ja tā ir, mēs iesakām ieviest risinājumu, kas balstīts uz kešatmiņa.
Visbeidzot, mēs redzēsim veidu, kā opcijas nodot funkcijai, tā nav īpaša funkcionalitāte CoffeeScriptTā drīzāk ir konvencija, kurā tiek izmantotas daudzas valodas iezīmes, izmantojot tās pēc modeļa, kas ir viegli saprotams un ir tikpat noderīgs daudzās iespējamās situācijās.
Kā tas darbojas?Tā ideja ir vienkārša, tai jābūt funkcijai, kas to pieņem opciju objekts kas var saturēt asociācijas atslēgas šīs funkcijas argumentiem. Tādējādi opcijas ir viegli saprotamas no koda, kurā tās tiek izsauktas, jo ir cirtaini skavas, lai noteiktu, ko katra vērtība dara. Tas arī samazina problēmu sekot līdzi argumentiem, kā arī to secībai, jo objektu atslēgas nav no tā atkarīgas un var tikt izlaistas, ja tas nav nepieciešams.
Lai īstenotu opciju objekti vispirms mēs izmantosim izvēles argumentus, lai noklusējuma iestatītu tukšu argumentu. Tādā veidā, veicot zvanu, mēs varam izlaist opcijas, ja vērtības nav vajadzīgas:
 launchNave = (nosaukums, opcijas = {}) -> atgriezties, ja options.drift sausā pacelšanās ()
Tagad mēs izmantosim terciāro operatoru ?= lai aizpildītu to opciju vērtības, kurām mēs vēlamies īpašu noklusējuma vērtību:
 launchNave = (nosaukums, opcijas = {}) -> options.count? = 10 console.log "# {i}…" i sadaļā [options.count… 0] atgriežas, ja options.drift dry take off ()
Mēs definējam pēdējo vērtību un izmantojam operatoru ? ja to lieto vienā vietā:
 launchSave = (vārds, opcijas = {}) -> checkFuel (options.waitComb? 100) options.count? = 10 console.log "# {i}…" i sadaļā [options.count… 0] return if options. sausā pacelšanās ()
Visbeidzot, mēs izmantojam visatļautās sintakses priekšrocības CoffeeScript nosūtīt opcijas mūsu funkcijai bez iekavām, sniedzot mums diezgan vienkāršu un dabisku zvanu:
 palaišanas kuģis "Millennium Falcon", DryGear: true, atpakaļskaitīšana: 15
Lai pabeigtu, mēs apkoposim savu failu un redzēsim mūsu koda izvadi JavaScript:

PALIELINĀT

Ar pēdējo mēs pabeidzām šo apmācību, kurā mēs varējām apgūt ne tikai uzlabotus lietošanas veidus CoffeeScript bet drīzāk metodes, kas palīdzēs mums uzrakstīt labāku kodu, ka, pastāvīgi lietojot un pētot, mēs varam kļūt par labākiem izstrādātājiem, kuri izmanto labāko praksi lietojumprogrammu izstrādē.
wave wave wave wave wave