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 70Stel 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, 1000Zoals 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 70Wat 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:
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:
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
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_numberWat 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
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: 15Om te eindigen gaan we ons bestand compileren en de uitvoer van onze code bekijken in JavaScript:
VERGROTEN