AS3 101: Quick Tips - Ved å bruke statiske egenskaper og metoder
en
Del
en
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter AS3 101.AS3 101:. OOP Arv, settere & Getters - BasixAS3 101: OOP - Andre Concepts
"Static" egenskaper og metoder tilhører en klasse, snarere enn til en forekomst av en klasse, noe som betyr at de er delt, på en måte, på tvers av hele prosjektet. Men når bør du bruke den statiske nøkkelordet
Hensynet 1:?
Når Det kan bare være én
Dette er den grunnleggende forutsetning. Dersom en eiendom må ha uavhengige verdier på tvers av flere instanser, da eiendommen ikke kan være statisk.
Men hvis du har, sier en TableCell klasse som blir instansiert en gang for hver celle i en tabell layout, du kan ende opp med noen tall layout verdier som er den samme for hver TableCell, uansett hva innholdet i cellen eller posisjon. En padding eller margin eiendom, eller en tekstfarge, skriftnavn eller bakgrunnsfarge, vil trolig ikke endre seg fra forekomst til forekomst.
I dette tilfellet, kan du vurdere å lage en statisk egenskap.
< hr> Hensynet 2:
når du trenger "Global" Access
En statisk egenskapen eller metoden fungerer litt som en globalt tilgjengelig funksjon eller variabel. Bare importere klassen, og du kan lese den samme verdien fra andre steder i programmet.
Det er vanligvis ikke tilrådelig å stole på globale variabler som de kan føre til spaghetti-kode, men det er ikke dermed sagt at de kan 't brukes. Noen ganger er den enkleste løsningen er den beste. Dette fungerer godt med konstanter (se "CON2-global-access" i kilde nedlasting).
For noen metoder, men kan du vurdere å lage en pakke funksjon, som er mer globale i tradisjonell forstand enn en statiske metoden (se "CON2-pakke-funksjoner" for et eksempel). Det fungerer bare med funksjoner, skjønt, så hvis du trenger globale variabler, eller trenger å referere til andre klassemedlemmer, du er nødt til å bruke statiske egenskaper og metoder
Hensynet. 3:
når du trenger nyttefunksjoner
Noen ganger trenger du bare en funksjon. For eksempel vurdere følgende:
funksjons removeAllChildren (doc: Display): void {var num: Number = doc.numChildren; for (var i: uint = 0; i < num; i ++) {doc.removeChildAt (0); }}
Dette er en nyttig funksjon, og det ville ideelt sett levende i en klasse for enkel gjenbruk. Ved å lage en klasse, kanskje kalt DisplayObjectUtils, og gjør denne funksjonen en statisk metode på den klassen, har du et praktisk sted å oppbevare denne funksjonen. Dette er enda mer fornuftig som du samler noen relaterte funksjoner i én klasse. Og fordi metodene er statiske, det er ikke nødvendig å opprette en DisplayObjectUtils eksempel når du ønsker å bruke nyttefunksjon.
Flash leveres med et sett med lettelser klasser i pakken fl.motion.easing. Hver av disse klassene har bare tre statiske metoder, etter navnekonvensjon easeIn, easeOut, og easeInOut. Klassene er i utgangspunktet lagercontainere for funksjoner som brukes andre steder. Det er ingen vits i å lage et kvadratisk objekt, slik den eksisterer utelukkende for sine statiske metoder.
Se eksempel prosjektet "con3-utility-funksjoner" for en enkel men effektiv DisplayObjectUtils klasse i aksjon.
< hr> Hensynet 4:
Når du trenger oppregnet Verdier
Av og til er det nødvendig å bruke en verdi definert av et annet objekt i koden din. Anta at du har et enkelt objekt som kan settes opp på to måter; kanskje det er en knapp som kan ha enten en rød eller svart bakgrunn. Og du setter denne teksten opp i konstruktøren.
Nå, hvis du hadde egenskaper som fungerte som flagg for enten rød eller svart tekst, så du vil ha en kylling-og-egget scenario der du Kunne ' t komme til disse egenskapene før konstruktøren ble kjørt, men du kan ikke kjøre konstruktøren uten disse egenskapene.
Heldigvis statiske egenskaper redde oss fra denne gåten. Dette blir en mulighet:
ny StyledButton (StyledButton.RED);
Som Action mangler enhver form for oppregnet type, statiske konstanter gi de nest beste
En eksisterende eksempel på dette ville være tilfelle. navnene som er lagret som statiske konstanter. For eksempel Event.COMPLETE eller MouseEvent.CLICK. Tenk om du måtte lage en ny MouseEvent hver gang du ønsker å sette opp et klikk lytteren. Legg merke til at dette eksemplet faller også under "bare én" paraply; vi absolutt ikke ønsker navnet på klikkhendelsen skal defineres på flere steder
Se også prosjekt "con4-enum-verdier" for en tilpasset eksempel
Hensynet 5:..
Når du trenger en Singleton (Eller Singleton-lignende oppførsel)
Dette er en slags kombinasjon av "bare én" og "global tilgang," som det er liksom definisjonen av en Singleton. Men jeg vil gjerne påpeke at riktig Singleton design mønsteret er ikke nødvendig for å oppnå tilsvarende effekter, og at statiske metoder er nøkkelen til dette.
Som eksempel består ExternalInterface klasse to statiske metoder og tre statiske egenskaper (addCallback () og samtale () er metoder, og egenskapene er tilgjengelige, marshallExceptions, og objectID). Siden det bare er noen gang en ekstern grensesnitt for Flash Player, er det ikke mye behov for å opprette flere forekomster. Statiske medlemmer her gjør mye fornuftig.
statiske egenskaper og metoder er, selvfølgelig, integrert i Singleton mønster, som jeg ikke skal diskutere her. Hvis du ønsker å lære mer, var det en tidligere Quick Tips om emnet. Men det kan være lurt å vurdere en singleton-lignende klasse uten behov for å opprette en forekomst. Noen ganger er det fornuftig.
Dette er rent min mening, men med tanke på mangelen av private konstruktører (en viktig ingrediens i Singleton) i AS3, lage en klasse som aldri trenger instansiert synes å være et egnet alternativ.
Hensynet 6:
når du ikke er så opptatt av ytelse
Nå, før de ytelsesoptimering fanatikere aficionados flamme meg i kommentarfeltet, vær oppmerksom på at det er systemytelse med statiske medlemmer. I min testing, statiske medlemmer er et hår tregere enn eksempelvis medlemmer (vi snakker noen få millisekunder over én million gjentakelser). Men andre har funnet - ved hjelp av tester langt mer utfyllende min egen - som statiske medlemmer kan ha en betydelig innvirkning på ytelsen. Sjekk ut Jackson Dunstan testresultater eller Hristo Dachev utforskning av emnet.
Uansett hvor fort statisk tilgang er, bør du også vurdere at statiske medlemmer er initialisert opp foran når klassen er lastet inn i runtime, hvorvidt ikke du oppretter en forekomst med en gang. Min forståelse av dette er at det tar omtrent like lang tid å klargjøre en statisk egenskap som det gjør en forekomst eiendom med samme verdi, er forskjellen når Sagt på en annen måte, la oss si at det tar Flash Player 10 millisekunder å erklære en variabel kalt foo som en String, og også sette den med en streng verdi på "bar". Det vil ta 10 millisekunder for å utføre handlingen uavhengig av hvorvidt den variable er en statisk eller en forekomst variabel. Så, i det følgende hypotetiske QuickTip klasse, ville vi ha totalt 20 millisekunder viet til å skape våre eiendommer: Men disse to eiendommene ta sine 10 millisekunder til forskjellige tider. Så, vurderer dette andre bit av koden (la oss anta at det er et dokument klasse for vår SWF): Fordi QuickTip klassen er nødvendig og inkludert, tar fooStatic sine 10 millisekunder, mens alt annet blir initialisert (klasse erklæringer, objekter som er opprettet med en gang, andre statiske medlemmer). Men fooInstance aldri blir initialisert før scenen er klikket, noe som medførte en QuickTip forekomsten blir opprettet. Det er sannsynligvis en triviell forskjell i de fleste tilfeller, men jeg er nødt til å nevne det. Husk at mitt poeng her med dette tipset er mer om arkitektoniske hensyn, og mindre om ytelse tuning. Anmeldelser
at tiden er tatt.
pakken {public class QuickTip {public static Var fooStatic: String = "bar"; offentlig Var fooInstance: String; offentlig funksjon QuickTip () {fooInstance = "bar"; }}}
pakken {public class QuickTipTest strekker Sprite {offentlig funksjon QuickTipTest {stage.addEventListener (MouseEvent.CLICK, onClick); } Private funksjon onClick (e: MouseEvent): void {var qt: QuickTip = new QuickTip (); }}}