Interogarea (și cucerirea) colecțiilor mari în AS3 cu editorul Realaxy

Veste bună, toată lumea. Toți cei care lucrează cu vectori și vectori - așa, toți dezvoltatorii - se vor bucura de noile oportunități: de la construirea Flash, Realaxy ActionScript Editor (RASE) de la sfârșitul lunii august 2011 sprijină noul Colecții Extensie de limbă AS3. În acest post vă vom arăta ce poate face.

O colecție este un termen general care înseamnă, aproximativ, o grămadă de obiecte asemănătoare tipizate care sunt grupate împreună. Construirea unei colecții în ActionScript 3.0 se poate realiza prin utilizarea unor array-uri, vectori, dicționare sau obiecte; fiecare dintre ele are unele dintre elementele unui concept perfect. Cu toate acestea, dacă aveți chiar o cunoaștere de bază cu orice limbaj modern și modern, cum ar fi Scala, Groovy sau Ruby, veți simți cu siguranță lipsa unei abordări funcționale în metoda AS3 pură de prelucrare a colecțiilor.


Limba colecțiilor

Ei bine, să introducem Colecții Extensia de limbă AS3, disponibilă în RASE Beta 10, construiește 8177+.

Un vocabular complet al metodelor completate cu eșantioane este disponibil aici: unul pentru liste și altul pentru hărți (acestea sunt imagini, derulați-le în jos, sunt cu adevărat uriașe).

Pentru a nu vă pierdeți în această junglă, să aruncăm o privire asupra unor cazuri de utilizare simple. Primul eșantion de viață reală demonstrează concisitatea codului de colectare:

Creăm a listă, care poate conține numai int valorile.

  1. Apoi, vom selecta numai pe cele care îndeplinesc o condiție (?Unde?).
  2. Facem ceva cu fiecare element ales (?Selectați?).
  3. Le transformăm în șir (?Selectați?).
  4. În cele din urmă, trecem prin listă și urmăriți rezultatul.

Unde, Selectați, selectMany - aceste operații sunt ușor de utilizat atunci când construiți o interogare.

Operații cum ar fi toate, orice, containsAll, și conține să lucreze perfect în fraze condiționate (?dacă? declarații etc.).

Pentru a modifica o listă, avem o gamă largă de arme: elimina, inlătură tot, removeWhere, removeHead, removeTail, etc.

Pentru acele persoane care au cu siguranță un ochi de perversiune am pregătit o grămadă de operații cum ar fi foldLeft/foldRight, reduceLeft/reduceRight, intersecta, etc.

Pur și simplu a spus, există o mulțime de operațiuni potrivite pentru fiecare fantezie și aproape fiecare sarcină. În unele operațiuni pe care tocmai le transmiteți una sau mai multe valori, în alte câteva adăugați o închidere.


Liste și Hărți

Limba de colectare este intenționat simplă. Suportă două tipuri: Listă și Hartă. Hartă este destul de similar cu un trivial Dicţionar care deține câteva metode utile - chei, valorile, containsKey, containsValue (util pentru verificări și condiții), pushMap (pentru a îmbina valorile), removeKey, removeValue, etc.

Hărțile sunt inteligente și nu reușesc. Ele nu vă vor permite să adăugați o cheie sau o valoare incorectă:

Hărțile funcționează bine cu orice liste și interogări.

Există, de asemenea, operațiuni de conversie care pot fi utilizate pentru a facilita încorporarea noilor extensii de colecții în proiectul dvs real ActionScript. Doar luați o matrice trivială (sau vector) și aplicați .a lista operațiune. După procesarea unei liste (sau a unei hărți), puteți oricând să o convertiți în stilul vechi AS3 folosind .toArray sau .toVector.


Un exemplu real al lumii

Pentru a demonstra cum să începeți cu aceste colecții, iată un ghid pas cu pas bazat pe o situație trivială. Să presupunem că sarcina dvs. este de a crea o listă de utilizatori sugerată pentru un cont Twitter. Trebuie să procesăm o colecție foarte lungă de sute sau mii de obiecte pentru a prelua o listă scurtă (care să corespundă unui număr de criterii) și pentru a aplica o anumită operație pe fiecare articol din lista scurtă.

Nu ne vom concentra atenția asupra interacțiunii cu API-ul Twitter, deoarece scopul nostru este doar să arătăm cum să începeți cu Colecții limbaj și să arate avantajele unei abordări funcționale în lucrul cu colecțiile din AS3.


Pasul 1: Crearea unui proiect

Creați un nou proiect de la zero și numiți colecțiile. Dacă aceasta este prima ta experiență cu editorul, vă recomandăm să citiți Tutorialul Realaxy HelloWord Tutorial și / sauRelaxy Privire de ansamblu pentru începători.



Pasul 2: Crearea unei clase (Început)

Acum trebuie să creăm trei clase pentru a stoca structura de date: UtilizatorTwitterAccount și Mesaj. Putem face acest lucru de la Genera care este disponibil prin clic dreapta pe cod sau prin apăsare Ctrl + N.



Pasul 3: Crearea unei clase (în curs)

Introduceți numele clasei într-o fereastră pop-up.



Pasul 4: Crearea unei clase (adăugarea câmpurilor)

Salt la ea<>născută și lovităintroduce.



Pasul 5: Crearea unei clase (mai multe câmpuri)

Adăugați următoarele câmpuri: nume de utilizator, nume de familie și id. Codul va arăta astfel:



Pasul 6: Adăugarea Getters și Setters

Invocați Ctrl + N din nou.



Pasul 7: Încă adăugați Getters și Setters

Va apărea o nouă fereastră pop-up. Selectați toate câmpurile nou create și apăsați O.K.



Pasul 8: Adăugarea unui a .toString () Metodă

Nu uitați să adăugați o prezentare de text la Utilizator clasă. Adăuga .toString () metoda - punctul 5 din acesteaCtrl-N (la fel ca pe captura de ecran la Pasul 2 și 6).



Pasul 9: Prezentarea codului

Utilizator clasa este gata. Codul său va arăta astfel:



Pasul 10: Clase de Twitter și de mesaje

Folosind același proces ca și pașii 2-9, trebuie să creațiTwitterAccountяandяMesaj clase.

я


NB: Pentru a evita o eroare de tip (ca cea prezentată în imaginea de mai sus), trebuie să importați Colecții limba de la eaCtrl + L meniul:


NB2: яThe TwitterAccount și Mesajclasamentele ar trebui să fie reticulate. Pentru ca acest lucru să se întâmple, după importul Colecții limbă, trebuie să creați Mesaj clasa, sari inapoi la TwitterAccount și completați linia care a cauzat o eroare.


NB3: Nu uitați să adăugați getters, setters și a .toString () metodă.



Pasul 11: jMain ()

Acum este momentul să scrieți niște coduri Principal(). În primul rând, trebuie să adăugăm câteva câmpuri


NB: Utilizați comanda rapidă de la tastatură completă (Ctrl-Shift-Space) să vă petreceți puțin timp în timp ce tastați aceste fraze:


Deoarece tutorialul nostru este doar un demo care arată cum să lucrăm cu colecțiile din AS3, vom trece peste partea care se referă la modul de obținere a acestor date din API-ul Twitter.

Să ne imaginăm că deja avem:

  1. o listă a noastrăadepți
  2. o listă de utilizatori followedBefore,
  3. o listă foarte lungă de potențiali candidați pentru urmărire - candidatesLongList,
  4. și, bineînțeles, aiacandidatesShortList, care este acum în acest moment.

A treia colecție poate fi extrem de mare, care conține sute sau chiar mii de articole. Scopul nostru este să aplicăm o interogare sofisticată și astfel să tăiem articolele inutile în conformitate cu principiul lui Buonarotti? Am văzut îngerul din marmură și am sculptat până l-am eliberat.?


Pasul 12: Construirea interogării

Sari la Principal()constructorul și introduceți-lcandidatesLongListcu metoda sa ?Unde? (lovit Ctrl-Space pentru a utiliza completarea automată ca în ecranul de mai jos):


Va apărea următoarea expresie:


Nu fi surprins, este doar a Închidere, și "aceasta"este doar parametrul său.


Închizături (o mică digresiune lirică)

O închidere este, de fapt, aceeași funcție anonimă, dar cu o serie de mici diferențe.

În primul rând, Închidere are o sintaxă foarte concisă. Parametrii nu au o declarație de tip (pentru a fi mai precis, ei o au, dar astfel de declarații sunt ascunse). Închiderea are un comportament special - "ultima declarație este o valoare de returnare" - ceea ce înseamnă că ar trebui să utilizați ?1;? (în ultima linie) în loc de ?retur 1;?

În al doilea rând, are o viziune specială pentru închiderile cu o singură linie - într-o astfel de închidere, un semicolon la capăt este omis (din două motive: lizibilitatea și scurta).

Spre deosebire de o funcție anonimă (și, de asemenea, ca o contrare a celor de mai sus Arrays și Vectorii), o închidere este tip sigur. Aceasta înseamnă că autocompletarea și verificarea de tip vor funcționa în închideri.

În concluzie, a Închidere este un fel de funcție pe steroizi. Are o mulțime de caracteristici gustoase care ne ajută să scriem totul rapid și concis.


Pasul 13: Construirea interogării

Să ne întoarcem la închiderea neterminată. Adăugați un cod care va implementa "regulile" noastre. Acest cod va returna o versiune descrescătoare din candidatesLongList care nu include nici unul dintre urmașii noștri:


Apoi adăugați un alt criteriu:


Teoretic, Colecții limbajul vă permite să cuibărați o mulțime de condiții diferite unul câte unul. Să adăugăm încă un criteriu (includeți utilizatorii care au "Flash", "ActionScript" sau "Adobe" în câmpul Biografie), folosind o expresie regulată:



Pasul 14: Obținerea rezultatului

Selectați întreaga interogare și apăsați Ctrl-Alt-V. Va fi introdusă o nouă variabilă.

Acum suntem capabili să facem tot ce ne dorim:

Am copia apoi conținutul rezultat în candidatesShortList.


Pasul 15: Generarea codului AS3 Pure

Construiți un modul cu Ctrl-F9 și aruncați o privire la producție fereastră. Codul AS3 generat pur Principal() va arata astfel:

 pachet com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; clasa publică principală extinde Sprite followers privat var: Array = new Array (); private var urmărit înainte: Array = array nou (); private var candidateLongList: Array = Array nou (); private var candidatesShortList: Array = Array nou (); funcția publică () // excludeți pe urmașii noștri și pe utilizatorii urmăriți de noi înainte de a include // adăugați-le pe toți la lista scurtă de recomandări this.candidatesShortList = CollectionsLanguageUtil unde: (SubscribersLanguageUtil.where (candidațiLongList, funcția (n: TwitterAccount, oprește: Object): Boolean return collectionsLanguageUtil.any (followers, function (f: TwitterAccount, stops: Object): Boolean return f.user.id! = n.user.id;, aceasta, falsă) &&! ColecțiiLanguageUtil.any (urmatÎnainte, funcția (f: TwitterAccount, stop: Object): Boolean return f.user.id! = n.user.id; acest lucru, false);, aceasta, falsă), funcția (ea: TwitterAccount, stop: Object): Boolean return /Flash|ActionScript|Adobe/.test(it.bio);, aceasta este falsă); var nume: Array = CollectionsLanguageUtil.select (candidațiiShortList, funcția (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname; ColecțiiLanguageUtil.forEach (nume, funcție (m: String, stop: Obiect): void // TODO: faceți ceva cu 'm', acest lucru este fals); 

Pare puțin improbabil, nu? Mai ales în comparație cu codul nostru DSL:


Concluzie

Noua extensie de limbă pentru Colecții vă permite:

  • îmbunătățiți codul AS3, făcându-l mai concis,
  • a face codul dvs. mai ușor de citit de om, și
  • facilita transformarea codului secvențial în cod paralel.
Cod