En lenguajes estáticos como Java / C #, comúnmente uso constantes para cadenas o números, en lugar de insertarlos solo en el código. Sin embargo, tiendo a evitar esta práctica en JavaScript. Más recientemente, como algunos otros programadores a mi alrededor han adoptado este enfoque en JS, decidí que probablemente debería solidificar mi razonamiento o el de ellos.
No hay una sintaxis de declaración "const" real en JavaScript. Por lo general, nos conformamos con una política informal de no cambiar las propiedades en mayúsculas. Pero mi opinión suele ser evitarlos por completo, porque la mayoría de sus beneficios se pierden en JavaScript. En Java, una cadena de error ortográfico hará que el programa falle cuando intente ejecutarlo, momento en el que lo corrige y continúa. Tener un verificador estático donde ambas instancias apuntan a la misma constante elimina ese problema, ya que se puede encontrar en tiempo de compilación. Pero JavaScript simplemente tendrá ese problema por todas partes, ya que SIEMPRE vas a descubrir la corrección de tu ortografía en tiempo de ejecución :
Library = { doThing: function() }
setTimeout(function()
Liberry.doThing()
// No such object: Liberry
}, 0);
La mejor protección contra esto, por lo general, es "uso estricto". Para los desarrolladores que lo prefieren, estoy de acuerdo con que lo usen para encontrar problemas con variables no declaradas más rápidamente. Pero mi opinión ha sido que proporcionar constantes de cadena para las API REST, etc., en realidad no lo protege contra nada. Otro ejemplo:
CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";
ajax({url: CompanyAPI.constants.ENROLL_URL,
data: CompanyAPI.constants.FIRST_NAME
});
// vs.
ajax({url: "/rest/enroll",
data: "firstName"
});
... Querías escribir lo anterior, pero luego cometiste errores tipográficos. Whoops
ajax({url: CompanyAPI.constants.ENROL_URL,
data: CompanyAPI.constants.FIRS_NAME
});
// vs.
ajax({url: "/rest/enrol",
data: "firsName"
});
El de base constante seguirá proporcionando indefinido , mientras que "firsName" no es mejor. Con ese fin, tiendo a ver esto como un beneficio de los lenguajes estáticos, y no me molesto en tener un sistema para solucionarlo (además de comenzar a usar "use estricto" para la depuración). ¿Pueden otras personas decirme cuál es su práctica preferida para la constancia de cadenas / enteros?
EDITAR: Para aclarar, mi preferencia es generalmente poner cadenas como "firstName" directamente en línea sin una declaración constante de nivel superior; las penalizaciones por escribir mal son las mismas en ambos sentidos. Cadenas que pueden alargarse, como una URL REST, tenderé a definir en la parte superior del archivo.
fuente
FIRST_NAME
? Parece que proviene de algo del lado del servidor y se pasa al javascript. Y eso, combinado con usted diciendo que proviene de Java / C #, tengo la sensación de que está leyendo mal para qué sirven estas variables: Separar los datos del código, para que.js
el navegador pueda almacenar en caché el archivo ...FIRST_NAME
en particular lo que me hizo preguntarme: ¿no cambia por usuario?Respuestas:
Las constantes cumplen una función de verificación de errores en lenguajes de tipo estático, pero también tienen un segundo propósito. Centralizan la información en un solo lugar. Esto no se pierde cuando nos movemos a JavaScript.
Imagina que tu ejemplo se parece más a esto,
config.js:
enrol.js:
special-enrolle.js:
necesita-inscribirse-desde-este-otro-lugar.js:
goto-enrollar.js:
Observe cómo, ahora, estas constantes se muestran en archivos por todas partes. Si no estuviera usando constantes, tendría que encontrar todas las instancias de esa cadena en particular y reemplazarlas manualmente. Es cierto que aquí hay duplicación, pero tenga en cuenta que el último es realmente diferente. Esto significa que incluso si eliminamos la duplicación, no podríamos abstraerlo. Ahora, debido a que estamos usando constantes y
CompanyAPI.constants.FIRST_NAME
necesitamos cambiar, podemos cambiarlo en un solo lugar, y cambia automáticamente en todas partes.Si estoy usando una cadena en un solo lugar, y no es configuración (es decir, un índice de cadena de matriz no es configuración), entonces lo pondré en línea. Si descubro que lo estoy usando en algunos lugares cerca uno del otro, buscaré refactorizarlo en un solo uso. Si no puedo refactorizar, probablemente lo movería a una constante de nivel "clase".
fuente
Al igual que aprender otro idioma, uno no debe compararlo con su lengua materna. Algunos idiomas a menudo tienen conceptos que no se encuentran en otros. Simplemente aprendemos a aceptarlos.
Las constantes en Java, C # y C ++ no existen en el código binario. Estas constantes fueron inventadas para ayudar a los programadores y compiladores. Como esta respuesta ( /programming/130396/are-there-constants-in-javascript ) dice "Nada es constante"
Por lo tanto, la respuesta a sus preguntas se encuentra en la Convención de nomenclatura y la Revisión del código. Usted y su equipo deberán definir cómo nombrar las constantes, aceptar que las constantes no se modificarán y utilizar la revisión del código como una forma de hacer cumplir la regla. Al final del día, no importa en qué dirección decida ir, no será infalible.
Mi forma preferida de tratar con constantes es
fuente