Consultar (y conquistar) grandes colecciones en AS3 con Realaxy Editor

Buenas noticias para todos. Todos los que trabajan con arrays y vectores, así que, todos los desarrolladores - disfrutará de las nuevas oportunidades: desde la compilación de Flash a finales de agosto de 2011, Realaxy ActionScript Editor (RASE) es compatible con el nuevo Colecciones Extensión del lenguaje AS3. En este post te mostraremos lo que puede hacer..

Una colección es un término general que significa, aproximadamente, "un montón de objetos tipificados de manera similar que se agrupan". La creación de una colección en ActionScript 3.0 se puede hacer mediante el uso de matrices, vectores, diccionarios u objetos; cada uno tiene algunos de los ingredientes de un concepto perfecto. Sin embargo, si tiene un conocimiento básico de cualquier lenguaje moderno y moderno como Scala, Groovy o Ruby, definitivamente sentirá la falta de un enfoque funcional en la forma pura de AS3 de procesar colecciones..


El lenguaje de las colecciones

Bueno, vamos a introducir el Colecciones Extensión de lenguaje AS3 que está disponible en RASE Beta 10, compilación 8177+.

Un vocabulario completo de métodos complementados con muestras está disponible aquí: uno para listas y otro para mapas (estas son imágenes, desplácese hacia abajo, son realmente GRANDES).

Para no perderse en esta jungla, echemos un vistazo a algunos casos de uso simples. El primer ejemplo de vida real demuestra la concisión del código de colección:

Creamos un lista, que solo puede contener En t valores.

  1. Luego, seleccionamos solo aquellos que cumplen una condición (?dónde?).
  2. Hacemos algo con cada elemento escogido (?seleccionar?).
  3. Los convertimos a cuerdas (?seleccionar?).
  4. Finalmente, pasamos por la lista y rastrear el resultado.

Dónde, seleccionar, seleccioneMany - Estas operaciones son fáciles de usar cuando estás creando una consulta..

Operaciones como todos, alguna, contiene todo, y contiene funciona perfectamente en frases condicionales (?Si? declaraciones, etc.).

Para modificar una lista, tenemos una amplia gama de armas: retirar, eliminar todo, quitar Donde, eliminarCabeza, removeTail, etc.

Para aquellas personas que definitivamente tienen un ojo para la perversión, hemos preparado un montón de operaciones como plegarse/foldRight, reducir izquierda/reducir derecho, intersecarse, etc.

En pocas palabras, hay un montón de operaciones adecuadas para cada fantasía y casi todas las tareas. En algunas operaciones solo le transmites uno o más valores, en otras, agregas un cierre.


Listas y mapas

El lenguaje de la colección es intencionalmente simple. Es compatible con dos tipos: Lista y Mapa. Mapa es bastante similar a un trivial Diccionario que contiene algunos métodos útiles - llaves, valores, contiene clave, contiene valor (útil para controles y condiciones), pushMap (para fusionar valores), removeKey, eliminarValor, etc.

Los mapas son inteligentes y seguros. No le permitirán agregar una clave o valor incorrecto:

Los mapas funcionan bien con cualquier lista y consulta.

También hay operaciones de conversión que se pueden utilizar para facilitar la incorporación de las nuevas extensiones de Colecciones a su proyecto real de ActionScript puro. Simplemente tome una matriz trivial (o vector) y aplique el .Listar operación. Después de procesar una lista (o un mapa), siempre puede convertirla al estilo AS3 de la vieja escuela usando .toArray o .toVector.


Un ejemplo del mundo real

Para demostrar cómo comenzar con estas colecciones, aquí hay una guía paso a paso basada en una situación trivial. Supongamos que su tarea es crear una lista de "usuarios sugeridos" para una cuenta de Twitter. Tenemos que procesar una colección muy larga de cientos o miles de objetos, para recuperar una lista corta (que coincida con una serie de criterios) y para aplicar alguna operación en cada elemento de esa lista corta.

No centraremos nuestra atención en interactuar con la API de Twitter, ya que nuestro objetivo es solo mostrar cómo comenzar con el Colecciones lenguaje y para mostrar las ventajas de un enfoque funcional en el trabajo con colecciones en AS3.


Paso 1: Creando un Proyecto

Crea un nuevo proyecto desde cero y llámalo Colecciones. Si esta es tu primera experiencia con el editor, te recomendamos que leas el Tutorial HelloWord de Janealaxy y / oRealaxy para principiantes.



Paso 2: Creando una Clase (Comienzo)

Ahora necesitamos crear tres clases para almacenar la estructura de datos: UsuarioCuenta de Twitter y Mensaje. Podemos hacerlo desde la Generar menú, que está disponible haciendo clic con el botón derecho en el código o presionando Ctrl + N.



Paso 3: Creando una clase (en progreso)

Escriba el nombre de la clase en un cuadro emergente.



Paso 4: Creando una Clase (Agregando Campos)

Saltar a la ja<>posición y golpeEntrar.



Paso 5: яCreación de una clase (más campos)

Agregue los siguientes campos: nombre de usuario, apellido y carné de identidad. El código se verá así:



Paso 6: Agregar Getters y Setters

Invocar el Ctrl + N menú de nuevo.



Paso 7: Aún agregando Getters y Setters

Aparecerá una nueva ventana emergente. Seleccione todos los campos recién creados y presione DE ACUERDO.



Paso 8: Agregando un .Encadenar() Método

No olvides añadir una presentación de texto a la Usuario clase. Añadir .Encadenar() método - artículo 5 de theяCtrl-N menú (igual que en la captura de pantalla de los pasos 2 y 6).



Paso 9: Resumen del código

los Usuario la clase esta lista Su código se verá así:



Paso 10: TwitterAccount y clases de mensajes

Usando el mismo proceso que los Pasos 2-9 tienes que crearCuenta de TwitterяandяMensaje clases.

я


NB: para evitar un error de tipo (como el que se muestra en la imagen de arriba), debe importar el Colecciones idioma de theяCtrl + L menú:


NB2: яThe Cuenta de Twitter y MensajeLas clases deben ser reticuladas. Para que esto suceda, después de importar el Colecciones idioma, tienes que crear el Mensaje clase, salta de nuevo a la Cuenta de Twitter Clase y completa la línea que causó un error..


NB3: No te olvides de agregar getters, setters y un .Encadenar() método.



Paso 11: яMain ()

Ahora es el momento de escribir algún código en Principal(). Primero, necesitamos agregar algunos campos.


NB: Utilice el método abreviado de teclado Complete ()Ctrl-Shift-Space) para guardar un poco de tiempo mientras escribe estas frases:


Ya que nuestro tutorial es solo una demostración que muestra cómo trabajar con las colecciones en AS3, omitiremos la parte que hace referencia a cómo obtener estos datos de la API de Twitter..

Imaginemos que ya tenemos:

  1. una lista de nuestrosseguidores
  2. una lista de usuarios seguido antes,
  3. una lista muy larga de posibles candidatos para seguir - candidatosLongList,
  4. y, por supuesto, aяcandidatosCortoLista, cual es la vacante en este momento.

La tercera colección puede ser extremadamente grande, con cientos o incluso miles de artículos. Nuestro objetivo es aplicar una consulta sofisticada y, por lo tanto, cortar los elementos innecesarios según el principio de Buonarotti. Vi al ángel en el mármol y lo esculpí hasta que lo liberé..?


Paso 12: Construyendo la consulta

Salta a Principal()яconstructor, y entrar en el яcandidatosLongListcon su método ?dónde? (golpear Ctrl-Space para usar autocompletar como en la captura de pantalla a continuación):


Aparecerá la siguiente frase:


No te sorprendas, es solo un Cierre, yeso"es solo su parámetro.


Cierres (una pequeña digresión lírica)

Un cierre es, de hecho, la misma función anónima, pero con una serie de pequeñas diferencias.

Primero el Cierre Tiene una sintaxis muy concisa. Los parámetros no tienen una declaración de tipo (para ser más precisos, la tienen, pero tales declaraciones están ocultas). El cierre tiene un comportamiento especial: la última declaración es un valor de retorno y rdquo, lo que significa que debe usar ?1;? (en la última línea) en lugar de ?devuelve 1;?

En segundo lugar, tiene una vista especial para los cierres de una sola línea: en tal cierre, se omite un punto y coma en el extremo (por dos razones: legibilidad y brevedad).

A diferencia de una función anónima (y también como un contador a los mencionados Arrays y Vectores), un cierre es tipo seguro. Eso significa que el autocompletado y la comprobación de tipos funcionarán en cierres.

Para concluir, un Cierre Es un tipo de función sobre los esteroides. Tiene muchas características sabrosas que nos ayudan a escribir todo de forma rápida y concisa..


Paso 13: Construyendo la consulta

Volvamos a nuestro cierre inacabado. Agrega algún código que implementará nuestras "reglas". Este código devolverá una versión reducida de candidatosLongList Eso no incluye a ninguno de nuestros seguidores:


Luego agrega otro criterio:


Teóricamente, la Colecciones El lenguaje te permite anidar muchas condiciones diferentes una por una. Agreguemos un criterio más (incluya a los usuarios que tienen 'Flash', 'ActionScript' o 'Adobe' en su campo Biografía) utilizando una expresión regular:



Paso 14: Obtención del resultado

Seleccione toda la consulta y pulse Ctrl-Alt-V. Se introducirá una nueva variable..

Ahora somos capaces de hacer lo que queramos:

Luego copiaríamos el contenido de resultado dentro candidatosCortoLista.


Paso 15: Generando código puro AS3

Construye un módulo con Ctrl-F9 y echa un vistazo a la Salida ventana. El código AS3 puro generado de Principal() se verá así:

 package com.example import com.realaxy.actionScript.collections.util.CollectionsLanguageUtil; importar flash.display.Sprite; La clase pública Main extiende Sprite private var followers: Array = new Array (); var privado siguió antes de: Array = new Array (); private var candidatoLongList: Array = new Array (); private var candidatoShortList: Array = new Array (); función pública Main () // excluir a nuestros seguidores y usuarios seguidos por nosotros antes de // incluir a las personas con "Flash", "ActionScript" y "Adobe" en su biografía // agregarlos a la lista de recomendaciones this.candidatesShortList = CollectionsLanguageUtil .where (CollectionsLanguageUtil.where (candidatosLongList, función (n: TwitterAccount, se detiene: Objeto): Boolean return! CollectionsLanguageUtil.any (seguidores, función (f: TwitterAccount, se detiene: Object)): Boolean return f.user.id! = n.user.id;, esto, falso) &&! CollectionsLanguageUtil.any (seguido antes, función (f: TwitterAccount, se detiene: objeto): 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 (candidatosShortList, function (it: TwitterAccount, stops: Object): String return it.user.username + "," + it.user.surname;, this, false); CollectionsLanguageUtil.forEach (nombres, función (m: Cadena, paradas: Objeto): void // TODO: haga algo con 'm', esto, falso); 

Parece un poco ilegible, ¿eh? Especialmente comparando con nuestro código DSL:


Conclusión

La nueva extensión de lenguaje de Colecciones te permite:

  • Mejora tu código AS3 haciéndolo más conciso.,
  • Haz que tu código sea más legible para los humanos, y
  • Facilita convertir tu código secuencial en código paralelo.