Geavanceerd gebruik van CoffeeScript

Inhoudsopgave
In eerdere tutorials werkten we met klassen, waardoor onze applicatie meer modulair werd, we zagen zelfs diepgaand hoe we asynchroon werk konden uitvoeren met KoffieScript als een taal, waardoor we een groter scala aan opties hebben om ermee te werken.
Nu we deze concepten onder de knie hebben, is het tijd om een ​​stap verder te gaan en wat we weten te gebruiken om schonere, functionelere en natuurlijk krachtigere code te schrijven. Het is tijd om te leren hoe u krachtige gebruikers kunt worden van KoffieScript.
Nu we weten hoe we klassen in onze applicatie moeten gebruiken, is het slechts een kwestie van tijd voordat we er problemen mee krijgen. context. Als we met eenvoudige functies zijn, is het vrij eenvoudig om te zien welke gegevens deze functie in zijn bereik heeft, het kent globale variabelen, variabelen die zijn gedefinieerd in de functie en elke variabele die in het lokale bereik is gedefinieerd toen de functie werd gemaakt.
Maar wanneer de methoden aan objecten zijn gebonden, wordt dit een beetje ingewikkelder. Om dit te illustreren, laten we een voorbeeld bekijken waarin we dit probleem kunnen zien en dan zullen we zien hoe KoffieScript kan ons helpen:
 class Scheepsliftanker: (doneCallback) -> console.log "Hijsanker." setVel: (speed) -> console.log "Snelheid instellen op # {speed}" zeilen: -> @levantarAncla @ fixVel 70
Stel dan volgens onze code dat we direct willen varen, hiervoor doen we het volgende om onze functie aan te roepen:
 bot = nieuwe Barco bot.zarpar ()
Als we goed kijken en deze code overbrengen naar de echte wereld, kunnen we ons realiseren dat het optillen van het anker niet meteen gebeurt, we moeten wachten tot het anker volledig is gehesen om te kunnen vertrekken. We kunnen dit probleem oplossen door a . toe te voegen Bel terug en vragen of het is voltooid, zodat we weten hoe lang deze actie duurt en we zullen onze functie aanroepen als het klaar is, laten we eens kijken:
 liftAnchor: (doneCallback) -> console.log "Hijsanker." indien gedaanTerugbellen? setTimeout gedaanTerugbellen, 1000
Zoals we kunnen zien, roepen we de callback alleen op als deze bestaat, op deze manier zorgen we ervoor dat dit proces wordt voltooid en daarom moeten we onze functie aanpassen uitvaren:
 vaar uit: -> @levantarAncla -> @ fixVel 70
Wat we nu doen, is de functie aanroepen uitvaren Na het hijsen van het anker zorgt dit ervoor dat we pas in beweging komen als het anker volledig is gehesen. Dit ziet er redelijk goed uit, we gaan onze code compileren en we gaan het gegenereerde .js-bestand in een HTML opnemen om het antwoord per console te zien:

Zoals we in de afbeelding zien, hebben we een foutmelding gekregen waarin staat dat de functie niet bestaat. Wat is er gebeurd? Het is erg makkelijk, JavaScript heeft de waarde ingesteld Este in de manier waarop de functie is aangeroepen, sinds bij het aanroepen van bot.zarpar de waarde Este is gekoppeld aan het object bot, dus dit is gebonden aan de mondiale context en dit is niet wat we willen.
Wat we willen doen is ervoor zorgen dat Este is altijd gekoppeld aan de instantie van bot in het lichaam van de callback en we hebben geluk, sinds KoffieScript het heeft een functionaliteit voor dat geval. Hiervoor declareren we de functie met dikke pijl of dikke pijl, op deze manier heeft de functie de Este gekoppeld aan de context waarin het is gedeclareerd, laten we eens kijken hoe onze code eruit ziet met deze wijziging:
 class Scheepsliftanker: (doneCallback) -> console.log "Hijsanker." indien gedaanTerugbellen? setTimeout doneCallback, 1000 setVel: (speed) -> console.log "Snelheid instellen op # {speed}" zet koers: -> @levantarAncla => @fixVel 70 bot = nieuwe Barco bot.zarpar ()
Laten we ons bestand samenstellen en kijken hoe KoffieScript Prestatiebinding met dikke pijlfunctionaliteit:

Wat het doet KoffieScript voor het declareren van de Bel terug is om een ​​lokale variabele in te stellen _Este, die verwijst naar Este, want hoewel de Bel terug is dynamisch gebonden aan de waarde laadt nog steeds de lokale context waarin deze is gedeclareerd. Ten slotte gaan we ons gegenereerde bestand uitvoeren en kijken hoe de fout is opgelost:

We hebben al gezien hoe we het contextprobleem in onze applicaties kunnen oplossen met KoffieScript We gaan een vrij eenvoudige maar krachtige techniek zien om ons te helpen werk te besparen. Het is geen geavanceerde techniek, maar het is een logische manier om zonder veel moeite onze code te verbeteren.
MemoriserenWat de techniek van? memoriseren is om waarden van een functie op te slaan in plaats van ze elke keer dat de functie wordt aangeroepen opnieuw te berekenen. Nu we weten hoe we klassen en objecten moeten gebruiken, kunnen we deze kennis gebruiken om ze binnen KoffieScript en gebruik de betreffende techniek.
Er zijn veel manieren om het proces van memoriseren, voor het geval van deze tutorial zullen we het simpel houden. Wat we hiervoor zullen doen, is dat wanneer er om bepaalde informatie wordt gevraagd, we zullen verifiëren of deze is opgeslagen, als dat zo is, zullen we deze onmiddellijk retourneren, anders kunnen we deze berekenen en opslaan voor toekomstig gebruik. Deze techniek is uitermate handig wanneer we een complex algoritme moeten gebruiken om een ​​reactie te ontvangen of in het geval dat we een traag netwerk gebruiken om informatie te verkrijgen.
Laten we dus naar de code kijken om deze techniek te illustreren:
 class Rocket getPath: -> @path? = @doMathComplexProcess ()
Om dit deel van de code beter uit te leggen, gaan we het compileren om te zien hoe KoffieScript bouw de JavaScript dat onze techniek ons ​​werk zal moeten besparen bij onze ontwikkeling, laten we eens kijken hoe onze code eruit ziet:

VERGROTEN

Zoals we in onze code kunnen zien, wordt de berekening van het traject alleen uitgevoerd de eerste keer dat de verzoek en de opgeslagen waarde wordt vanaf nu gebruikt. We konden ook zien in onze code KoffieScript dat we de hulp hadden van de tertiaire operator ?= die de uitdrukking zal evalueren in het geval dat het pad null is, bovendien hebben we hulp van de impliciete terugkeer van de functies die het resultaat van de uitdrukking zullen retourneren, in dit geval de waarde van @traject of het eerder is opgeslagen of zojuist is berekend.
Maar dit is niet alles wat we kunnen doen met onze nieuwe techniek in KoffieScript, we kunnen zelfs meer dan één waarde opslaan met behulp van een gegevensstructuur, laten we eens kijken hoe we dat kunnen doen:
 class SecurityGateway hasAccess: (guard) -> @access? = {} @access [guard.plate_number]? = verifieerCredentials guard.plate_number
Wat dit deel van de code doet, is dat in ons object het resultaat wordt opgeslagen voor elke bewaker die toegang heeft gevraagd, we zouden alleen iets unieks nodig hebben om ze in ons object te kunnen identificeren, dus we gebruiken het plaatnummer voor deze taak, laten we eens kijken hoe onze code wordt vertaald wanneer we deze compileren:

VERGROTEN

Het is belangrijk om te vermelden dat deze techniek alleen mag worden gebruikt met informatie die niet zal veranderen tijdens de uitvoering van ons programma, in het geval dat dit het geval is, raden we aan een oplossing te implementeren op basis van cache.
Ten slotte zullen we een manier zien om opties door te geven aan een functie, dit is geen speciale functionaliteit van KoffieScriptHet is meer een conventie die gebruik maakt van veel van de kenmerken van de taal, in een patroon dat gemakkelijk te begrijpen is en dat net zo nuttig is in veel situaties die zich kunnen voordoen.
Hoe werkt het?Het idee hierachter is simpel, het is om een ​​functie te hebben die dit accepteert opties object die associatieve sleutels kan bevatten voor de argumenten van die functie. Dit maakt de opties gemakkelijk te begrijpen vanuit de code waarin ze worden aangeroepen, omdat er accolades zijn om aan te geven wat elke waarde doet. Dit vermindert ook de moeite om de argumenten en hun volgorde in de gaten te houden, omdat de objectsleutels hiervan niet afhankelijk zijn en kunnen worden weggelaten als ze niet nodig zijn.
Om de te implementeren opties objecten eerst gaan we optionele argumenten gebruiken om standaard een leeg argument te gebruiken. Op deze manier kunnen we bij het maken van de oproep de opties weglaten in het geval dat de waarden niet nodig zijn:
 launchNave = (naam, options = {}) -> return if options.drift dry take off ()
Nu gebruiken we de tertiaire operator ?= om de waarden van de opties in te vullen waarvan we een speciale standaardwaarde willen hebben:
 launchNave = (naam, options = {}) -> options.count? = 10 console.log "# {i}…" for i in [options.count… 0] return if options.drift dry take off ()
We definiëren een laatste waarde en we gebruiken de operator ? in het geval dat het op één plaats wordt gebruikt:
 launchSave = (name, options = {}) -> checkFuel (options.waitComb? 100) options.count? = 10 console.log "# {i}…" for i in [options.count… 0] return if options. droog opstijgen ()
Ten slotte maken we gebruik van de permissieve syntaxis van KoffieScript om de opties naar onze functie te sturen zonder de haakjes, wat ons een vrij eenvoudige en natuurlijke oproep geeft:
 lanceringSchip "Millennium Falcon", DryGear: true, countdown: 15
Om te eindigen gaan we ons bestand compileren en de uitvoer van onze code bekijken in JavaScript:

VERGROTEN

Met de laatste hebben we deze tutorial voltooid, waar we niet alleen geavanceerde manieren konden leren om te gebruiken KoffieScript maar eerder technieken die ons helpen betere code te schrijven, die we met constant gebruik en onderzoek betere ontwikkelaars kunnen worden die de best practices gebruiken voor het ontwikkelen van applicaties.
wave wave wave wave wave