I forrige innlegg om Realaxy Editor snakket vi om egenskapssporene, som lar deg dra nytte av flere arv. Nå vender vi oss til en annen bemerkelsesverdig mulighet: operatør overbelastning.
Realaxy ActionScript Editor (RASE) er tilgjengelig her (for Windows, Macintosh OS X og Linux). Merk: Hvis det er din første erfaring med redaktøren, vennligst les RASE-veiledningen.
En av de viktigste funksjonene som er lagt til i RASE beta 10, er operatør overbelastningsstøtte, slik at utviklere kan endre hvordan operatørene (*, +, osv.) Oppfører seg under forskjellige forhold. Denne egenskapen, så vel som flere arv, er et objekt av en hellig krig mellom ivrige tilhenger av to forskjellige programmeringsparadigmer.
Fordelene med overbelaste operatører er åpenbare:
a * b * c
enn a.multiply (b) .multiply (б).
punkt 1 + punkt2,
men ikke point1.plus (poeng2)
.Det virkelige argumentet mot overbelastning av operatøren er å miste kontrollen over koden din. Det er uklart, noen ganger hvor en operatør er overbelastet, og hvor den ikke er. Å legge til en overbelastet operatør påberoper endringer i oppførselen til eksisterende kode som kan føre til noen uventede konsekvenser.
Overbelastning av operatør er ikke inkludert i ActionScript (ECMA3), selv om det er foreslått for Standard ECMA4. Java støtter ikke operatøroverbelastning, men begge Groovy (? Java med syntaktisk sukker?) Og Scala gjør. Videre kan C # s operatører være overbelastet.
Man kan ikke si om det er en god eller dårlig ting. Imidlertid er det også praktisk talt sikret at det noen ganger er en virtuell må-ha. For eksempel, når du kjeder flere matematiske operasjoner, overfører operatør overbelastning virkelig kode mye mer konsistent, og forbedrer dermed forståelsen av måten den fungerer på. Men nok teori - la oss henvise oss til å praktisere.
Vi snakker om en språkutvidelse overloadedOperators som ble introdusert i RASE siden Beta 10 (build 8145+).
En enkel måte å importere (eller et annet språk) på prosjektet er å trykke på Ctrl + L (Cmd + L) i Realaxy Editor.
Forresten, overloadedOperatorsi RASE er bare en port av overloadedOperators språk fra Jetbrains MPS-plattformen. Vi bestemte oss nettopp for ikke å gjenoppfinne hjulet og etter å ha undersøkt målapplikasjonsdomenet kom til den konklusjonen at Jetbrains-løsningen ser ut til å være tilstrekkelig og oppfyller alle våre behov. Vi har lagt til noen små bonusfunksjoner fra oss.
Vi tror at dette er den rette måten for språkorientert programmering som tar det beste fra andre språk og tilpasser det til egne behov. Les mer om dette senere i våre kommende artikler om opprettelsen av språkutvidelser.
Lag et nytt prosjekt med en modul inne.
Ring de nye rot? Operatørene?.
Legg til en kode for testing til hovedklassen.
Her har vi opprettet to variabler, p1 og p2 (type punkt). Nå ønsker vi å få en tredje variabel, p3, som ville være et resultat av å kombinere disse to punktene.
Utfør disse tre verdiene: p1, p2, p3. Vi brukte uttrykk verdier
fra språk logging
for å implementere strengmeldingen for konsollutgangen.
Vår kode provoserer en feilmelding:? Operasjon kan ikke brukes på disse operandene ?. Kompilering er umulig.
La oss erklære operatøren overbelastning. Importere com.realaxy.actionScript.overloadedOperators
.
Legg til en ny ?OverlodedOperatorsContainer
? rot: høyreklikk på pakkenoden og velg fra en lokalmeny.
Navngi det ?MyOperators
?.
Her ser vi to deklarasjonsblokker: ?Overbelastede binære operatører
? og ?egendefinerte operatørdeklarasjoner
?.
Flytt til den første blokken og trykk Tast inn. En ny operatørdeklarasjon legges til.
Velge ?+
? operatør. Velg type Punkt
for begge sider. Angi returverdi Punkt
(endre den fra standard ?tomrom
? innstilling).
Nå kan vi legge til en kode som vil bli utført ved kombinering Punkt
med Punkt
(ved hjelp av ?+
? operatør).
Det er alt.
Det røde høydepunktet som angav en feil i vår klasse, har forsvunnet.
Start kompilering.
Opprett run-konfigurasjon for modulen vår.
Tilordne hovedklassen (hvis du ikke hadde gjort det tidligere).
Vi får følgende melding på konsollen:
La oss nå prøve å fullføre en litt mer sofistikert oppgave og omdefinere operasjoner for subtraksjon, multiplikasjon og divisjon. For begge Nummer
og Punkt
.
operatør + (punkt, punkt) -> punktkommutativ: false (venstre, høyre) -> punkt returner nytt punkt (left.x + right.x, left.y + right.y); Operatør + (Punkt, Nummer) -> Punktkommutativ: Falsk (Venstre, Høyre) -> Punkt returner nytt punkt (venstre.x + høyre, venstre.y + høyre); operatør - (punkt, punkt) -> punktkommutativ: false (venstre, høyre) -> punkt returner nytt punkt (left.x - right.x, left.y - right.y); operatør - (Punkt, nummer) -> Punktkommutativ: Falsk (venstre, høyre) -> Punkt returner nytt punkt (venstre.x - høyre, venstre.y - høyre); operatør * (punkt, punkt) -> punktkommutativ: false (venstre, høyre) -> punkt returner nytt punkt (left.x * right.x, left.y * right.y); operatør * (Punkt, nummer) -> Punktkommutativ: falsk (venstre, høyre) -> Punkt returner nytt punkt (venstre.x * høyre, venstre.y * høyre); operatør / (punkt, punkt) -> punktkommutativ: falsk (venstre, høyre) -> punkt returner nytt punkt (venstre.x / høyre.x, venstre.y / høyre.y); Operatør / (Punkt, Nummer) -> Punktkommutativ: Falsk (venstre, høyre) -> Punkt returner nytt punkt (venstre.x / høyre, venstre.y / høyre);
Tenk deg at du må beregne et punkt som ligger til venstre og ned med 50 piksler fra midten av avstanden mellom de to punktene.
Dette er enkelt:
Eller enda enklere:
Men ikke glem at i et Flashers virkelige liv ville det være slik:
Sammenligne disse tallene. Det er god nok grunn til å bruke operatøroverbelastning i ActionScript-prosjekter.
La oss nå lære å lage våre egne tilpassede operatører.
Gå først tilbake til MyOperators
erklæring og gå til egendefinerte operatørdeklarasjoner
.
trykk Tast inn å opprette en ny erklæring. Visuell presentasjon ville være ~ =
.
Vår tilpassede operatør må sjekke en streng for å tilpasse et vanlig uttrykk. For å beskrive en slik operatørs oppførsel legger vi til en ny overbelastning, akkurat som vi har gjort det for 10 minutter siden med Punkt
. Den eneste forskjellen er å legge til ~ =
å autofullfør.
Den venstre operand må hente en string
, mens den rette må være RegExp
. Returverdi bør være boolean
.
Deretter legger du til noen kode som vil bli utført av vår operatør, ringer test
metode fra verdien.
Opprett en testoperasjon i Main ()
for å se hvordan det fungerer:
Rask og enkel.
For å unngå forvirring i alle disse egendefinerte operatørene, bør du huske en enkelt tastaturgenvei relatert til navigering: Ctrl-B (eller Ctrl + klikk på en operatør) vil føre deg til operatørerklæring.
Et godt hint: Å gjøre en forskjell mellom gjenoppladet operatør og en innebygd, svev en mus på den og trykk Ctrl.
Selvfølgelig, hvis du er på en Mac, bruk cmd i stedet for Ctrl.
La oss forlenge oppførselen til vår egendefinerte operatør med en ny funksjon, commutativity.
Velg operatør og trykk Alt-Enter. Velge Flip binær drift
fra en lokalmeny. Dette vil bytte de to sidene, men med en feilmelding, fordi ~ =
Operatøren er ennå ikke definert for slike operander.
Fortsett til operatørerklæring. Sett commutative = true
. Den røde feilens høyde bør forsvinne (noen ganger bør du trykke F5 for å oppdatere en visning).
Med andre ord, dette ?kommutativ
? Innstillingen er en god gammel regel at endring av summands rekkefølge ikke endrer summen. Nå, vår ~ =
Operatøren vil fortsatt fungere hvis vi legger RegExp før strengen.
OOP gurus advarer mot overusing denne oppførselen. Noen ganger innebærer det uventede effekter. La oss ta det på tro og huske det.
Det er alt der er til det. Vi har operatør overbelastning i ActionScript 3.