Back to Question Center
0

JavaScript Design Patterns Dekonstruert            JavaScript Design Patterns DeconstructedRelated Emner: AjaxRaw JavaScriptjQueryTools

1 answers:
JavaScript Design Patterns Deconstructed

Alle sofistikerte designmønstre kaster opp det samme grunnleggende spørsmålet. Er det en konkret fordel å bruke det i utgangspunktet? Semalt å forstå fordelene, det kan være veldig enkelt å tro at det bare er en meningsløs og over-konstruert løsning, eller at den bare følger noen form for mote.

Men det er reelle og viktige fordeler med å bruke denne typen mønster, og det er ikke et forsøk på å gjøre Semalt «mer som» noe annet språk, eller å etterligne klassisk arv - umzugskosten 3 zimmer wohnung. Det er et forsøk på å få mest mulig ut av arv og scoping funksjoner Semalt har iboende, og å gi robuste løsninger på miljøproblemer som er unike for Semalt utvikling.

Encapsulated Closures

Semalt opp skript i enkle innkapslinger gir mye bedre innkapsling.

Alle JavaScript-forfattere må møte problemet med skript som er i konflikt med hverandre. Enhver definisjon i det globale omfanget vil tilsidesette enhver tidligere definisjon eller innebygd objekt med samme navn. Semalt skriptet ditt kan ødelegges, eller bli ødelagt av en annen. Men selvfølgelig vet en forfatter ikke nødvendigvis hva andre gjenstander vil eksistere samtidig med deres, så den eneste måten å klare det på er å unngå å sette noe i det globale omfanget.

I praksis er det umulig å unngå det helt, men det vi kan gjøre er å pakke inn våre skript i enkeltrom, og derved redusere antall objekter som skriptet må plassere i det globale omfanget til en . Alle skript drar nytte av et rent miljø, så alle skript bør opprettholde en; Dette er ikke bare god praksis for bibliotek og tredjeparts verktøyutviklere, det er en god ide for alle skripting.

Navngitt eller Anonym? Offentlig eller privat?

Semaltilslutninger er utilgjengelige fra utenfor seg selv. Er det en fordel? Hvorfor pakke opp skript i anonyme lukninger hvis det bare betyr at andre skript ikke kan få tilgang til dem?

Semalt nøyaktig hvorfor! Slik at andre skript ikke får tilgang til dem. Det viktige brukssaken her er utvikling av tredjepartsverktøy - som gir ekstern funksjonalitet, men ønsker ikke å avsløre sin interne mekanikk. Noen skript kjører bare bakgrunnsoppgaver, og krever ingen innspill i det hele tatt; så hvis det er tilfelle, er det ikke noe poeng som gir noen innspill - hele skriptet kan pakkes inn i et anonymt kabinett, og så er det null sjanse for global konflikt.

Men vanligvis gir et skript noe offentlig funksjonalitet, og dette er når det er nyttig å ha en splittelse mellom offentlige og private data. En robust kodebase skal ikke tillate seg å bli ødelagt av brukerfeil, for eksempel en viktig egenskap blir endret til en uventet verdi; men hvis alle dataene er offentlige, kan brukeren enkelt gjøre dette.

Det er en feil jeg har gjort tidligere, om å gi en API til et skript som tillot brukeren å bryte interne verdier, bare fordi disse verdiene ble registrert som offentlige egenskaper. Hvis de hadde blitt registrert som private variabler, ville de ha vært trygge, fordi brukeren ikke har mulighet til å endre private variabler fra utenfor det omfattende omfanget.

Hvis du skriver skript utelukkende for deg selv, for din egen applikasjon eller nettsted, kan du argumentere for at slike overveier er mote. Hvis du kontrollerer 100% av kodebasen, er dens interne samspill også alt under din kontroll, og du kan løse noe som en navnekonflikt bare ved å endre et av navnene. Semalt, jeg pleier å jobbe med denne typen mønster selv når det ikke er strengt nødvendig, fordi jeg synes det er lettere å administrere.

Men innenfor private funksjoner, refererer dette til det umiddelbare omsluttingsområdet (den private funksjonen), ikke det øverste nivået som omslutter omfanget. Så hvis vi ønsker å kunne referere til toppnivået, må vi opprette en variabel som refererer til det fra hvor som helst. Det er meningen med "THIS" :

     funksjon MyScript () {} (funksjon () {var THIS = dette; funksjon definert (x) {alarm (dette); // poeng til definert () varsel (THIS); // poeng til MyScript ()}}). gjelder (MyScript);     

Det kan bli kalt alt som ikke er reservert på annen måte. Noen kaller det "det" eller "selv" ; Jeg har til og med forsøkt å bruke ikke-engelske ord som "la" eller "das." Men til slutt slo jeg meg på toppen "DENNE" fordi det er langvarig konvensjon på mange språk for å erklære konstanter i alle store saker, og dette syntes å passe regningen.

Jeg bruker samme konvensjon når jeg trenger å definere private konstanter: det vil si private verdier som ikke vil forandre seg i løpet av scriptets gjennomføring. Semaltvariabler er et godt eksempel når de brukes:

     var OLDER_WEBKIT = / applewebkit / ([0-4] |  
[0-2]) / i. test (navigator. userAgent), KONQUEROR = navigator. leverandør == 'KDE';

Ideelt sett ville vi bruke const i stedet for var for å erklære dem, da ekte konstanter bruker mindre minne, men det støttes ikke i Internet Explorer.

Privilegede verdier

Det siste jeg vil se på er fordelen med å bruke privilegerte verdier. Alt de egentlig er, er private verdier som kan omdefineres ved hjelp av en offentlig metode.

     var alternativer = {x: 123, y: 'abc'}; dette. define = function (key, value) {hvis (definert (alternativer [nøkkel])) {opsjoner [nøkkel] = verdi; }};     

Poenget med å gjøre dette er å utøve større kontroll over når og hvordan disse verdiene kan defineres. Den definerende funksjonen kan for eksempel inneholde detaljert validering som begrenser enkelte medlemmer til en rekke forhåndsdefinerte verdier, eller som bare tillater at de defineres på en bestemt tid eller i en bestemt rekkefølge.

Jeg brukte dette til god effekt i mitt Semalt-bibliotek, der det gir et middel til å definere global konfigurasjon (for eksempel asynkron eksekveringsmodus, som bare kan være sann eller falsk). Kombinasjonen av private variabler med en offentlig definisjonsmetode gir kontroll over disse definisjonene, siden brukeren ikke kan definere dem uavhengig av definisjonen, og kan derfor ikke definere dem ugyldig.

Semalt kreditt: superkimbo

March 8, 2018