Sovraccarico dell'operatore in AS3 con Realaxy Editor

Nel post precedente su Realaxy Editor abbiamo parlato del linguaggio Tratti, che ti consente di sfruttare l'ereditarietà multipla. Ora passiamo a un'altra occasione degna di nota: il sovraccarico dell'operatore.

Realaxy ActionScript Editor (RASE) è disponibile qui (per Windows, Macintosh OS X e Linux). Nota: se è la tua prima esperienza con l'editor, leggi l'istruzione RASE.

intoduction

Una delle principali funzionalità aggiunte a RASE beta 10 è il supporto dell'overloading dell'operatore, che consente agli sviluppatori di modificare il modo in cui gli operatori (*, +, ecc.) Si comportano in circostanze diverse. Questa caratteristica, così come l'ereditarietà multipla, è un oggetto di una guerra santa tra ardenti sostenitori di due diversi paradigmi di programmazione.

I vantaggi degli operatori di overload sono ovvi:

  1. Stile compatto I tuoi programmi potrebbero diventare più brevi e più leggibili; per esempio, è molto più facile usare qualcosa del genere a * b * c di a.multiply (b) .multiply (б).
  2. Il codice sembra spesso più naturale. L'operatore ben definito è più facile da capire e ricordare del nome della funzione un nome di funzione. Ad esempio, combinando due variabili di tipo Point, preferiresti vedere qualcosa di simile punto1 + punto2, ma no point1.plus (point2).

Il vero argomento contro l'overloading dell'operatore è la perdita del controllo sul codice. A volte non è chiaro dove un operatore sia sovraccarico e dove non lo sia. L'aggiunta di un operatore sovraccarico richiama le modifiche nel comportamento del codice esistente che potrebbe portare a conseguenze inaspettate.

L'overloading dell'operatore non è incluso in ActionScript (ECMA3) anche se è proposto per lo standard ECMA4. Java non supporta l'overloading dell'operatore ma sia Groovy (? Java con zucchero sintattico?) Che Scala do. Inoltre, gli operatori di C # potrebbero essere sovraccarichi.

Non si può dire se sia una cosa buona o cattiva. Tuttavia, è anche praticamente assicurato che a volte è un must-have virtuale. Ad esempio, quando si concatenano più operazioni matematiche, l'overloading dell'operatore rende il codice molto più conciso, migliorando così la comprensione del modo in cui funziona. Ma abbastanza teoria: ci riferiamo alla pratica.

Parliamo di un'estensione linguistica overloadedOperators è stato introdotto in RASE dalla Beta 10 (build 8145+).

Un modo semplice per importarlo (o qualsiasi altra lingua) per il tuo progetto è quello di premere Ctrl + L (Cmd + L) all'interno di Realaxy Editor.

A proposito, overloadedOperatorsin RASE è solo una porta del overloadedOperators lingua dalla piattaforma MPS Jetbrains. Abbiamo appena deciso di non reinventare la ruota e, dopo aver esaminato il dominio dell'applicazione di destinazione, siamo giunti alla conclusione che la soluzione Jetbrains sembra essere sufficiente e soddisfa tutti i nostri bisogni. Abbiamo aggiunto alcune piccole funzionalità bonus da noi.

Crediamo che questo sia il modo giusto della Programmazione orientata alla lingua che prende il meglio dalle altre lingue e lo personalizza per le proprie esigenze. Maggiori informazioni su questo argomento più avanti nei nostri prossimi articoli sulla creazione di estensioni della lingua.


Passo 1

Crea un nuovo progetto con un modulo all'interno.


Passo 2

Chiama i nuovi operatori root??.


Passaggio 3

Aggiungi del codice per testare la classe principale.

Qui abbiamo creato due variabili, p1 e p2 (tipo Point). Ora vorremmo ottenere una terza variabile, p3, che sarebbe il risultato della combinazione di questi due punti.

Emetti questi tre valori: p1, p2, p3. Abbiamo usato espressioni valori dalla lingua registrazione per implementare il messaggio di stringa per l'output della console.

Il nostro codice provoca un messaggio di errore:? L'operazione non può essere applicata a questi operandi ?. La compilazione è impossibile.


Passaggio 4

Dichiariamo l'overloading dell'operatore. Importare com.realaxy.actionScript.overloadedOperators.


Passaggio 5

Aggiungi un nuovo ?OverlodedOperatorsContainer? root: fai clic con il tasto destro del mouse sul nodo del pacchetto e scegli da un menu a comparsa.


Passaggio 6

Nominalo ?MyOperators?.

Qui vediamo due blocchi di dichiarazione: ?operatori binari sovraccaricati? e ?dichiarazioni di operatori personalizzati?.


Passaggio 7

Passare al primo blocco e premere accedere. È stata aggiunta una nuova dichiarazione dell'operatore.


Passaggio 8

Scegliere ?+? operatore. Scegli il tipo Punto per entrambe le parti. Imposta il valore di ritorno Punto (cambia da predefinito ?vuoto? ambientazione).

Ora possiamo aggiungere un codice che verrebbe eseguito sulla combinazione Punto con Punto (usando ?+? operatore).

È tutto.

L'evidenziazione rossa che indicava un errore nella nostra classe è scomparsa.


Passaggio 9

Inizia la compilazione.


Passaggio 10

Crea la configurazione di esecuzione per il nostro modulo.


Passaggio 11

Assegna la classe principale (se non l'avessi fatto prima).


Passaggio 12

Riceviamo il seguente messaggio sulla console:


Passaggio 13

Ora proviamo a completare un'attività leggermente più sofisticata e ridefiniamo le operazioni di sottrazione, moltiplicazione e divisione. Per entrambi Numero e Punto.

 operator + (Point, Point) -> Point commutative: false (left, right) -> Point return new Point (left.x + right.x, left.y + right.y);  operator + (Point, Number) -> Point commutative: false (left, right) -> Point return new Point (left.x + right, left.y + right);  operator - (Point, Point) -> Point commutativo: false (sinistra, destra) -> Point return new Point (left.x - right.x, left.y - right.y);  operator - (Point, Number) -> Point commutative: false (left, right) -> Point return new Point (left.x - right, left.y - right);  operator * (Point, Point) -> Point commutative: false (left, right) -> Point return new Point (left.x * right.x, left.y * right.y);  operator * (Point, Number) -> Point commutative: false (left, right) -> Point return new Point (left.x * right, left.y * right);  operator / (Point, Point) -> Point commutativo: false (sinistra, destra) -> Point return new Point (left.x / right.x, left.y / right.y);  operatore / (Punto, Numero) -> Punto commutativo: falso (sinistra, destra) -> Punto ritorno nuovo punto (sinistra.x / destra, sinistra.a / destra); 

Passaggio 14

Immagina di aver bisogno di calcolare un punto che si trova a sinistra e in basso di 50 pixel dal centro della distanza tra i due punti.

Questo è semplice:

O ancora più semplice:

Ma non dimenticare che nella vita reale di Flasher sarebbe come questo:

Confronta queste cifre. È una buona ragione per usare l'overloading dell'operatore nei progetti ActionScript.


Passaggio 15

Ora impariamo come creare i nostri operatori personalizzati.

Per prima cosa, torna a MyOperators dichiarazione e andare a dichiarazioni di operatori personalizzati.

stampa accedere per creare una nuova dichiarazione. La presentazione visiva sarebbe ~ =.


Passaggio 16

Il nostro operatore personalizzato deve controllare una stringa per trovare corrispondenza con un'espressione regolare. Per descrivere il comportamento di tale operatore aggiungiamo un nuovo overloading, proprio come lo abbiamo fatto 10 minuti fa con Punto. L'unica differenza è l'aggiunta ~ = per completare automaticamente.

L'operando di sinistra deve raccogliere a Stringa, mentre quello giusto deve essere RegExp. Il valore di ritorno dovrebbe essere booleano.

Quindi aggiungi del codice che verrebbe eseguito dal nostro operatore, chiamando test metodo dal valore.


Passaggio 17

Crea un'operazione di test in Principale () per vedere come funziona:

Veloce e facile.

Per evitare confusione in tutti questi operatori personalizzati, è necessario memorizzare una singola scorciatoia da tastiera relativa alla navigazione: Ctrl-B (o Ctrl + click su un operatore) ti condurrà alla dichiarazione dell'operatore.

Un buon suggerimento: per fare la differenza tra l'operatore ricaricato e uno integrato, passa con il mouse su di esso e premi Ctrl.

Certo, se sei su un Mac, usa cmd invece di Ctrl.


Passaggio 18

Estendiamo il comportamento del nostro operatore personalizzato con una nuova funzionalità, commutativity.

Selezionare l'operatore e premere Alt-Enter. Scegliere Capovolgi l'operazione binaria da un menu a comparsa. Questo cambierà i due lati, tuttavia con un messaggio di errore, perché ~ = l'operatore non è ancora definito per tali operandi.

Procedere alla dichiarazione degli operatori. Impostato commutativo = vero. L'evidenziazione dell'errore rosso dovrebbe scomparire (a volte è necessario premere F5 per aggiornare una vista).

In altre parole, questo ?commutativo? l'impostazione è una buona vecchia regola che la modifica dell'ordine di sommari non modifica la somma. Ora, il nostro ~ = l'operatore continuerà a funzionare se inseriamo RegExp prima della stringa.

Parola di avvertimento

I guru OOP mettono in guardia contro l'abuso di questo comportamento. A volte, comporta effetti inaspettati. Prendiamolo per fede e ricordiamolo.

Questo è tutto ciò che c'è da fare. Abbiamo un sovraccarico dell'operatore in ActionScript 3.