Mejores prácticas / razones para las constantes de cadena en JavaScript [cerrado]

8

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.

Katana314
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 .jsel navegador pueda almacenar en caché el archivo ...
Izkata
@Izkata No estoy seguro de recibir el comentario sobre el almacenamiento en caché. Esto no es JS generado por el servidor (aunque una posibilidad para estas constantes sería que vinieran del servidor; centralizaría más las cosas, pero creo que eso sería una complicación excesiva y demasiadas solicitudes adicionales)
Katana314
No generaría ninguna solicitud adicional, los datos se establecerían en la plantilla y se usarían en JavaScript. Fue el uso de FIRST_NAMEen particular lo que me hizo preguntarme: ¿no cambia por usuario?
Izkata
Sí, esa parte fue solo pereza al escribir el ejemplo; esta instancia solo está enviando la palabra "firstName" al servidor, lo que no tiene mucho sentido, pero en general la idea sería usar eso como una clave para un valor de entrada.
Katana314

Respuestas:

5

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:

CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";

enrol.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

special-enrolle.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

necesita-inscribirse-desde-este-otro-lugar.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

goto-enrollar.js:

redirect({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

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_NAMEnecesitamos 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".

cbojar
fuente
1
También hay un lado oscuro en eso. Cada vez que se agrega / elimina un dato para una solicitud, debe agregarse / eliminarse en dos archivos diferentes. Además, si el nombre de una pieza de datos cambia, podría cambiar la constante, pero entonces el código es más difícil de leer, porque es un nombre constante que se refiere a otro nombre de variable. (Por ejemplo, nuestra compañía renombró algo llamado "Códigos de inscripción" no una sino dos veces). La falta de herramientas automatizadas de Refactorización de JS significa que se pierde mucha de esta centralización.
Katana314
4

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

var NAMESPACE.CONSTANT = 1;
Roman Mik
fuente