Sadržaj
U prošlim smo vodičima radili s klasama, čineći našu aplikaciju modularnijom, čak smo dubinski vidjeli kako izvesti asinkroni rad koristeći CoffeeScript kao jezik, što nam daje veći raspon mogućnosti za rad s njim.Svladavši ove koncepte, vrijeme je da odete korak dalje i upotrijebite ono što znamo za pisanje čišćeg, funkcionalnijeg i naravno snažnijeg koda. Vrijeme je da naučite kako postati moćni korisnici CoffeeScript.
Sada kada znamo koristiti klase u našoj aplikaciji, samo je pitanje vremena kada ćemo naići na probleme s njom. kontekst. Kad smo s jednostavnim funkcijama, vrlo je lako vidjeti koje podatke ova funkcija ima u svom opsegu, ona poznaje globalne varijable, varijable definirane unutar funkcije i bilo koju varijablu koja je definirana u lokalnom opsegu kada je funkcija stvorena.
No, kada su metode vezane za objekte, to postaje malo kompliciranije. Da bismo to ilustrirali, pogledajmo primjer gdje možemo vidjeti ovaj problem, a zatim ćemo vidjeti kako CoffeeScript može nam pomoći:
klasa Sidro za podizanje broda: (doneCallback) -> console.log "Sidro za podizanje." setVel: (speed) -> console.log "Postavljanje brzine na # {speed}" isploviti: -> @levantarAncla @ fixVel 70Pretpostavimo tada prema našem kodu da želimo odmah otploviti, za to radimo sljedeće kako bismo pozvali našu funkciju:
bot = novi Barco bot.zarpar ()Ako pomno pogledamo i prenesemo ovaj kôd u stvarni svijet, možemo shvatiti da se podizanje sidra ne događa odmah, moramo pričekati da se sidro potpuno podigne kako bismo mogli isploviti. Ovaj problem možemo riješiti dodavanjem a uzvratiti poziv i pitajući je li dovršena, pa ćemo znati koliko dugo ova radnja traje i pozvat ćemo našu funkciju kad završi, da vidimo:
liftAnchor: (doneCallback) -> console.log "Podizanje sidra." ako je učinjenoPovratni poziv? setTimeout doneCallback, 1000Kao što vidimo, pozivamo povratni poziv samo ako postoji, na taj način osiguravamo da je ovaj proces dovršen, pa moramo promijeniti svoju funkciju isploviti:
isploviti: -> @levantarAncla -> @ fixVel 70Sada pozivamo funkciju isploviti Nakon podizanja sidra to osigurava da se nećemo pomaknuti dok se sidro ne podigne u potpunosti. Ovo izgleda prilično dobro, sastavit ćemo naš kôd i uključit ćemo generiranu .js datoteku u HTML kako bismo vidjeli odgovor konzole:
Kao što vidimo na slici, dobili smo grešku u kojoj se kaže da funkcija ne postoji. Što se dogodilo? Vrlo je jednostavno, JavaScript je postavio vrijednost Este na način na koji je funkcija pozvana, od poziva bot.zarpar vrijednost Este je povezan s objektom bot, tako da je ovo vezano za globalni kontekst i to nije ono što želimo.
Ono što želimo učiniti je osigurati to Este uvijek je povezan s instancom bot unutar tijela povratnog poziva i od tada imamo sreće CoffeeScript ima funkcionalnost za taj slučaj. Za to ćemo funkciju proglasiti s debela strijela ili debelu strelicu, na taj način funkcija će imati Este povezani s kontekstom u kojem je deklariran, da vidimo kako izgleda naš kod s ovom promjenom:
klasa Sidro za podizanje broda: (doneCallback) -> console.log "Sidro za podizanje." ako je učinjenoPovratni poziv? setTimeout doneCallback, 1000 setVel: (speed) -> console.log "Postavljanje brzine na # {speed}" isploviti: -> @levantarAncla => @fixVel 70 bot = novi Barco bot.zarpar ()Sastavimo našu datoteku i vidimo kako CoffeeScript Povezivanje postignuća s funkcijom debele strelice:
Što to radi CoffeeScript prije proglašenja uzvratiti poziv je postaviti lokalnu varijablu _Este, koji se odnosi na Este, budući da iako uzvratiti poziv je dinamički vezan za vrijednost i dalje učitava lokalni kontekst u kojem je deklariran. Na kraju ćemo izvršiti generiranu datoteku, a zatim vidjeti kako je pogreška riješena:
Nakon što smo već vidjeli kako riješiti problem konteksta u našim aplikacijama pomoću CoffeeScript Vidjet ćemo prilično jednostavnu, ali moćnu tehniku koja će nam pomoći uštedjeti posao. To nije napredna tehnika, ali je logičan način za poboljšanje našeg koda bez puno napora s naše strane.
UspomenaKoja je tehnika memoizacija je spremanje vrijednosti funkcije umjesto ponovnog izračunavanja svaki put kada se funkcija pozove. Sada kad znamo koristiti klase i objekte, to znanje možemo upotrijebiti za njihovu primjenu u sebi CoffeeScript i koristiti dotičnu tehniku.
Postoji mnogo načina za provođenje procesa memoizacija, za slučaj ovog vodiča pojednostavit ćemo stvari. U tom slučaju, ono što ćemo učiniti je da ćemo, kada se zatraže određene informacije, provjeriti jesu li pohranjene, ako je tako, odmah ih vraćamo, inače ih možemo izračunati i spremiti za buduću upotrebu. Ova je tehnika iznimno korisna kada trebamo koristiti složeni algoritam za primanje odgovora ili u slučaju da koristimo sporu mrežu za dobivanje informacija.
Pogledajmo dakle kôd koji ilustrira ovu tehniku:
klasa Rocket getPath: -> @path? = @doMathComplexProcess ()Kako bismo bolje objasnili ovaj dio koda, sastavit ćemo ga da vidimo kako CoffeeScript izgraditi JavaScript da će nas naša tehnika morati spasiti od rada na našem razvoju, da vidimo kako izgleda naš kod:
POVEĆAJTE
Kao što možemo vidjeti u našem kodu, proračun putanje će se izvršiti samo prvi put zahtjev a pohranjena vrijednost od sada će se koristiti. Također smo mogli vidjeti u našem kodu CoffeeScript da smo imali pomoć tercijarnog operatera ?= koji će vrednovati izraz u slučaju da je put null, dodatno ćemo imati pomoć od implicitnog vraćanja funkcija koje će vratiti rezultat izraza, u ovom slučaju vrijednost @putanja je li prethodno pohranjena ili je tek izračunata.No, to nije sve što možemo učiniti s našom novom tehnikom CoffeeScript, čak možemo pohraniti više od jedne vrijednosti pomoću strukture podataka, da vidimo kako to možemo učiniti:
klasa SecurityGateway hasAccess: (guard) -> @access? = {} @access [guard.plate_number]? = verifyCredentials guard.plate_numberOno što ovaj dio koda radi je da se u našem objektu rezultat pohranjuje za svakog čuvara koji je zatražio pristup, potrebno nam je samo nešto jedinstveno da bismo ih mogli identificirati u našem objektu, pa za ovaj zadatak koristimo broj tablice, da vidimo kako se naš kôd prevodi kada ga sastavljamo:
POVEĆAJTE
Važno je napomenuti da se ova tehnika treba koristiti samo s podacima koji se neće promijeniti tijekom izvršavanja našeg programa, u slučaju da jest, preporučujemo implementaciju rješenja na temelju predmemorija.Konačno ćemo vidjeti način prenošenja opcija na funkciju, ovo nije posebna funkcionalnost CoffeeScriptTo je više konvencija koja koristi mnoge karakteristike jezika, koristeći ih u obrascu koji je lako razumljiv i koji je jednako koristan u mnogim situacijama koje se mogu pojaviti.
Kako radi?Ideja iza ovoga je jednostavna, to je imati funkciju koja to prihvaća objekt opcija koji mogu sadržavati asocijativne ključeve za argumente te funkcije. To čini opcije lako razumljivima iz koda u kojem se pozivaju jer postoje uvijene zagrade za identifikaciju što svaka vrijednost radi. Time se također smanjuje gnjavaža pri praćenju argumenata, kao i njihovom redoslijedu, budući da objektni ključevi ne ovise o tome i mogu se izostaviti ako nisu potrebni.
Za provedbu mogućnosti objekata prvo ćemo koristiti neobavezne argumente da zadano postavimo prazan argument. Na ovaj način, prilikom upućivanja poziva, možemo izostaviti opcije u slučaju da vrijednosti nisu potrebne:
launchNave = (name, options = {}) -> return if options.drift dry take off ()Sada ćemo koristiti tercijarni operator ?= za popunjavanje vrijednosti opcija za koje želimo da imaju posebnu zadanu vrijednost:
launchNave = (name, options = {}) -> options.count? = 10 console.log "# {i}…" za i u [options.count… 0] return if options.drift dry take off ()Definiramo zadnju vrijednost i koristimo operator ? u slučaju da se koristi na jednom mjestu:
launchSave = (name, options = {}) -> checkFuel (options.waitComb? 100) options.count? = 10 console.log "# {i}…" za i u [options.count… 0] return if options. suho polijetanje ()Konačno, koristimo dopuštajuću sintaksu datoteke CoffeeScript za slanje opcija našoj funkciji bez zagrada, dajući nam prilično jednostavan i prirodan poziv:
lansirni brod "Millennium Falcon", DryGear: istina, odbrojavanje: 15Za kraj ćemo sastaviti našu datoteku i vidjeti izlaz našeg koda u JavaScript:
POVEĆAJTE
S posljednjim smo završili ovaj vodič, gdje smo mogli naučiti ne samo napredne načine korištenja CoffeeScript nego radije tehnikama koje će nam pomoći u pisanju boljeg koda, da stalnom upotrebom i istraživanjem možemo postati bolji programeri koji koriste najbolje prakse za razvoj aplikacija.