2012-03-17 7 views
5

En Java, considero una buena práctica reemplazar literales de cadena con una variable constante cada vez que se usan en más de un lugar y se espera que coincidan. Por ejemplo, si va a establecer una cookie y luego volver a leerla, el nombre de la cookie debe estar en una constante para que el compilador pueda ayudarlo a detectar errores ortográficos, sin mencionar que le permite tener un nombre de variable legible. versus el valor real de la cadena.¿Es una buena práctica extraer literales de cadena a constantes en Javascript?

Estoy revisando algunos códigos como este en JavaScript y me inclino a recomendar que los literales sean reemplazados por una constante. Sin embargo, no estoy seguro de que se apliquen las mismas razones, ya que no existe un compilador y el nombre de la cookie es tan descriptivo como el nombre de una variable.

Editar: En relación con los comentarios y las respuestas recibidas hasta ahora, estoy definitivamente más preocupado con el uso de constantes en comparación con la forma en que se implementan realmente. Veo su valor en Java y otros lenguajes compilados como una manera de evitar errores, pero no estoy seguro de ver el mismo valor en Javascript.

Como mecanismo de documentación, digamos que para números mágicos, creo que tener una variable con nombre (incluso si no se aplica como una constante) sigue siendo una buena forma de mejorar la legibilidad. Sin embargo, para los literales de cadena, no estoy seguro de esto:

var trackingCookieName = "trackingCookie"; 

es mejor que simplemente usar "trackingCookie" ya que es posible errata ya sea literal o el nombre de la variable y de cualquier manera, sólo sería atrapado en tiempo de ejecución .

Respuesta

6

La respuesta es subjetiva. como escribió, no hay compilador ni constantes.

Así que si le ayuda a mantener la lectura y el código si las cadenas se almacenan en variables, hacerlo, de lo contrario evitarlo ...

+1

De acuerdo. Añadiría que es posiblemente mejor usar constantes a medida que aumenta el número de literales de cadena. En el caso de un error tipográfico, es probable que obtenga un error de referencia que hará que sea mucho más fácil de depurar. – squidbe

0

El uso de constantes es siempre mejor, independientemente de la lengua (bueno, tal vez puede encontrar una buena excepción). La única vez que uso literales de cadenas es si hago un analizador de archivos o si tengo poco tiempo y no quiero hacer una lista de constantes.

Por supuesto, demasiadas constantes pueden ser más difíciles de leer ... Realmente depende de cuán oscuros sean los literales de cadena.

Independientemente, Javascript es un lenguaje pesado (como cualquier lenguaje interpretado). Puede extraer campos de objetos basados ​​en el nombre de cadena del objeto (container["innerObject"]), y es casi demasiado fácil ejecutar código a través de una cadena.

1

Javascript const no es ampliamente compatible por lo que yo diría No, no es una buena práctica.

"La implementación actual de const es una extensión específica de Mozilla y no es parte de ECMAScript 5. Es compatible con Firefox & Chrome (V8) y parcialmente compatible con Opera 9+ y Safari. No es compatible con Internet Explorer 6-9, o en la vista previa de Internet Explorer 10. La palabra clave const declara la constante en el ámbito de la función (como variables declaradas con var).

const va a ser definido por ECMAScript 6, pero con diferentes semántica. Similar a las variables declaradas con la instrucción let, las constantes declaradas con const tendrán un ámbito de bloque. " - https://developer.mozilla.org/en/JavaScript/Reference/Statements/const

Además, si desea implementar un const verdadero en javascript, envuélvalo en un objeto y solo proporcione la funcionalidad get.

Algo como esto:

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

Y luego recuperarlos:

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

o como se desee utilizar las constantes.

+0

@JeffreySweeney - Tal vez lo leí mal, interpreté 'me inclino a recomendar que los literales sean reemplazados por una constante 'como establecer las cuerdas para' const', así que eso fue a lo que respondí. –

1

Estoy de acuerdo con gdoron cuando dice que es subjetivo, de hecho, lo que llamamos convenciones para lenguajes de programación, es realmente un acuerdo entre desarrolladores sobre cómo en su perspectiva el código sería más claro, más fácil de dar mantenimiento y etc.

Traje lo de "convenciones", porque esta cosa de "const" es más o menos al respecto, y hay algunas personas/organizaciones que usan estos idiomas mucho y definen algunas buenas prácticas para ellos. Puede utilizar estas convenciones de la manera que más le convenga, porque son ligeramente diferentes entre ellas, de modo que puede adaptarse a medida que obtiene experiencia. Aquí están:

Google Style Guide

JS Crockford Style Guide

+0

Gracias por los enlaces. Desafortunadamente, no veo que ninguno de estos resuelva el problema de los literales de cadena frente a las constantes. El documento de Google alienta el uso de CONSTANT_VARIABLES para los números mágicos, lo que tiene sentido, pero de lo contrario es silencioso. Parece que la respuesta a mi pregunta es: "No, no existe una mejor práctica con respecto a los literales de cadena frente a las constantes con nombre". –

1

OK, estoy de acuerdo que esto podría ser la elección subjetiva. Aquí están las razones por las cuales estoy predispuesto a usar algo equivalente a las constantes en JavaScript. En primer lugar, aquí es cómo podría definir mis constantes (o estos son más como ENUM):

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

Luego, en el ámbito global, probablemente en algún archivo, lo hago

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

Y, utilizo esto en mi código como:

obj.notify(MSG_DOOR_OPEN); 

La razón por la que me gusta esto mejor son:

  1. Si escribo mal algo, obtengo un error de referencia no definido, que lo hace muy fácil de detectar en cualquier consola de JavaScript.
  2. De esta manera, me refiero a un objeto de cadena preasignado, en lugar de crear un nuevo objeto de cadena.
  3. No tengo que citar la cosa, se ve mejor, especialmente en vim.

Desventaja:

  1. Sí, esto es una variable global.
  2. Sin espaciado de nombre (otro prefijo MSG_).
  3. Es una molestia si quieres hacer esto para todo. (no es necesario)

Pero para cosas importantes como nombres de mensajes, etc., me gusta hacerlo así. Además, tener todos los nombres de mensajes definidos en 1 lugar es bueno de todos modos. No soy un experto en JavaScript ni nada por el estilo, así que por favor corrígeme si me equivoco ...

7

La extracción de literales de cadena a constantes significa

  • Herramientas como JSHint pueden identificar los nombres de variables mal escritas
  • compresores pueden abreviar los nombres de variables para la salida más pequeña
  • Puede cambiar los valores de cadena exactamente de 1 plaza
0

En el debate de las constantes en JavaScript, personalmente prefiero el siguiente método (que en realidad está más cerca de las enumeraciones).

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] 
}; 

que hace que sea fácil de usar que le gusta:

var myDirection = DIR.SouthEast; 

Plus, de IDE modernos pueden proporcionar Intellisense para los valores que realmente ayuda.

El otro método mencionado por @Travis-J es bueno y muchos marcos lo usan (Sencha, etc.). Pero para algo que está cerca de una constante o enum en JS, prefiero mi método anterior.

Pero ciertamente se podría hacer como Travis mencionado:

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]; 
     } 
    } 
})(); 

Pero el problema que tengo con esto es que ahora usted tiene que saber las teclas adecuadas.

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

Espero que proporcione un poco de ayuda.

Cuestiones relacionadas