Atlasingeniería

Code review en la prácticaCambios de comportamiento que el diff no muestraTema 4

Multimarca y multipaís: un identificador no es el otro

En una aplicación con varias marcas y países, la mitad de los bugs raros salen de haber usado un identificador donde iba otro. Marca, país, idioma, moneda y mercado son cinco cosas distintas que casi siempre coinciden, hasta que no.

En un producto que opera varias marcas en varios países, hay cinco datos que viajan juntos casi siempre: la marca, el país, el idioma, la moneda y el mercado. Como casi siempre coinciden, se usan indistintamente.

Y un día aparece la excepción: un país con dos idiomas, una marca que opera en tres países, un país donde se factura en otra moneda. Ahí el código que usaba uno por otro deja de funcionar, y el error es difícil de encontrar porque es correcto en el 95% de los casos.

Las cinco dimensiones

DatoDecideDónde se rompe al confundirlo
MarcaIdentidad visual, dominio, catálogo, condiciones comercialesMandar a alguien al sitio de otra marca del grupo
PaísImpuestos, medios de pago, requisitos legales, formato de documentoValidar un identificador fiscal con la regla equivocada
IdiomaLos textosUn país con dos idiomas oficiales muestra el que no corresponde
MonedaCómo se muestra y se cobraFormatear con el símbolo correcto y el separador de otro país
Mercado o regiónQué funcionalidades están habilitadasHabilitar algo que en esa plaza todavía no existe
Que coincidan en la mayoría de los casos es justo lo que hace difícil detectar la confusión.

El caso del idioma es el más recordable: derivar el idioma del país funciona hasta que aparece el primer mercado bilingüe, y ahí no hay un solo lugar que arreglar sino todos los que hicieron la misma suposición.

Qué se comenta en la review

Cuatro señales concretas

  1. Un switch por marca que en realidad depende del país. Anda porque hoy cada marca opera en un solo país. El día que una marca entra a otro mercado, hay que reescribirlo entero.
  2. Formatos derivados del idioma. Fechas y números dependen de la convención local, que va con el país, no con el idioma del texto.
  3. Un identificador de marca usado como clave de traducción. Mezcla dos conjuntos que crecen por motivos distintos.
  4. Un default que cae a la marca o al país principal. Lo más peligroso del conjunto: en vez de no mostrar algo, muestra el contenido de otra marca.

Reglas que sostienen esto en el tiempo

Cinco decisiones que evitan la familia entera de bugs

  1. Tipos distintos para cosas distintas. Si marca, país e idioma son todos cadenas, nada impide pasar una donde va otra. Con tipos separados, el compilador lo impide.
  2. Una sola fuente de la configuración por mercado. Una tabla que diga, para cada combinación, qué moneda, qué idiomas y qué funcionalidades. No condicionales repartidos.
  3. Nunca derivar una dimensión de otra. Si hace falta el idioma, que llegue el idioma.
  4. El caso desconocido no cae a nada: se registra y se oculta la funcionalidad, en vez de asumir el valor principal.
  5. Probar con al menos dos configuraciones distintas. Un único conjunto de datos de prueba con la marca principal esconde todos los problemas de este tipo.

Antes de seguir, predecí

Hay que mostrar el precio de un producto. ¿De qué dato tiene que salir la moneda?

Las cinco que casi siempre coinciden

Las cinco dimensiones que viajan juntas. En las primeras configuraciones coinciden perfectamente.

1 / 6
Las primeras filas se pueden atender usando cualquiera de las cinco columnas como si fuera la otra, y por eso el error entra. Las últimas son las que lo rompen, y son reales: si el código pregunta «¿qué país es?» para decidir el idioma, Canadá ya lo rompe.

Cómo no se propaga el problema

Cierre

Autoevaluación

¿Lo entendiste?

¿Por qué es riesgoso derivar el idioma a partir del país?
Llega un identificador de marca que no está en la lista. ¿Qué es lo más seguro?