Sobrecarga del operador en AS3 con Realaxy Editor

En la publicación anterior sobre Realaxy Editor hablamos sobre el lenguaje de Rasgos, que le permite aprovechar la herencia múltiple. Ahora nos dirigimos a otra oportunidad notable: la sobrecarga de operadores.

Realaxy ActionScript Editor (RASE) está disponible aquí (para Windows, Macintosh OS X y Linux). Nota: si es su primera experiencia con el editor, lea el manual de RASE.

Intoducción

Una de las características principales agregadas a RASE beta 10 es el soporte de sobrecarga de operadores, que permite a los desarrolladores cambiar el comportamiento de los operadores (*, +, etc.) en diferentes circunstancias. Esta característica, así como la herencia múltiple, es un objeto de una guerra santa entre los partidarios ardientes de dos paradigmas de programación diferentes.

Las ventajas de los operadores de sobrecarga son obvias:

  1. Estilo compacto. Sus programas pueden llegar a ser más cortos y más legibles; por ejemplo, es mucho más fácil usar algo como a B C que a.multiply (b) .multiply (б).
  2. El código a menudo se ve más natural. Un operador bien definido es más fácil de entender y recordar que el nombre de la función y el nombre de una función. Por ejemplo, combinando dos variables de tipo Punto, preferiría ver algo como punto1 + punto2, pero no point1.plus (point2).

El verdadero argumento en contra de la sobrecarga del operador es la pérdida del control sobre su código. No está claro, a veces, dónde un operador está sobrecargado y dónde no lo está. Agregar un operador sobrecargado invoca cambios en el comportamiento del código existente que podría llevar a algunas consecuencias inesperadas.

La sobrecarga del operador no se incluye en ActionScript (ECMA3) aunque se propone para el estándar ECMA4. Java no admite la sobrecarga de operadores, pero tanto Groovy ("Java con azúcar sintáctica") como Scala. Además, los operadores de C # pueden estar sobrecargados..

No se puede decir si es algo bueno o malo. Sin embargo, también está prácticamente asegurado de que, a veces, es una necesidad virtual. Por ejemplo, al encadenar múltiples operaciones matemáticas, la sobrecarga de operadores realmente hace que el código sea mucho más conciso, lo que mejora su comprensión de la forma en que funciona. Pero suficiente teoría - vamos a referirnos a la práctica.

Hablamos de una extensión de lenguaje. sobrecargados operarios que se introdujo en RASE desde la versión Beta 10 (compilación 8145+).

Una forma fácil de importarlo (o cualquier otro idioma) a su proyecto es presionar Ctrl + L (Cmd + L) dentro de Realaxy Editor.

Por cierto, sobrecargados operariosen RASE es solo un puerto de la sobrecargados operarios Lenguaje desde la plataforma Jetbrains MPS. Simplemente decidimos no reinventar la rueda y, después de investigar el dominio de la aplicación de destino, llegamos a la conclusión de que la solución Jetbrains parece ser suficiente y satisface todas nuestras necesidades. Hemos añadido algunas características de bonificación pequeña de nosotros.

Creemos que esta es la forma correcta de la Programación Orientada al Idioma que toma lo mejor de otros idiomas y la personaliza para sus propias necesidades. Lea más sobre esto más adelante en nuestros próximos artículos sobre la creación de extensiones de lenguaje..


Paso 1

Crea un nuevo proyecto con un módulo dentro..


Paso 2

¿Llamar a los nuevos operadores de root??.


Paso 3

Agregar algún código para probar a la clase principal.

Aquí hemos creado dos variables, p1 y p2 (tipo Punto). Ahora nos gustaría obtener una tercera variable, p3, que sería el resultado de combinar estos dos puntos.

Salida estos tres valores: p1, p2, p3. Usamos expresión valores del lenguaje explotación florestal Para implementar el mensaje de cadena para la salida de la consola..

Nuestro código provoca un mensaje de error: "La operación no se puede aplicar a estos operandos". Compilar es imposible.


Etapa 4

Vamos a declarar la sobrecarga del operador. Importar com.realaxy.actionScript.overloadedOperators.


Paso 5

Añadir un nuevo ?OverlodedOperatorsContainer? raíz: haga clic con el botón derecho en el nodo del paquete y elija de un menú emergente.


Paso 6

Nombralo ?MyOperators?.

Aquí vemos dos bloques de declaración: ?operadores binarios sobrecargados? y ?Declaraciones de operadores personalizados?.


Paso 7

Mueve al primer bloque y presiona Entrar. Se añade una nueva declaración de operador..


Paso 8

Escoger ?+? operador. Elegir tipo Punto por ambos lados Establecer valor de retorno Punto (cambiarlo de predeterminado ?vacío? ajuste).

Ahora podemos agregar un código que sería ejecutado en combinación Punto con Punto (utilizando ?+? operador).

Eso es todo.

El punto rojo que indica un error en nuestra clase ha desaparecido..


Paso 9

Empezar a compilar.


Paso 10

Crear configuración de ejecución para nuestro módulo..


Paso 11

Asigna la clase principal (si no lo has hecho antes).


Paso 12

Recibimos el siguiente mensaje en la consola:


Paso 13

Ahora intentemos completar una tarea un poco más sofisticada y redefinir las operaciones de resta, multiplicación y división. Para ambos Número y Punto.

 operador + (punto, punto) -> punto conmutativo: falso (izquierda, derecha) -> punto devolver el nuevo punto (left.x + right.x, left.y + right.y);  operador + (Punto, Número) -> Punto conmutativo: falso (izquierda, derecha) -> Punto devolver nuevo Punto (izquierda.x + derecha, izquierda.y + derecha);  operador - (Punto, Punto) -> Punto conmutativo: falso (izquierda, derecha) -> Punto devolver nuevo Punto (izquierda.x - derecha.x, izquierda.y - derecha.y);  operador - (Punto, Número) -> Punto conmutativo: falso (izquierda, derecha) -> Punto devolver nuevo Punto (izquierda.x - derecha, izquierda.y derecha);  operador * (Punto, Punto) -> Punto conmutativo: falso (izquierda, derecha) -> Punto devolver nuevo Punto (izquierda.x * derecha.x, izquierda.y * derecha.y);  operador * (Punto, Número) -> Punto conmutativo: falso (izquierda, derecha) -> Punto devolver nuevo Punto (izquierda.x * derecha, izquierda.y * derecha);  operador / (Punto, Punto) -> Punto conmutativo: falso (izquierda, derecha) -> Punto devolver nuevo Punto (izquierda.x / derecha.x, izquierda.y / derecha.y);  operador / (Punto, Número) -> Punto conmutativo: falso (izquierda, derecha) -> Punto devolver nuevo Punto (izquierda.x / derecha, izquierda.y / derecha); 

Paso 14

Imagina que necesitas calcular un punto que se encuentra a la izquierda y hacia abajo por 50 píxeles desde el centro de la distancia entre los dos puntos..

Esto es simple:

O incluso más simple:

Pero no olvides que en la vida real de un Flasher sería así:

Compara estas cifras. Es razón suficiente para usar la sobrecarga de operadores en proyectos de ActionScript.


Paso 15

Ahora aprendamos a crear nuestros propios operadores personalizados..

Primero, regresa a MyOperators declaración y vaya a Declaraciones de operadores personalizados.

prensa Entrar para crear una nueva declaración. La presentación visual sería ~ =.


Paso 16

Nuestro operador personalizado debe verificar una cadena para que coincida con una expresión regular. Para describir el comportamiento de dicho operador, agregamos una nueva sobrecarga, tal como lo hicimos hace 10 minutos con Punto. La única diferencia es agregar ~ = autocompletar.

El operando de la izquierda debe recoger un Cuerda, mientras que el correcto debe ser RegExp. El valor de retorno debe ser Booleano.

Luego agregue un código que sería ejecutado por nuestro operador, llamando prueba método del valor.


Paso 17

Crear una operación de prueba en Principal () Para ver cómo funciona:

Rapido y facil.

Para evitar confusiones en todos estos operadores personalizados, debe memorizar un solo método abreviado de teclado relacionado con la navegación: Ctrl-B (o Ctrl + clic en un operador) le llevará a la declaración del operador.

Un buen consejo: para marcar la diferencia entre un operador recargado y uno incorporado, coloque el mouse sobre él y presione Ctrl.

Por supuesto, si estás en una Mac, usa Cmd en lugar de Ctrl.


Paso 18

Ampliemos el comportamiento de nuestro operador personalizado con una nueva característica., conmutatividad.

Seleccione el operador y presione Alt-Enter. Escoger Operación binaria de volteo desde un menú emergente. Esto intercambiará los dos lados, sin embargo, con un mensaje de error, porque ~ = El operador aún no está definido para tales operandos..

Proceder a la declaración del operador. Conjunto conmutativo = verdadero. El resaltado de error rojo debe desaparecer (a veces debe presionar F5 para actualizar una vista).

En otras palabras, este ?conmutativo? la configuración es una buena regla antigua de que cambiar el orden de las sumas no cambia la suma. Ahora nuestra ~ = El operador seguirá funcionando si ponemos el RegExp antes del String.

Palabra de advertencia

Los gurús de OOP advierten contra el uso excesivo de este comportamiento. A veces, implica efectos inesperados. Tomémoslo por fe y recordémoslo..

Eso es todo al respecto. Tenemos sobrecarga de operadores en ActionScript 3.