2014-10-23 15 views
5

Mi chiedo se sia più o meno efficace incapsulare il corpo principale del codice JavaScript in un oggetto? In questo modo l'intero ambito del tuo programma sarebbe separato da altri ambiti come la finestra.L'incapsulamento del codice Javascript negli oggetti influisce sulle prestazioni?

Per esempio, se ho avuto il seguente codice in un file JavaScript:

/* My main code body. */ 
var somevar1=undefined; 
var somevar2=undefined; 
var somevarN=undefined; 

function somefunction(){}; 

function initialize(){/* Initializes the program. */}; 
/* End main code body. */ 

ho potuto invece incapsulare il corpo codice principale in un oggetto:

/* Encapsulating object. */ 
var application={}; 
application.somevar1=undefined; 
application.somevar2=undefined; 
application.somevarN=undefined; 

application.somefunction=function(){}; 

application.initialize=function(){/* Initializes the program. */}; 

La mia logica è che, poiché JavaScript ricerca tutte le variabili in un ambito finché non viene trovato quello giusto, mantenendo le funzioni e le variabili specifiche dell'applicazione nel proprio ambito aumenterebbe l'efficienza, specialmente se ci fossero un sacco di funzioni e variabili.

La mia unica preoccupazione è che questa è una cattiva pratica o che forse questo aumenterebbe il tempo di ricerca di variabili e funzioni all'interno del nuovo ambito di "applicazione". Se questa è una pratica sbagliata o completamente inutile, per favore fatemelo sapere! Grazie!

+3

No, questo sarà altrettanto veloce. [E non preoccuparti di questo genere di cose] (http://c2.com/cgi/wiki?PrematureOptimization), scrivi solo codice leggibile e funzionale. Le prestazioni sono un problema per quando le prestazioni diventano un problema. –

+1

Sono abbastanza sicuro che ogni identificatore ha il proprio indirizzo, quindi penso che il tuo pensiero non farà molto a meno che il file di script non sia collegato da una sottostringa. –

+0

Anche se questo accelera le prestazioni, scrivere codice in questo modo renderà il programma più difficile da leggere e modificare, il che influenzerà le prestazioni (o chiunque altro che sta leggendo) durante la sua gestione. – Goodword

risposta

3

Non ho idea di quali siano le implicazioni sulle prestazioni (ho il sospetto che siano trascurabili in entrambi i casi, ma se sei davvero preoccupato, testarlo), ma è prassi comune in JavaScript mantenere frammenti di codice nella loro proprio ambito, piuttosto che avere tutto nella portata globale.

Il vantaggio principale è la riduzione del rischio di sovrascrittura accidentale delle variabili nell'ambito globale e la semplificazione della denominazione (ad esempio, è disponibile window.application.initialize anziché, ad esempio, window.initialize_application).

Anziché l'implementazione sopra riportata, è possibile utilizzare le funzioni di auto-chiamata per creare un'area di ambito solo per un bit di codice. Questo è noto come the module pattern.

Questo ha il vantaggio di permettere di creare le variabili “privati” che sono accessibili solo all'interno del modulo, e quindi non sono accessibili da altro codice in esecuzione nello stesso oggetto globale:

/* Encapsulating object. */ 
var application=(function() { 
    var someprivatevar = null// This can't be accessed by code running outside of this function 
     , someprivatefunction = function() { someprivatevar = someprivatevar || new Date(); }; 

    return { 
     somevar1: undefined 
     , somevar2: undefined 
     , somevarN: undefined 
     , somefunction: function(){} 
     , getInitialized: function() { return someprivatevar; } 
     , initialize: function(){/* Initializes the program. */ someprivatefunction(); } 
    }; 

})(); 

application.initialize(); 
application.getInitialized();// Will always tell you when application was initialized 
+1

@CupawnTae: non hai mai visto chiaramente le implicazioni in termini di prestazioni! –

+0

Qual è l'unità delle implicazioni relative alle prestazioni? – Frank

+0

Io tratto di pezzi del mio codice nei propri oggetti di volta in volta per mantenere le cose semplici, che è la bellezza di OOP, ma la mia vera domanda è, sarebbe utile incapsulare TUTTO quello che scriveresti per il tuo programma in un unico grande oggetto "applicazione" per tenerlo separato dall'ambito globale? – Frank

2

I renditi conto che hai fatto una domanda sì o no. Tuttavia, la mia risposta è non preoccuparti, e per confermarlo, voglio pubblicare una citazione da Eloquent Javascript, di Marijn Haverbeke.

Il dilemma della velocità rispetto all'eleganza è interessante. È possibile vedere come una sorta di continuum tra la cordialità umana e facilità d'uso. Quasi tutti i programmi possono essere resi più veloci rendendo lo più grande e più contorto. Il programmatore deve decidere su un bilancia appropriato .... La regola di base, che è stata ripetuta da molti programmatori e con che concordo pienamente, è di non preoccuparsi dell'efficienza fino allo si sa per certo che il programma è troppo lento. Se lo è, scopri quali parti occupano più tempo e inizia a scambiare eleganza per l'efficienza in quelle parti.

+0

Tecnicamente si trattava di una domanda "più o meno". –

+0

Questo è il mio dilemma. Sono abbastanza nuovo su JavaScript e sto iniziando a vedere che ci sono molti modi per scrivere lo stesso codice funzionale. Ah ah, quasi troppi modi. Man mano che i miei programmi crescono, la leggibilità sta diventando un problema, specialmente con le convenzioni di denominazione a cui si potrebbe ricorrere quando tutto è nello stesso ambito. Finché il mio codice non offenderà alcuna best practice, penso che continuerò a utilizzare questo modello di incapsulamento, anche se lo scope più ristretto può essere più pesante sui riferimenti. – Frank

+0

Sono anche abbastanza nuovo, ma consiglio vivamente di verificare [Eloquent Javascript] (http://eloquentjavascript.net//) se non l'hai già fatto. È fondamentalmente * per * le persone che ti piacciono e io che ora conosco molti modi per fare le cose, ma stiamo cercando di capire quale sia il miglior modo per farlo. – Goodword

0

Avere un codice di facile lettura è la chiave del mio problema qui, quindi seguirò l'approccio modulare anche se esiste una catena di ricerca leggermente più lunga per variabili e funzioni. Entrambi i metodi sembrano avere pro e contro così com'è.

Da una parte, si dispone dell'ambito globale che contiene numerose variabili dall'inizio. Se si inserisce tutto il codice all'interno dell'ambito globale, l'elenco di variabili incluse in tale ambito includerà le proprie e anche variabili come innerWidth e innerHeight. L'elenco da cercare quando si fa riferimento alle variabili sarà più lungo, ma credo che sia una quantità così piccola di spese generali di cui è ridicolo preoccuparsi.

D'altra parte, è possibile aggiungere un solo oggetto all'ambito globale che contiene tutte le variabili con cui si desidera lavorare. All'interno di questo ambito, è possibile fare riferimento a queste variabili facilmente ed evitare la ricerca attraverso variabili globali come innerWidth e innerHeight. Il problema è che quando si accede alle variabili incapsulate dall'ambito globale si avrebbe una catena di ricerca più lunga come: globalscope.customscope.myvar invece di globalscope.myvar o solo myvar.

Quando lo guardo in questo modo, sembra una domanda molto banale. Forse il modo migliore per farlo è incapsulare le cose che vanno insieme solo per il codice decluttering e concentrarsi sulla leggibilità piuttosto che avere un pasticcio di codice illeggibile che è solo leggermente più efficiente.

Problemi correlati