Querying (e Conquering) Grandi collezioni in AS3 con Realaxy Editor

Buone notizie, a tutti. Tutti quelli che lavorano con array e vettori - così, tutti gli sviluppatori - godranno delle nuove opportunità: dalla versione di Flash di fine agosto 2011, Realaxy ActionScript Editor (RASE) supporta il nuovo collezioni Estensione della lingua AS3. In questo post ti mostreremo cosa può fare.

Una collezione è un termine generico che significa, approssimativamente, "un gruppo di oggetti tipati in modo simile che sono raggruppati insieme". La creazione di una raccolta in ActionScript 3.0 può essere eseguita utilizzando matrici, vettori, dizionari o oggetti; Ognuno di loro ha alcuni degli ingredienti di un concetto perfetto. Tuttavia, se hai anche una conoscenza di base di qualsiasi linguaggio moderno e di tendenza come Scala, Groovy o Ruby, sentirai sicuramente la mancanza di un approccio funzionale nel puro modo AS3 di elaborare le Collezioni.


La lingua delle collezioni

Bene, introduciamo il collezioni Estensione della lingua AS3 disponibile in RASE Beta 10, build 8177+.

Un vocabolario completo di metodi integrati con esempi è disponibile qui: uno per gli elenchi e un altro per le mappe (queste sono immagini; scorrile verso il basso, sono davvero ENORME).

Per non perdersi in questa giungla, diamo un'occhiata ad alcuni semplici casi d'uso. Il primo esempio di vita reale dimostra la concisione del codice di raccolta:

Creiamo a elenco, che può contenere solo int valori.

  1. Quindi, selezioniamo solo quelli che soddisfano una condizione (?dove?).
  2. Facciamo qualcosa con ogni elemento selezionato (?selezionare?).
  3. Li convertiamo in stringhe (?selezionare?).
  4. Infine, passiamo in rassegna il elenco e traccia il risultato.

Dove, selezionare, SelectMany - queste operazioni sono facili da usare quando si crea una query.

Operazioni come tutti, qualunque, containsAll, e contiene funziona perfettamente in frasi condizionali (?Se? dichiarazioni, ecc.).

Per modificare un elenco, abbiamo una vasta gamma di armi: rimuovere, Rimuovi tutto, removeWhere, removeHead, removeTail, eccetera.

Per quelle persone che hanno sicuramente un occhio perversione abbiamo preparato un sacco di operazioni come foldLeft/foldRight, reduceLeft/reduceRight, intersecare, eccetera.

Detto semplicemente, ci sono un sacco di operazioni adatte a ogni fantasia e quasi ogni compito. In alcune operazioni si trasmettono solo uno o più valori, in alcuni altri si aggiunge una chiusura.


Elenchi e mappe

Il linguaggio di raccolta è volutamente semplice. Supporta due tipi: Elenco e Carta geografica. Carta geografica è abbastanza simile a un banale Dizionario che contiene alcuni metodi utili - chiavi, valori, containsKey, containsValue (utile per controlli e condizioni), pushMap (per unire i valori), removeKey, removeValue, eccetera.

Le mappe sono intelligenti e sicure. Non ti permetteranno di aggiungere una chiave o un valore errati:

Le mappe funzionano bene con qualsiasi elenco e query.

Esistono anche operazioni di conversione che possono essere utilizzate per facilitare l'incorporamento delle nuove estensioni Collections al tuo progetto Pure-ActionScript reale. Basta prendere un array banale (o vettoriale) e applicare il .elencare operazione. Dopo aver elaborato una lista (o una mappa) puoi sempre convertirla in stile AS3 vecchia scuola usando .toArray o .toVector.


Un esempio del mondo reale

Per dimostrare come iniziare con queste raccolte, ecco una guida passo passo basata su una situazione banale. Supponiamo che il tuo compito sia quello di creare un elenco di "utenti consigliati" per un account Twitter. Dobbiamo elaborare una raccolta molto lunga di centinaia o migliaia di oggetti, per recuperare un breve elenco (che corrisponde a una serie di criteri) e applicare alcune operazioni su ogni elemento in quella breve lista.

Non rivolgeremo la nostra attenzione all'interazione con le API di Twitter, dal momento che il nostro obiettivo è solo quello di mostrare come iniziare con collezioni linguaggio e mostrare i vantaggi di un approccio funzionale nel lavorare con le raccolte in AS3.


Passaggio 1: creazione di un progetto

Crea un nuovo progetto da zero e chiamalo Collezioni. Se questa è la tua prima esperienza con l'editor, ti consigliamo di leggere il tutorial TutorialRealaxy HelloWord e / oRealaxy Overview For Beginners.



Passaggio 2: creazione di una classe (inizio)

Ora abbiamo bisogno di creare tre classi per memorizzare la struttura dei dati: UtenteTwitterAccount e Messaggio. Possiamo farlo dal creare menu, che è disponibile facendo clic con il tasto destro del mouse sul codice o premendo Ctrl + N.



Passaggio 3: creazione di una classe (in corso)

Digita il nome della classe in una finestra pop-up.



Passaggio 4: creazione di una classe (aggiunta di campi)

Vai a the<>яposition e hitяaccedere.



Passaggio 5: яCreazione di una classe (più campi)

Aggiungi i seguenti campi: nome utente, cognome e id. Il codice sarà simile a questo:



Passaggio 6: aggiunta di getter e setter

Invoca il Ctrl + N di nuovo il menu.



Passaggio 7: aggiunta di getter e setter

Apparirà una nuova finestra pop-up. Seleziona tutti i campi appena creati e premi ok.



Passaggio 8: aggiunta di a .accordare() Metodo

Non dimenticare di aggiungere una presentazione di testo al Utente classe. Inserisci .accordare() metodo - oggetto 5 da theяCtrl-N menu (come nello screenshot dei passaggi 2 e 6).



Passaggio 9: Panoramica del codice

Il Utente la lezione è pronta. Il suo codice sarà simile a questo:



Passaggio 10: Account di Twitter e classi di messaggi

Usando lo stesso procedimento dei passaggi 2-9 devi creareTwitterAccountяandяMessaggio classi.

я


NB: per evitare un errore di tipo (come quello mostrato nell'immagine sopra), è necessario importare il file collezioni lingua da theяCtrl + L menu:


NB2: яThe TwitterAccount e Messaggiole classi ç dovrebbero essere reticolate. Affinché questo accada, dopo aver importato il file collezioni linguaggio, devi creare il Messaggio classe, tornare indietro al TwitterAccount classificare e completare la riga che ha causato un errore.


NB3: non dimenticare di aggiungere getter, setter e a .accordare() metodo.



Passaggio 11: яMain ()

Ora è il momento di scrivere del codice Principale(). Per prima cosa, dobbiamo aggiungere alcuni campi


NB: Usa la scorciatoia da tastiera completa SmartSmart (Ctrl-Shift-Spazio) per risparmiare un po 'di tempo durante la digitazione di queste frasi:


Poiché il nostro tutorial è solo una demo che mostra come lavorare con le raccolte in AS3, salteremo la parte che rimanda a come ottenere questi dati dall'API di Twitter.

Immaginiamo di avere già:

  1. una lista di ourяseguaci
  2. un elenco di utenti followedBefore,
  3. una lunga lista di potenziali candidati per il seguito - candidatesLongList,
  4. e, naturalmente, acandidatesShortList, che is.empty al momento.

La terza raccolta può essere estremamente ampia e contenere centinaia o addirittura migliaia di elementi. Il nostro obiettivo è quello di applicare una domanda sofisticata e quindi tagliare gli articoli inutili secondo il principio di Buonarroti? Ho visto l'angelo nel marmo e scolpito fino a quando non l'ho liberato.?


Passaggio 12: creazione della query

Salta a Principale()costruttore, ed entra in thecandidatesLongListcon il suo metodo ?dove? (colpire Ctrl-Spazio utilizzare il completamento automatico come nello screenshot qui sotto):


Apparirà la seguente frase:


Non essere sorpreso, è solo un Chiusura, e "esso"è solo il suo parametro.


Chiusure (una piccola digressione lirica)

Una chiusura è, infatti, la stessa funzione anonima, ma con una serie di piccole differenze.

Prima il Chiusura ha una sintassi molto concisa. I parametri non hanno una dichiarazione di tipo (per essere più precisi, ce l'hanno, ma tali dichiarazioni sono nascoste). La chiusura ha un comportamento speciale -? L'ultima affermazione è un valore di ritorno & rdquo - il che significa che dovresti usare ?1;? (nell'ultima riga) anziché ?ritorno 1;?

In secondo luogo, ha una vista speciale per le chiusure a linea singola - in tale chiusura viene omesso un punto e virgola alla fine (per due motivi: leggibilità e brevità).

A differenza di una funzione anonima (e anche come contropartita di quanto sopra Array e Vettori), una chiusura è digita sicuro. Ciò significa che il completamento automatico e il controllo dei tipi funzioneranno nelle chiusure.

Per concludere, a Chiusura è una sorta di funzione sugli steroidi. Ha molte caratteristiche gustose che ci aiutano a scrivere tutto in modo rapido e conciso.


Passaggio 13: creazione della query

Torniamo alla nostra chiusura incompiuta. Aggiungi del codice che implementerà le nostre "regole". Questo codice restituirà una versione ridotta di candidatesLongList che non include nessuno dei nostri follower:


Quindi aggiungi un altro criterio:


Teoricamente, il collezioni il linguaggio consente di annidare una a una a molte condizioni diverse. Aggiungiamo un altro criterio (includi utenti che hanno? Flash ?,? ActionScript? O? Adobe? Nel loro campo Biografia) usando un'espressione regolare:



Passaggio 14: Ottenere il risultato

Seleziona l'intera query e premi Ctrl-Alt-V. Verrà introdotta una nuova variabile.

Ora siamo in grado di fare tutto ciò che vogliamo:

Dovremmo quindi copiare il contenuto di risultato in candidatesShortList.


Passaggio 15: generazione del codice AS3 puro

Costruisci un modulo con Ctrl-F9 e dai un'occhiata al Produzione finestra. Il codice generato puro AS3 di Principale() sarà simile a questo:

 pacchetto com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; public class Main estende Sprite private var followers: Array = new Array (); private var followsBefore: Array = new Array (); private var candidateLongList: Array = new Array (); private var candidateShortList: Array = new Array (); funzione pubblica Main () // esclude i nostri follower e utenti seguiti da noi prima // includi persone con "Flash", "ActionScript" e "Adobe" nella loro biografia // aggiungili tutti alla lista di suggerimenti consigliati this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (listsLongList, function (n: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (followers, funzione (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, this, false) &&! CollectionsLanguageUtil.any (followsBefore, 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 (nomi, funzione (m: String, stops: Object): void // TODO: fa qualcosa con 'm', this, false); 

Sembra un po 'illeggibile, eh? Soprattutto confrontando con il nostro codice DSL:


Conclusione

La nuova estensione del linguaggio Collections ti consente di:

  • migliora il tuo codice AS3 rendendolo più conciso,
  • rendere il tuo codice più leggibile, e
  • facilitare la trasformazione del codice sequenziale in codice parallelo.