Interroger (et conquérir) de grandes collections dans AS3 avec Realaxy Editor

Bonnes nouvelles tout le monde. Tout le monde qui travaille avec des tableaux et des vecteurs - donc, tous les développeurs - profitera des nouvelles opportunités: depuis la version de Flash fin Août 2011, Realaxy ActionScript Editor (RASE) prend en charge le nouveau Des collections Extension de langue AS3. Dans ce post, nous vous montrerons ce qu'il peut faire.

Une collection est un terme général qui signifie, en gros, "un groupe d'objets de même type qui sont regroupés". La création d'une collection dans ActionScript 3.0 peut être réalisée à l'aide de tableaux, de vecteurs, de dictionnaires ou d'objets. ils ont chacun les ingrédients d'un concept parfait. Cependant, si vous avez une connaissance élémentaire de tout langage moderne et tendance comme Scala, Groovy ou Ruby, vous ressentirez certainement l’absence d’une approche fonctionnelle dans le traitement AS3 pur..


La langue des collections

Eh bien, introduisons le Des collections Extension de langue AS3 disponible dans RASE Beta 10, build 8177+.

Un vocabulaire complet de méthodes complétées avec des exemples est disponible ici: un pour les listes et un autre pour les cartes (ce sont des images; faites-les défiler, elles sont vraiment énormes).

Afin de ne pas vous perdre dans cette jungle, examinons quelques cas d'utilisation simples. Le premier échantillon true-life démontre la concision du code de collection:

Nous créons un liste, qui ne peut contenir que int valeurs.

  1. Ensuite, nous sélectionnons uniquement ceux qui remplissent une condition (??).
  2. Nous faisons quelque chose avec chaque élément choisi (?sélectionner?).
  3. Nous les convertissons en Strings (?sélectionner?).
  4. Enfin, nous parcourons les liste et trace le résultat.

, sélectionner, selectMany - ces opérations sont faciles à utiliser lorsque vous construisez une requête.

Des opérations comme tout, tout, contientTout, et contient fonctionne parfaitement dans les phrases conditionnelles (?si? déclarations, etc.).

Pour modifier une liste, nous disposons d’un large éventail d’armes: retirer, Enlever tout, enleverOù, enleverTête, removeTail, etc.

Pour les personnes qui ont vraiment un oeil pour la perversion, nous avons préparé un tas d'opérations comme foldLeft/foldRight, réduire le reste/réduire à droite, couper, etc.

En termes simples, il existe de nombreuses opérations adaptées à chaque fantaisie et à presque toutes les tâches. Dans certaines opérations, vous ne lui transmettez qu'une ou plusieurs valeurs, dans d'autres, vous ajoutez une fermeture..


Listes et cartes

Le langage de collecte est intentionnellement simple. Il supporte deux types: liste et Carte. Carte est assez similaire à un trivial dictionnaire qui détient des méthodes utiles - clés, valeurs, contient la clé, contientValeur (utile pour les contrôles et conditions), PushMap (pour fusionner des valeurs), removeKey, removeValue, etc.

Les cartes sont intelligentes et sans faille. Ils ne vous laisseront pas ajouter une clé ou une valeur incorrecte:

Les cartes fonctionnent bien avec toutes les listes et les requêtes.

Il existe également des opérations de conversion qui peuvent être utilisées pour faciliter l'intégration des nouvelles extensions Collections à votre projet réel ActionScript. Il suffit de prendre un tableau trivial (ou un vecteur) et d'appliquer le .lister opération. Après avoir traité une liste (ou une carte), vous pouvez toujours la reconvertir au style AS3 de la vieille école à l'aide de .toArray ou .toVector.


Un exemple du monde réel

Pour montrer comment utiliser ces collections, voici un guide détaillé basé sur une situation triviale. Supposons que votre tâche consiste à créer une liste des "utilisateurs suggérés" pour un compte Twitter. Nous devons traiter une très longue collection de centaines ou de milliers d'objets, récupérer une liste courte (correspondant à un certain nombre de critères) et appliquer une opération sur chaque élément de cette liste courte..

Nous ne tournerons pas notre attention vers l’interaction avec l’API de Twitter, car notre objectif n’est que de montrer comment utiliser le Des collections langue et de montrer les avantages d’une approche fonctionnelle du travail avec les collections dans AS3.


Étape 1: Création d'un projet

Créez un nouveau projet à partir de zéro et nommez-le Collections. S'il s'agit de votre première expérience avec l'éditeur, nous vous recommandons de lire le tutoriel de Réalaxy HelloWord et / ou la présentation de Réalaxy pour les débutants..



Étape 2: Création d'un cours (début)

Nous devons maintenant créer trois classes pour stocker la structure de données: UtilisateurCompte Twitter et Message. Nous pouvons le faire à partir du produire menu, accessible en cliquant avec le bouton droit sur le code ou en appuyant sur Ctrl + N.



Étape 3: Création d'un cours (en cours)

Tapez le nom de la classe dans une boîte de dialogue.



Étape 4: Création d'une classe (ajout de champs)

Aller à theя<>яposition et hitяEntrer.



Étape 5: Créer une classe (plus de champs)

Ajoutez les champs suivants: Nom d'utilisateur, nom de famille et identifiant. Le code ressemblera à ceci:



Étape 6: Ajout de getters et de setters

Invoquer le Ctrl + N menu à nouveau.



Étape 7: Toujours ajouter des accesseurs et des setters

Une nouvelle fenêtre pop-up apparaîtra. Sélectionnez tous les champs nouvellement créés et appuyez sur D'accord.



Étape 8: Ajouter un .toString () Méthode

N'oubliez pas d'ajouter une présentation textuelle au Utilisateur classe. Ajouter .toString () method - élément 5 de theяCtrl-N menu (identique à la capture d'écran des étapes 2 et 6).



Étape 9: Vue d'ensemble du code

le Utilisateur la classe est prête. Son code ressemblera à ceci:



Étape 10: Classes de compte et de message Twitter

En utilisant le même processus que les étapes 2 à 9, vous devez créerCompte TwitterяandяMessage Des classes.

я


NB: Pour éviter une erreur de type (comme celle montrée dans l’image ci-dessus), vous devez importer le fichier. Des collections langue de theяCtrl + L menu:


NB2: яThe Compte Twitter et MessageLes classes doivent être réticulées. Pour ce faire, après avoir importé le fichier Des collections langue, vous devez créer le Message classe, retourne à la Compte Twitter classe et complète la ligne qui a causé une erreur.


NB3: N'oubliez pas d'ajouter des accesseurs, des setters et un .toString () méthode.



Étape 11: яMain ()

Maintenant il est temps d'écrire du code Principale(). Tout d’abord, nous devons ajouter quelques champs.


NB: Utilisez le raccourci clavier de l’aSmart Complete (Ctrl-Maj-Espace) économiser un peu de temps en tapant ces phrases:


Comme notre tutoriel est juste une démo qui montre comment utiliser les collections dans AS3, nous allons ignorer la partie qui explique comment obtenir ces données à partir de l'API Twitter..

Imaginons que nous ayons déjà:

  1. une liste de ourяsuiveurs
  2. une liste d'utilisateurs suiviAvant,
  3. une très longue liste de candidats potentiels pour suivre - candidatsLongList,
  4. et bien sûr, aяcandidatsShortList, qui est tentant pour le moment.

La troisième collection peut être extrêmement volumineuse et contenir des centaines voire des milliers d’articles. Notre but est d'appliquer une requête sophistiquée et ainsi de couper les objets inutiles selon le principe de Buonarotti. J'ai vu l'ange dans le marbre et sculpté jusqu'à ce que je le libère..?


Étape 12: création de la requête

Sauter à Principale()яconstructor, et entrez lecandidatsLongListavec sa méthode ?? (frappé Ctrl-Espace utiliser l'auto-complétion comme dans la capture d'écran ci-dessous):


La phrase suivante apparaîtra:


Ne soyez pas surpris, c'est juste un Fermeture, et "il"est juste son paramètre.


Fermetures (une petite digression lyrique)

Une fermeture est en fait la même fonction anonyme, mais avec quelques petites différences.

Premièrement le Fermeture a une syntaxe très concise. Les paramètres n'ont pas de déclaration de type (pour être plus précis, ils l'ont, mais de telles déclarations sont masquées). La fermeture a un comportement spécial - - la dernière instruction est une valeur de retour - ce qui signifie que vous devez utiliser ?1;? (dans la dernière ligne) au lieu de ?retourne 1;?

Deuxièmement, il a une vue spéciale pour les fermetures à une ligne - dans une telle fermeture, un point-virgule à la fin est omis (pour deux raisons: lisibilité et brièveté).

Contrairement à une fonction anonyme (et aussi en tant que contrecoup de la précédente Tableaux et Les vecteurs), une fermeture est tapez safe. Cela signifie que la saisie semi-automatique et la vérification de type fonctionneront dans les fermetures..

Pour conclure, un Fermeture est une sorte de fonction sur les stéroïdes. Il a beaucoup de fonctionnalités savoureuses qui nous aident à écrire tout rapidement et de manière concise.


Étape 13: Construction de la requête

Revenons à notre fermeture inachevée. Ajoutez du code qui implémentera nos "règles". Ce code renverra une version réduite de candidatsLongList cela n'inclut aucun de nos adeptes:


Puis ajoutez un autre critère:


Théoriquement, le Des collections La langue vous permet d'imbriquer de nombreuses conditions différentes une par une. Ajoutons un critère supplémentaire (inclure les utilisateurs qui ont «Flash», «ActionScript» ou «Adobe» dans leur champ Biography) lors de l'utilisation d'une expression régulière:



Étape 14: Obtention du résultat

Sélectionnez la requête entière et appuyez sur Ctrl-Alt-V. Une nouvelle variable sera introduite.

Maintenant nous pouvons faire ce que nous voulons:

Nous copierions ensuite le contenu de résultat dans candidatsShortList.


Étape 15: Générer du code AS3 pur

Construire un module avec Ctrl-F9 et jetez un oeil à la Sortie la fenêtre. Le code AS3 pur généré de Principale() ressemblera à ceci:

 package com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; import flash.display.Sprite; public class Main étend Sprite followers privés privés: Array = new Array (); var privée suivieAvant: Array = new Array (); private var candidatesLongList: Array = new Array (); private var candidatesShortList: Array = new Array (); fonction publique Main () // exclut nos suiveurs et utilisateurs suivis par nous avant // incluent les personnes avec "Flash", "ActionScript" et "Adobe" dans leur bio // les ajoute tous aux recommandations shortlist this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (candidatsLongList, fonction (n: TwitterAccount, stops: Object)): Boolean return! CollectionsLanguageUtil.any (suiveurs, fonction (f: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (suiveurs, fonction (f: TwitterAccount, stops: Object): Boolean return! CollectionsLanguageUtil.any (suiveurs, function (f: TwitterAccount, stops: Object)): Boolean return! = n.user.id;, this, false) &&! CollectionsLanguageUtil.any (suiviAvant, fonction (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); noms var: Array = CollectionsLanguageUtil.select (candidatesShortList, fonction (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname;, this, false); CollectionsLanguageUtil.forEach (noms, fonction (m: chaîne, arrête: objet): void // TODO: fait quelque chose avec 'm', this, false); 

Cela semble un peu illisible, hein? Surtout en comparant avec notre code DSL:


Conclusion

La nouvelle extension linguistique de Collections vous permet de:

  • améliorez votre code AS3 en le rendant plus concis,
  • rendre votre code plus lisible par l'homme, et
  • faciliter la transformation de votre code séquentiel en code parallèle.