Grote collecties in AS3 opvragen (en veroveren) met Realaxy Editor

Goed nieuws, allemaal. Iedereen die met arrays en vectoren werkt - dus, alle ontwikkelaars - zal van de nieuwe mogelijkheden genieten: sinds eind augustus 2011 is de build van Flash, Realaxy ActionScript Editor (RASE) de nieuwe ondersteunt collecties AS3 taaluitbreiding. In deze post laten we je zien wat het kan doen.

Een verzameling is een algemene term die grofweg betekent: een reeks gelijksoortige getypte objecten die zijn gegroepeerd ?. Een verzameling in ActionScript 3.0 bouwen kan worden gedaan met behulp van arrays, vectoren, woordenboeken of objecten; ze hebben elk een aantal van de ingrediënten voor een perfect concept. Als je echter een basiskennis hebt van moderne en trendy talen als Scala, Groovy of Ruby, zul je zeker het ontbreken van een functionele aanpak voelen in de pure AS3-manier van verwerken Collecties.


The Collections Language

Nou, laten we het introduceren collecties AS3-taaluitbreiding die beschikbaar is in RASE Beta 10, build 8177+.

Een complete woordenschat van methoden aangevuld met voorbeelden is hier beschikbaar: een voor lijsten en een andere voor kaarten (dit zijn afbeeldingen; scroll ze naar beneden, ze zijn echt enorm).

Laten we, om niet verdwaald te raken in deze jungle, enkele eenvoudige use-cases bekijken. De eerste waarheidsgetrouwe steekproef demonstreert de beknoptheid van de verzamelcode:

We creëren een lijst, die alleen kan bevatten int waarden.

  1. Vervolgens selecteren we alleen degenen die aan een voorwaarde voldoen (?waar?).
  2. We doen iets met elk geselecteerd element (?kiezen?).
  3. We zetten ze om in Strings (?kiezen?).
  4. Eindelijk fietsen we door de lijst en traceer het resultaat.

Waar, kiezen, SelectMany - deze bewerkingen zijn eenvoudig te gebruiken wanneer u een query aan het maken bent.

Operaties zoals allemaal, ieder, containsAll, en bevat werken perfect in voorwaardelijke zinnen (?als? verklaringen, enz.).

Om een ​​lijst te wijzigen, hebben we een breed scala aan wapens: verwijderen, Verwijder alles, removeWhere, removeHead, removeTail, enz.

Voor die personen die beslist oog hebben voor perversie, hebben we een aantal operaties voorbereid zoals foldLeft/foldRight, reduceLeft/reduceRight, snijden, enz.

Eenvoudig gezegd, er zijn tal van bewerkingen geschikt voor elke fantasie en bijna elke taak. In sommige bewerkingen zendt u er gewoon een of meer waarden naar toe, bij sommige bewerkingen voegt u een afsluiting toe.


Lijsten en kaarten

De verzameltaal is opzettelijk eenvoudig. Het ondersteunt twee soorten: Lijst en Kaart. Kaart lijkt veel op een triviaal Woordenboek dat bevat enkele nuttige methoden - sleutels, waarden, containsKey, containsValue (handig voor controles en voorwaarden), pushMap (waarden samenvoegen), removeKey, removeValue, enz.

Kaarten zijn slim en veilig. Ze laten u geen onjuiste sleutel of waarde toevoegen:

Kaarten werken goed met alle lijsten en vragen.

Er zijn ook conversiebewerkingen die kunnen worden gebruikt om de insluiting van de nieuwe collecties-extensies in uw werkelijke pure ActionScript-project te vergemakkelijken. Neem gewoon een triviale array (of vector) en pas de .ToList operatie. Na het verwerken van een lijst (of een kaart) kun je deze altijd converteren naar de old-school AS3-stijl met .toArray of .toVector.


Een echt wereldvoorbeeld

Om te laten zien hoe u aan de slag kunt gaan met deze collecties, vindt u hier een stapsgewijze handleiding op basis van een triviale situatie. Stel dat het uw taak is om een ​​lijst met voorgestelde gebruikers voor een Twitter-account te maken. We moeten een zeer lange verzameling van honderden of duizenden objecten verwerken, een korte lijst ophalen (die aan een aantal criteria voldoet) en een bewerking toepassen op elk item in die korte lijst.

We zullen niet onze aandacht richten op de interactie met Twitter API, omdat ons doel alleen is om te laten zien hoe we aan de slag kunnen gaan met de collecties taal en om voordelen van een functionele aanpak te laten zien in het werken met collecties in AS3.


Stap 1: een project maken

Maak een nieuw project vanuit het niets en noem deze Collecties. Als dit je eerste ervaring met de editor is, raden we je aan om de Horizonaxy HelloWord Tutorial en / of het RSSOne-overzicht voor beginners te raadplegen..



Stap 2: Een klasse maken (begin)

Nu moeten we drie klassen maken om de gegevensstructuur op te slaan: GebruikerTwitter account en Bericht. We kunnen het doen vanuit de voortbrengen menu, dat beschikbaar is door rechts te klikken op de code of op te drukken Ctrl + N.



Stap 3: Een klasse maken (Wordt uitgevoerd)

Typ de klassenaam in een pop-upvak.



Stap 4: Een klasse maken (velden toevoegen)

Spring naar theя<>яposition en hitяinvoeren.



Stap 5: я Een klasse maken (meer velden)

Voeg de volgende velden toe: gebruikersnaam, achternaam en ID kaart. De code ziet er als volgt uit:



Stap 6: Getters en Setters toevoegen

Roep de Ctrl + N menu opnieuw.



Stap 7: Nog steeds Getters en Setters toevoegen

Een nieuw pop-upvenster verschijnt. Selecteer alle nieuw gemaakte velden en druk op OK.



Stap 8: Een toevoegen .toString () Methode

Vergeet niet om een ​​tekstpresentatie toe te voegen aan de Gebruiker klasse. Toevoegen .toString () methode - item 5 van theяCtrl-N menu (hetzelfde als op screenshot naar stap 2 en 6).



Stap 9: Codeoverzicht

De Gebruiker klas is klaar. De code ziet er als volgt uit:



Stap 10: TwitterAccount en berichtklassen

Met hetzelfde proces als bij stap 2-9 moet jeя makenTwitter accountяandяBericht klassen.

я


NB: om een ​​typefout (zoals die in de bovenstaande afbeelding) te voorkomen, moet u de collecties taal uit theяCtrl + L menu:


NB2: яThe Twitter account en Berichtklassen moeten worden gecrosslinked. Om dit te laten gebeuren, na het importeren van de collecties taal, je moet het maken Bericht klasse, spring terug naar de Twitter account class en voltooi de regel die een fout veroorzaakte.


NB3: Vergeet niet om getters, setters en a toe te voegen .toString () methode.



Stap 11: яMain ()

Nu is het tijd om wat code te schrijven Hoofd(). Eerst moeten we een aantal velden toevoegen.я


NB: Gebruik de? Smart complete sneltoets sneltoets (Ctrl-Shift-Space) om een ​​beetje tijd te nemen terwijl je deze zinnen typt:


Omdat onze tutorial slechts een demo is die laat zien hoe met collecties in AS3 te werken, slaan we het gedeelte dat verwijst naar hoe deze data van Twitter API haalt, over.

Laten we ons voorstellen dat we al:

  1. een lijst met onzevolgelingen
  2. een lijst met gebruikers followedBefore,
  3. een zeer lange lijst van potentiële kandidaten voor het volgen van - candidatesLongList,
  4. en, natuurlijk, aяcandidatesShortList, die momenteel leeg is.

De derde verzameling kan extreem groot zijn en honderden of zelfs duizenden items bevatten. Ons doel is om een ​​gesofisticeerde query toe te passen en zo de onnodige items af te snijden volgens het principe van Buonarotti? Ik zag de engel in het marmer en uitgehouwen totdat ik hem bevrijdde.?


Stap 12: De query bouwen

Spring naar Hoofd()яconstructor, en ga theя incandidatesLongListmet zijn methode ?waar? (raken Ctrl-Space om automatische aanvulling te gebruiken zoals in de onderstaande schermafbeelding):


De volgende zin verschijnt:


Wees niet verrast, het is gewoon een Sluiting, en "het"is gewoon zijn parameter.


Sluitingen (een kleine lyrische uitweiding)

Een sluiting is in feite dezelfde anonieme functie, maar met een aantal kleine verschillen.

Eerst de Sluiting heeft een zeer beknopte syntaxis. Parameters hebben geen typeaangifte (om precies te zijn, ze hebben het, maar dergelijke verklaringen zijn verborgen). De afsluiting heeft een speciaal gedrag - de laatste instructie is een retourwaarde & rdquo - wat betekent dat u moet gebruiken ?1;? (in de laatste regel) in plaats van ?terug 1;?

Ten tweede heeft het een speciaal aanzicht voor sluitingen met één regel - bij een dergelijke sluiting is een puntkomma aan het uiteinde weggelaten (om twee redenen: leesbaarheid en beknoptheid).

In tegenstelling tot een anonieme functie (en ook als een tegenwicht tegen de eerder genoemde arrays en vectoren), een sluiting is type veilig. Dat betekent dat autocomplete en typecontrole in sluitingen werken.

Tot slot, een Sluiting is een soort functie op steroïden. Het heeft veel smakelijke functies die ons helpen alles snel en beknopt te schrijven.


Stap 13: De query bouwen

Laten we terugkeren naar onze onafgemaakte sluiting. Voeg een code toe die onze "regels" zal implementeren. Deze code retourneert een versimpelde versie van candidatesLongList dat is niet inclusief onze volgers:


Voeg vervolgens nog een criterium toe:


Theoretisch gezien, de collecties taal stelt u in staat verschillende voorwaarden één voor één te nesten. Laten we nog een criterium toevoegen (inclusief gebruikers met? Flash ?,? ActionScript? Of? Adobe? In hun Biografieveld) met een reguliere expressie:



Stap 14: Het resultaat verkrijgen

Selecteer de hele query en druk op Ctrl-Alt-V. Er zal een nieuwe variabele worden geïntroduceerd.

Nu kunnen we doen wat we willen:

We zouden dan de inhoud van kopiëren resultaat in candidatesShortList.


Stap 15: Pure AS3-code genereren

Bouw een module met Ctrl-F9 en bekijk de uitgang venster. De gegenereerde pure AS3-code van Hoofd() ziet er zo uit:

 package com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; public class Hoofd breidt Sprite uit private var followers: Array = new Array (); private var gevolgdVoordat: Array = new Array (); private var candidateLongList: Array = new Array (); private var candidatesShortList: Array = new Array (); public function Main () // sluit onze volgers en gebruikers gevolgd door ons eerder uit // neem mensen op met "Flash", "ActionScript" en "Adobe" in hun bio // voeg ze allemaal toe aan de korte lijst met aanbevelingen this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (candidateLongList, function (n: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (volgers, functie (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, this, false) &&! CollectionsLanguageUtil.any (gevolgd door Before, function (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, this, false);, this, false), function (it: TwitterAccount, stops: Object): Boolean return /Flash|ActionScript|Adobe/.test(it.bio);, this, false); var names: Array = CollectionsLanguageUtil.select (candidateShortList, function (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname;, this, false); CollectionsLanguageUtil.forEach (names, function (m: String, stops: Object): void // TODO: doe iets met 'm', this, false); 

Het lijkt een beetje onleesbaar, toch? Vooral te vergelijken met onze DSL-code:


Conclusie

Met de nieuwe taaluitbreiding van de collecties kunt u:

  • verbeter uw AS3-code waardoor hij beknopter wordt,
  • maak uw code menselijk leesbaarder, en
  • vergemakkelijk het omzetten van uw sequentiële code in parallelle code.