Variables - Usando constantes

por César SantosSeptiembre 14, 20204 minutos
También disponible en: Inglés

Este es el primer artículo de una serie de publicaciones sobre cómo mejorar el uso de variables en general.

Nota: El código de ejemplo en este artículo está en JavaScript, pero los conceptos y sugerencias se pueden aplicar a cualquier lenguaje. El ejemplo no tiene sentido funcionalmente, solo sirve para demostrar los conceptos aquí tratados.

Índice

Estos son los temas que se discuten en cada artículo:

  1. Usando constantes
  2. Evita duplicar valores de variables (magic strings)
  3. Usando variables para simplificar el código

Usando constantes

Primero que todo, que es un magic string? Como lo menciona en su página de Wikipedia, magic strings son valores que no pueden ser cambiados externamente. Esto significa que son usados internamente por tu código, y los usuarios no tienen una forma directa para modificar dichos valores. En resumen, estos valores son constantes.

Puedes pensar por ejemplo en "tipos de usuario", "tipos de documento" o "identificadores de páginas" como magic strings, donde tienes un número definido de opciones, y dichas opciones son usadas internamente para determinar el comportamiento de tu aplicación.

Aunque estas sean llamadas magic strings, no necesariamente tienen que ser cadenas de texto siempre. Piensa por ejemplo en "número máximo de caracteres" o "tamaño máximo de archivo" como otros ejemplos de magic strings.

¿Quién determina esas constantes o 'magic strings'?

Puedo pensar en 2 formas para determinarlas: a) valores pre-definidos en tu aplicación (por ejemplo, rangos en la base de datos o identificadores internos); o b) valores definidos por servicios externos, por ejemplo, supongamos que usaste un servicio externo para tu página de inicio de sesión y ellos te dijeron que existirán 3 tipos de usuarios: 'GUEST', 'USER' o 'ADMIN'.

¿Cuándo usamos esos 'magic strings'?

Pueden ser utilizados para multiples cosas, pero el uso más común puede ser para tomar diferentes caminos lógicos en tu aplicación.

Echemos un vistazo al siguiente código:

function onLoad() {
  if (process.env.ENVIRONMENT_ID === 'aGVsbG8gd29ybGQ=') {    console.log('It is "hello world" environment')
  }
}

function uploadFile(file) {
  if (file.size > 10000) {    console.error('File size is too big')
  } else {
    console.log('File is uploding')
  }
}

// Invoking those functions
onLoad()
uploadFile(file)

Cómo se puede observar, hay algunos valores hard-coded, lo cual introduce un par de inconvenientes:

  • Tienes que leer completamente el código para entender lo que se espera que pase en cada condicional y así entender qué son esos valores. Si, este código es simple y se puede entender fácilmente... pero ¿qué pasaría si el código no fuera así de simple? ¿Cómo podrías tú o tus compañeros de trabajo entender que significa 'aGVsbG8gd29ybGQ='?
  • Si necesitas alguno de esos valores ('aGVsbG8gd29ybGQ=' o 10000) en otro lugar, podrías terminar con esos valores duplicados en multiples lugares.

Veamos cómo se podría mejorar ese código:

// usually exported from a `constants` fileexport const HELLO_WORLD_ENV_ID = 'aGVsbG8gd29ybGQ='export const MAX_FILE_SIZE = 10000
function onLoad() {
  if (process.env.ENVIRONMENT_ID === HELLO_WORLD_ENV_ID) {    console.log('It is "hello world" environment')
  }
}

function uploadFile(file) {
  if (file.size > MAX_FILE_SIZE) {    console.error('File size is too big')
  } else {
    console.log('File is uploding')
  }
}

// Invoking those functions
onLoad()
uploadFile(file)

Así obtienes multiples beneficios:

  • Solo un lugar donde encontrar/administrar esos valores hard-coded. (Fácil de modificar si los valores son actualizados en el futuro.)
  • Si el valor de la constante es algo extraño o difícil de entender (por ejemplo, 'aGVsbG8gd29ybGQ='), es una gran ventaja poder asignarle un nombre a ese valor pues facilita entender qué es y para qué sirve.
  • Puedes reutilizar esas constantes en otros lugares según se necesite.
  • No necesitas leer todo el código para entender qué son esos valores.

Estándares del código (preferencia personal)

  • Si usas una constante en un solo archivo, deja la constante en ese mismo archivo.
  • Si necesitas la constante en múltiples archivos, crea un archivo constants a un nivel que tenga sentido para todos los archivos que lo requieren (usualmente al nivel de la funcionalidad).
  • Agrupa las constantes por funcionalidad. No crees archivos globales conteniendo todas las constantes de tu aplicación.
  • Escribe el nombre de tus constantes en formato "Screaming Snake Case" (en mayúsculas y separado por _). Esto ayuda a identificarlas fácilmente como constantes inmutables.

Asegúrate de que tu código es claro y fácil de entender por los demás. Intenta que sea lo más reutilizable y escalable posible.

¡No serás la única persona que tocará ese código para siempre!