2012-03-17 11 views
5

In Java, ritengo sia una buona pratica sostituire i valori letterali di stringa con una variabile costante ogni volta che vengono utilizzati in più di una posizione e si prevede che corrispondano. Ad esempio, se imposti un cookie e successivamente lo rileggi, il nome del cookie deve essere costante, in modo che il compilatore possa aiutarti a rilevare gli errori di ortografia, per non parlare del fatto che puoi avere un nome variabile leggibile rispetto al valore effettivo della stringa.È consigliabile estrarre i valori letterali stringa in costanti in Javascript?

Sto rivedendo un codice come questo in JavaScript e sono propenso a raccomandare che i valori letterali vengano sostituiti con una costante. Tuttavia, non sono sicuro che si applichino le stesse ragioni poiché non esiste un compilatore e il nome del cookie è tanto descrittivo quanto lo sarebbe un nome di variabile.

Modifica: relativo ai commenti e alle risposte ricevute fino ad ora, sono decisamente più interessato all'uso delle costanti rispetto a come sono effettivamente implementate. Vedo il loro valore in Java e in altri linguaggi compilati come modo per prevenire errori, ma non sono sicuro di vedere lo stesso valore in Javascript.

Come meccanismo di documentazione, diciamo per numeri magici, penso che avere una variabile denominata (anche se non è applicata come costante) è ancora un buon modo per migliorare la leggibilità. Ma per stringhe, io non sono sicuro che questo:

var trackingCookieName = "trackingCookie"; 

è meglio che usare "trackingCookie", in quanto si potrebbe typo sia la letterale o il nome della variabile e in entrambi i casi, sarebbe essere catturato solo in fase di esecuzione .

risposta

6

La risposta è soggettiva. come hai scritto, non ci sono compilatori o costanti.

Quindi, se ti aiuta a mantenere la lettura e il codice se le stringhe sono memorizzati nelle variabili, farlo, altrimenti evitarlo ...

+1

concordato. Aggiungerei che è decisamente meglio usare le costanti al crescere del numero di stringhe letterali. In caso di errore di battitura, probabilmente otterrai un ReferenceError che renderà molto più facile il debug. – squidbe

0

Uso delle costanti è sempre meglio, a prescindere dalla lingua (ok, forse si può trovare una buona eccezione). L'unica volta che uso stringhe letterali è se sto facendo un parser di file o se sono a corto di tempo e non voglio fare una lista di costanti.

Ovviamente troppe costanti possono essere più difficili da leggere ... Dipende davvero da quanto siano oscuri i valori letterali delle stringhe.

Indipendentemente da ciò, Javascript è un linguaggio pesante per le stringhe (come qualsiasi linguaggio interpretato). È possibile estrarre i campi dagli oggetti in base al nome della stringa dell'oggetto (container["innerObject"]) ed è quasi troppo facile eseguire il codice attraverso una stringa.

1

Javascript const non è ampiamente supportato, quindi direi No, non è la pratica migliore.

"L'implementazione corrente di const è un'estensione per Mozilla-specifica e non è parte di ECMAScript 5. E 'supportato in Firefox & Chrome (V8) e parzialmente supportato in Opera 9+ e Safari. E non è supportata in Internet esploratore 6-9, o nella preview di Internet Explorer 10. la parola chiave const attualmente dichiara la costante del perimetro funzione (come le variabili dichiarate con var).

const sta per essere definito da ECMAScript 6, ma con diversa semantica. Simile alle variabili dichiarate con l'istruzione let, le costanti dichiarate con const saranno a scope. " - https://developer.mozilla.org/en/JavaScript/Reference/Statements/const

Inoltre, se si desidera implementare un vero const in javascript, quindi racchiuderlo in un oggetto e fornire solo la funzionalità get.

Qualcosa di simile a questo:

var Cookies = (function() 
{ 
var consts = 
{ 
    'APPLICATION': '21930857a3e', 
    'SERVER': '435a3456jh5' 
}; 
return 
{ 
    get: function(name) 
    { 
    return consts [name]; 
    } 
}; 
} 
)(); 

E poi recuperarli:

document.write('<img src="' + Cookies.get('APPLICATION') + '" />') 

o comunque che si desidera utilizzare le costanti.

+0

@JeffreySweeney - Forse ho letto male, ho interpretato "Sono propenso a raccomandare che i letterali siano rimpiazzati con una costante" come impostare le stringhe su "const", quindi era quello a cui avevo risposto. –

1

Sono d'accordo con gdoron quando dice che è soggettivo, anzi, ciò che chiamiamo convenzioni per i linguaggi di programmazione, è in realtà un accordo tra gli sviluppatori su come nella loro prospettiva il codice sarebbe più chiaro, più facile da fornire e così via.

Ho portato la cosa della "convenzione", perché questa cosa "const" è piuttosto su di esso, e ci sono alcune persone/organizzazioni che usano molto questi linguaggi e definiscono alcune buone pratiche per loro. Puoi utilizzare queste convenzioni nel modo che preferisci, perché sono leggermente diverse tra loro, quindi puoi adattarti man mano che ottieni esperienza. Eccoli:

Google Style Guide

JS Crockford Style Guide

+0

Grazie per i collegamenti. Sfortunatamente, non vedo che entrambi affrontino il problema delle stringhe letterali o delle costanti. Il documento di Google incoraggia l'uso di CONSTANT_VARIABLES per i numeri magici, il che ha senso, ma è silenzioso altrimenti. Sembra che la risposta alla mia domanda sia: "No, non esiste una pratica migliore per quanto riguarda i letterali delle stringhe e le costanti nominate" –

1

OK, sono d'accordo che questo potrebbe essere scelta soggettiva. Ecco i motivi per cui sono incline all'utilizzo di qualcosa di equivalente alle costanti in JavaScript. In primo luogo, ecco come lo potrei definire la mia costanti (o queste sono più come ENUM):

function ENUM(name) { 
    window[name] = name; // depending on platform I am on 
} 

Poi, in ambito globale, probabilmente in qualche file, faccio

ENUM("MSG_DOOR_OPEN"); 
ENUM("MSG_DOOR_CLOSED"); 

E, io uso questo nel mio codice come:

obj.notify(MSG_DOOR_OPEN); 

La ragione per cui mi piace questo meglio sono:

  1. Se eseguo errori di ortografia, ottengo qualche errore di riferimento non definito, che rende molto facile l'individuazione in qualsiasi console JavaScript.
  2. In questo modo, mi riferisco a un oggetto stringa preassegnato, piuttosto che creare un nuovo oggetto stringa.
  3. Non devo citare la cosa - sembra più bello, specialmente in vim.

Downside:

  1. Sì, questa è una variabile globale.
  2. Non nome spaziato (altro che prefisso MSG_).
  3. È una seccatura se si vuole fare questo per tutto. (non devi)

Ma per cose importanti come i nomi dei messaggi, ecc., mi piace farlo in questo modo. Inoltre, avere tutti i nomi dei messaggi definiti in 1 posto è comunque buono. Non sono un esperto di JavaScript o altro, quindi per favore correggimi se sbaglio ...

7

Estrazione stringhe letterali alle costanti significa

  • Strumenti come JSHint in grado di identificare i nomi di variabili errori di ortografia
  • Compressori possibile abbreviare i nomi delle variabili per l'uscita più piccola
  • Si modificano i valori delle stringhe esattamente 1 posto
0

Nel dibattito sulle costanti in JavaScript, personalmente preferisco il seguente metodo (che è più vicino all'enumerazione, in realtà).

var DIR = { 
    North: [-1, 0], 
    NorthEast: [-1, 1], 
    East: [0, 1], 
    SouthEast: [1, 1], 
    South: [1, 0], 
    SouthWest: [1, -1], 
    West: [0, -1], 
    NorthWest: [-1, -1] 
}; 

che lo rende facile da utilizzare come:

var myDirection = DIR.SouthEast; 

Inoltre, IDE moderni possono fornire Intellisense per i valori che aiuta veramente.

L'altro metodo di cui parla @ Travis-J è bello e un sacco di quadri usarlo (Sencha, etc.). Ma per qualcosa che è vicino a una costante o enum in JS, preferisco il mio metodo di cui sopra.

Ma certamente si potrebbe fare come Travis menzionati:

var Directions = (function() { 
    var consts = { 
     'North': [-1, 0], 
     'NorthEast': [-1, 1], 
     'East': [0, 1], 
     'SouthEast': [1, 1], 
     'South': [1, 0], 
     'SouthWest': [1, -1], 
     'West': [0, -1], 
     'NorthWest': [-1, -1] 
    }; 

    return { 
     get: function(name) { 
      return consts[name]; 
     } 
    } 
})(); 

Ma il problema che ho con che ora si deve sapere le chiavi corrette.

var myDirection = Directions.get('SouthEast'); 
var myDirection = Directions.get('SOUTHEAST'); // null 

La speranza che fornisce un piccolo aiuto.

Problemi correlati