I det föregående inlägget om Realaxy Editor vi talade om egenskapsspåren, som låter dig dra nytta av flera arv. Nu vänder vi oss till ett annat anmärkningsvärt tillfälle: Operatörens överbelastning.
Realaxy ActionScript Editor (RASE) finns här (för Windows, Macintosh OS X och Linux). Obs! Om det är din första erfarenhet med redigeraren, läs RASE-instruktionen.
En av de viktigaste funktionerna i RASE beta 10 är operatörsöverbelastningsstöd, vilket gör att utvecklare kan ändra hur operatörerna (*, +, etc) beter sig under olika omständigheter. Denna funktion, liksom flera arv, är ett föremål för ett heligt krig mellan uppriktiga anhängare av två olika programmeringsparadigmer.
Fördelarna med överbelastningsoperatörer är uppenbara:
abc
än a.multiply (b) .multiply (б).
punkt 1 + punkt2,
men inte point1.plus (Point2)
.Det verkliga argumentet mot överbelastning av operatören är att du förlorar kontrollen över din kod. Det är oklart, ibland, där en operatör är överbelastad, och var den inte är. Lägga till en överbelastad operatör åberopar förändringar i beteendet hos befintlig kod som kan leda till några oväntade konsekvenser.
Operatörsöverbelastning ingår inte i ActionScript (ECMA3) trots att det föreslås för Standard ECMA4. Java stöder inte operatörens överbelastning utan både Groovy (? Java med syntaktiskt socker?) Och Scala do. Dessutom kan C #: s operatörer vara överbelastade.
Man kan inte säga om det är en bra eller dålig sak. Det är dock också praktiskt säkerställt att det ibland är en virtuell måste. Till exempel, när man kopplar flera matematiska operationer, gör operatör överbelastning verkligen kod mycket mer koncis, vilket förbättrar din förståelse för hur det fungerar. Men tillräckligt med teori - låt oss hänvisa oss till övning.
Vi pratar om en språkförlängning overloadedOperators som introducerades i RASE sedan Beta 10 (build 8145+).
Ett enkelt sätt att importera det (eller något annat språk) till ditt projekt är att trycka på Ctrl + L (Cmd + L) i Realaxy Editor.
Förresten, overloadedOperatorsi RASE är bara en hamn i overloadedOperators språk från Jetbrains MPS-plattformen. Vi bestämde oss för att inte återuppfinna hjulet och efter att ha undersökt målansökningsdomänen kom fram till att Jetbrains-lösningen verkar vara tillräcklig och uppfyller alla våra behov. Vi har lagt till några små bonusfunktioner från oss.
Vi tror att detta är rätt sätt för språkorienterad programmering som tar bäst från andra språk och anpassar det till egna behov. Läs mer om detta senare i våra kommande artiklar om skapandet av språkförlängningar.
Skapa ett nytt projekt med en modul inuti.
Ring de nya root-operatörerna?.
Lägg till en kod för testning till huvudklassen.
Här har vi skapat två variabler, p1 och p2 (typ Punkt). Nu vill vi få en tredje variabel, p3, vilket skulle vara ett resultat av att kombinera dessa två punkter.
Utför dessa tre värden: p1, p2, p3. Vi använde uttryck värden
från språk skogsavverkning
för att implementera strängmeddelandet för konsolutmatningen.
Vår kod provocerar ett felmeddelande:? Operation kan inte tillämpas på dessa operander ?. Kompilering är omöjligt.
Låt oss förklara operatören överbelastning. Importera com.realaxy.actionScript.overloadedOperators
.
Lägg till en ny ?OverlodedOperatorsContainer
? root: högerklicka på paketnodet och välj från en popup-meny.
Namnge det ?MyOperators
?.
Här ser vi två deklarationsblock: ?överbelastade binära operatörer
? och ?anpassade operatörsdeklarationer
?.
Flytta till det första blocket och tryck på Stiga på. En ny operatörsdeklaration läggs till.
Välja ?+
? operatör. Välj typ Punkt
för båda sidor. Ställ in returvärde Punkt
(ändra den från standard ?ogiltig
? miljö).
Nu kan vi lägga till en kod som skulle utföras vid kombinationen Punkt
med Punkt
(använder sig av ?+
? operatör).
Det är allt.
Den röda höjdpunkten som angav ett fel i vår klass har försvunnit.
Börja kompilera.
Skapa körkonfiguration för vår modul.
Tilldela huvudklassen (om du inte hade gjort det tidigare).
Vi får följande meddelande på konsolen:
Låt oss nu försöka komplettera en lite mer sofistikerad uppgift och omdefiniera operationser av subtraktion, multiplikation och division. För båda siffra
och Punkt
.
operatör + (Punkt, punkt) -> Punktkommutativ: Falskt (vänster, höger) -> Punkt returnera nytt punkt (left.x + right.x, left.y + right.y); operatör + (Punkt, Nummer) -> Punktkommutativ: Falskt (vänster, höger) -> Punkt returnera ny punkt (vänster.x + höger, vänster.y + höger); operatör - (Punkt, punkt) -> Punktkommutativ: falsk (vänster, höger) -> Punkt returnera ny punkt (left.x - right.x, left.y - right.y); operatör - (Punkt, Nummer) -> Punktkommutativ: Falskt (vänster, höger) -> Punkt returnera ny punkt (vänster.x - höger, vänster.y - höger); operatör * (Punkt, punkt) -> Punktkommutativ: Falskt (vänster, höger) -> Punkt returnera ny punkt (left.x * right.x, left.y * right.y); operatör * (Punkt, Nummer) -> Punktkommutativ: Falskt (vänster, höger) -> Punkt returnera ny punkt (vänster.x * höger, vänster.y * höger); Operatör / (Punkt, Punkt) -> Punktkommutativ: Falskt (vänster, höger) -> Punkt returnera ny punkt (vänster.x / höger.x, vänster.y / höger.y); Operatör / (Punkt, Nummer) -> Punktkommutativ: Falskt (vänster, höger) -> Punkt returnera nytt punkt (vänster.x / höger, vänster.y / höger);
Föreställ dig att du måste beräkna en punkt som ligger till vänster och nedåt med 50 pixlar från mitten av avståndet mellan de två punkterna.
Detta är enkelt:
Eller ännu enklare:
Men glöm inte att i ett Flashers verkliga liv skulle det vara så här:
Jämför dessa siffror. Det är tillräckligt bra att använda operatörsöverbelastning i ActionScript-projekt.
Låt oss nu lära oss hur vi skapar egna anpassade operatörer.
Först återvänd till MyOperators
deklaration och gå till anpassade operatörsdeklarationer
.
Tryck Stiga på att skapa en ny deklaration Visuell presentation skulle vara ~ =
.
Vår anpassade operatör måste kontrollera en sträng för att matcha ett vanligt uttryck. För att beskriva en sådan operatörs beteende lägger vi till en ny överbelastning, precis som vi gjort det för 10 minuter sedan med Punkt
. Den enda skillnaden är att lägga till ~ =
att slutföra automatiskt.
Den vänstra operand måste hämta en Sträng
, medan den rätta måste vara RegExp
. Returvärde bör vara Boolean
.
Lägg sedan till en kod som skulle utföras av vår operatör, ringa testa
metod från värdet.
Skapa en testoperation i Main ()
för att se hur det fungerar:
Snabbt och enkelt.
För att undvika förvirring i alla dessa anpassade operatörer, bör du memorera en enda tangentbordsgenväg relaterad till navigering: Ctrl-B (eller Ctrl + klick på en operatör) leder dig till operatörsdeklarationen.
En bra ledtråd: Att göra skillnad mellan omladdad operatör och inbyggd, svep en mus på den och tryck på Ctrl.
Självklart, om du är på Mac, använd Cmd istället för Ctrl.
Låt oss utöka vår anpassade operatörs beteende med en ny funktion, kommutativitet.
Välj operatör och tryck på Alt-Enter. Välja Flip Binary Operation
från en popup-meny. Detta kommer att byta de två sidorna, dock med ett felmeddelande, eftersom ~ =
Operatören är ännu inte definierad för sådana operander.
Fortsätt till operatörsdeklarationen. Uppsättning commutative = true
. Den röda felsymbolen ska försvinna (ibland bör du trycka på F5 för att uppdatera en vy).
Med andra ord, detta ?kommutativ
? inställning är en bra gammal regel att ändra summands ordning ändrar inte summan. Nu, vår ~ =
Operatören fungerar fortfarande om vi lägger RegExp före strängen.
OOP-guruer varnar för att inte använda detta beteende. Ibland innebär det oväntade effekter. Låt oss ta det på tro och komma ihåg det.
Det är allt som finns där. Vi har operatör överbelastning i ActionScript 3.