În postul anterior despre Editorul Realaxy am vorbit despre limba Trasaturi, care vă permite să profitați de moștenire multiplă. Acum ne îndreptăm spre o altă oportunitate demnă de remarcat: supraîncărcarea operatorului.
Editorul de acțiune ActionScript (RASE) este disponibil aici (pentru Windows, Macintosh OS X și Linux). Notă: dacă este prima dvs. experiență cu editorul, vă rugăm să citiți manualul RASE.
Una dintre caracteristicile majore adăugate la RASE beta 10 este suportul de supraîncărcare al operatorului, permițând dezvoltatorilor să schimbe modul în care operatorii (*, +, etc.) se comportă în situații diferite. Această caracteristică, precum și moștenirea multiplă, reprezintă un obiect al unui război sfânt între susținătorii arzători ai două paradigme de programare diferite.
Avantajele operatorilor de supraîncărcare sunt evidente:
a * b * c
decât a.multiply (b) .multiply (б).
punctul1 + punctul2,
dar nu point1.plus (punct2)
.Argumentul real împotriva supraîncărcării de către operator este pierderea controlului asupra codului. Este uneori neclar când un operator este supraîncărcat și unde nu este. Adăugarea unui operator supraîncărcat invocă schimbări în comportamentul codului existent, ceea ce ar putea duce la unele consecințe neașteptate.
Suprasarcina operatorului nu este inclusă în ActionScript (ECMA3) chiar dacă este propusă pentru ECMA Standard4. Java nu suportă supraîncărcarea operatorului, dar atât Groovy (? Java cu zahăr sintactic?), Cât și Scala. În plus, operatorii C # pot fi supraîncărcați.
Nu se poate spune dacă este un lucru bun sau rău. Cu toate acestea, este, de asemenea, practic asigurat că uneori este o necesitate virtuală. De exemplu, atunci când lanțați mai multe operații matematice, supraîncărcarea operatorului face codul mult mai concis, îmbunătățind astfel înțelegerea modului în care funcționează. Dar suficientă teorie - să ne referim la practică.
Vorbim despre o prelungire a limbajului overloadedOperators care a fost introdus în RASE de la Beta 10 (construi 8145+).
O modalitate ușoară de a importa (sau orice altă limbă) în proiectul dvs. este să apăsați Ctrl + L (Cmd + L) în cadrul Editorului Realaxy.
Apropo, overloadedOperatorsîn RASE este doar un port al overloadedOperators limba de la platforma Jetbrains MPS. Am decis să nu reinventăm roata și după ce am cercetat domeniul aplicației țintă, am ajuns la concluzia că soluția Jetbrains pare a fi suficientă și satisface toate nevoile noastre. Am adăugat noi niște caracteristici de bonusuri mici.
Credem că aceasta este modalitatea corectă de programare orientată pe limbi, care ia cele mai bune rezultate din alte limbi și le personalizează pentru nevoile proprii. Citiți mai multe despre acest lucru mai târziu în articolele noastre viitoare privind crearea extensiilor lingvistice.
Creați un nou proiect cu un modul înăuntru.
Apelați operatorii rădăcină nouă?.
Adăugați un cod pentru testarea la clasa principală.
Aici am creat două variabile, p1 și p2 (tip Point). Acum, am dori să obținem oa treia variabilă, p3, care ar fi rezultatul combinării acestor două puncte.
Rezultati aceste trei valori: p1, p2, p3. Am folosit expresie valorile
din limba logare
pentru a implementa mesajul de șir pentru ieșirea consolei.
Codul nostru provoacă un mesaj de eroare:? Operația nu se poate aplica acestor operanzi ?. Compilarea este imposibilă.
Să spunem că operatorul este supraîncărcat. Import com.realaxy.actionScript.overloadedOperators
.
Adăugați un mesaj nou ?OverlodedOperatorsContainer
? root: faceți clic dreapta pe nodul pachetului și alegeți dintr-un meniu pop-up.
Numeste ?MyOperators
?.
Aici vedem două blocuri de declarație: ?operatori binari supraîncărcați
? și ?declarațiile operatorilor vamali
?.
Deplasați-vă la primul bloc și apăsați introduce. Se adaugă o nouă declarație de operator.
Alege ?+
? operator. Alegeți tipul Punct
pentru ambele părți. Setați valoarea returnată Punct
(schimbați-l de la implicit ?vid
? setare).
Acum putem adăuga un cod care ar fi executat pe combinare Punct
cu Punct
(folosind ?+
? operator).
Asta e tot.
Indicatorul roșu care a indicat o eroare în clasa noastră a dispărut.
Începeți compilarea.
Creați configurarea run-ului pentru modulul nostru.
Alocați clasei principale (dacă nu ați făcut-o mai devreme).
Primim următorul mesaj pe consola:
Acum, să încercăm să finalizăm o sarcină puțin mai sofisticată și să redefim operațiile de scădere, înmulțire și împărțire. Pentru amandoi Număr
și Punct
.
operator + (punct, punct) -> punct comutativ: fals (stânga, dreapta) -> punct retur nou punct (left.x + right.x, left.y + right.y); operatorul + (punct, număr) -> punct comutativ: false (stânga, dreapta) -> punct retur nou punct (left.x + right, left.y + right); operator - (Point, Point) -> punct comutativ: false (stânga, dreapta) -> Point retur nou punct (left.x - right.x, left.y - right.y); operator - (punct, număr) -> punct comutativ: false (stânga, dreapta) -> punct returnează punct nou (left.x - right, left.y - right); operator * (punct, punct) -> punct comutativ: fals (stânga, dreapta) -> punct retur nou punct (left.x * right.x, left.y * right.y); operator * (punct, număr) -> punct comutativ: false (stânga, dreapta) -> punct retur nou punct (left.x * dreapta, left.y * dreapta); operator / (Point, Point) -> punct comutativ: false (stânga, dreapta) -> Punctul returnează punctul nou (left.x / right.x, left.y / right.y); operator / (Punct, Număr) -> punct comutativ: false (stânga, dreapta) -> Punctul returnează punct nou (left.x / right, left.y / right);
Imaginați-vă că trebuie să calculați un punct situat în stânga și în jos cu 50 de pixeli din centrul distanței dintre cele două puncte.
Acest lucru este simplu:
Sau chiar mai simplu:
Dar nu uitați că într-o viață reală a lui Flasher ar fi așa:
Comparați aceste cifre. Este suficient motiv pentru a utiliza supraîncărcarea operatorului în proiectele ActionScript.
Acum, să învățăm cum să creăm propriile noastre operatori personalizați.
În primul rând, reveniți la MyOperators
declarație și mergeți la declarațiile operatorilor vamali
.
presa introduce pentru a crea o nouă declarație. O prezentare vizuală ar fi ~ =
.
Operatorul nostru personalizat trebuie să verifice un șir pentru potrivirea unei expresii regulate. Pentru a descrie comportamentul unui astfel de operator, adăugăm o suprasarcină nouă, așa cum am făcut-o cu 10 minute în urmă Punct
. Singura diferență este adăugarea ~ =
pentru a completa automat.
Operandul din stânga trebuie sa ridice a Şir
, iar cel corect trebuie să fie RegExp
. Valoarea returnată ar trebui să fie boolean
.
Apoi adăugați un cod care ar fi executat de operatorul nostru, sunând Test
metoda de la valoarea.
Creați o operație de testare în Principalul ()
pentru a vedea cum funcționează:
Rapid și ușor.
Pentru a evita confuzia în toți acești operatori personalizați, ar trebui să memorați o singură comandă rapidă de la tastatură pentru navigare: Ctrl-B (sau Ctrl + clic pe un operator) vă va duce la declarația operatorului.
O sugestie bună: pentru a face diferența între operatorul reîncărcat și cel încorporat, plasați mouse-ul pe el și apăsați Ctrl.
Desigur, dacă sunteți pe un Mac, utilizați-l Cmd in loc de Ctrl.
Să extindem comportamentul operatorului nostru personalizat cu o nouă caracteristică, comutativitatea.
Selectați operatorul și apăsați Alt-Enter. Alege Flip Operație binară
dintr-un meniu pop-up. Acest lucru va schimba cele două părți, cu toate acestea cu un mesaj de eroare, deoarece ~ =
operatorul nu este definit încă pentru astfel de operanzi.
Mergeți la declarația operatorilor. A stabilit comutativ = adevărat
. Indicatorul de eroare roșu ar trebui să dispară (uneori ar trebui să apăsați F5 pentru a reîmprospăta o vizualizare).
Cu alte cuvinte, asta ?comutabil
? setarea este o regulă veche bună că schimbarea ordinii summands nu schimbă suma. Acum, ale noastre ~ =
operatorul va continua să lucreze dacă punem RegExp înaintea String.
OOP guru avertizează împotriva suprasolicitării acestui comportament. Uneori, aceasta implică efecte neașteptate. Să o luăm pe credință și să ne aducem aminte.
Cam despre asta e. Avem supraîncărcarea operatorului în ActionScript 3.