Atlasingeniería

Code review en la prácticaLos comentarios que vuelven siempreTema 2

Nombres negados, ambiguos o atados a un experimento

«¿Qué significa que esté en false?» es un comentario de review que no se puede contestar bien. Tres familias de nombres que generan trabajo mental en cada lectura, y qué se hace con los que quedaron atados a un experimento que ya terminó.

Un nombre se escribe una vez y se lee cientos. Es la única parte del código donde el costo se paga del lado de quien lee, y por eso es el comentario de review que más se repite después del de las constantes.

No son todos iguales: hay tres familias de nombres problemáticos, y cada una molesta de una forma distinta.

Los negados

Un booleano negado obliga a una traducción mental en cada lectura, y la traducción se rompe apenas aparece una negación alrededor.

El nombreCómo se lee en la condiciónLa versión que no cansa
`isNotAvailable``if (!isNotAvailable)`: doble negación`isAvailable`
`hideBanner``hideBanner === false` para mostrarlo`showBanner`
`disableValidation`Mezcla con `!disable...` en otro módulo`validationEnabled`
La regla práctica: el nombre en positivo y, si hace falta lo contrario, negarlo en el uso.

Lo mismo vale para los parámetros booleanos en una llamada: render(true, false) no se entiende sin ir a la firma. Un objeto con nombres o dos funciones distintas resuelven eso, y aparece seguido como comentario.

Los ambiguos

El segundo grupo son nombres correctos que no dicen lo suficiente. data, info, item, value, handleClick, process. No están mal: están vacíos.

Las preguntas que los arreglan

  1. ¿De qué es? dataorderSummary. El tipo lo dice, pero el nombre es lo que se lee en el uso, veinte líneas después.
  2. ¿En qué unidad o formato? durationdurationMinutes. dateexpiresAt. La mitad de los bugs de fechas y de tiempos son dos partes que asumieron unidades distintas.
  3. ¿Qué hace exactamente? Un nombre que dice validate y además guarda está mintiendo. Si el nombre honesto queda feo —validateAndSave—, eso es información: probablemente sean dos funciones.
  4. ¿Es el singular o el plural correcto? user que en realidad es una lista genera errores reales, no sólo confusión.

Los atados a un experimento

Esta familia es propia de los productos que hacen pruebas A/B, y deja una marca larga. Nombres como newCheckoutVariantB, testHomeV2, expNavbar2024.

Nacen bien: durante el experimento, ese nombre es exactamente lo que el equipo usa para hablar. El problema empieza el día que el experimento gana y la variante se vuelve el producto: el código queda lleno de referencias a un test que ya no existe, y nadie sabe si se puede borrar.

Antes de seguir, predecí

Un experimento terminó y la variante nueva quedó como definitiva. ¿Qué conviene hacer primero?

Ese cambio de limpieza tiene una condición: hay que estar seguro de que la rama perdedora no la usa nadie más. Es el mismo problema que el de borrar código que todavía sirve, y se resuelve igual: buscando referencias fuera del propio módulo antes de borrar.

Un detalle que aparece en equipos que trabajan en dos idiomas

En un equipo donde se conversa en un idioma y se programa en otro, la mezcla se cuela en los nombres: mitad y mitad dentro de la misma función, o un término del dominio traducido en un módulo y sin traducir en otro.

El costo no es estético: es que buscar deja de funcionar. Si el mismo concepto aparece con dos nombres, nadie encuentra todos los lugares donde se usa, y ahí vuelve el problema del principio. Lo que resuelve esto no es una discusión de gustos sino un glosario chico del dominio, acordado una vez.

Más a fondo · nivel seniorCuándo un nombre justifica romper cosas

Renombrar algo público —un campo de una API, una clave de almacenamiento, un evento de analítica— no es refactor: es un cambio de contrato con consumidores que no controlás. Ahí el nombre malo a veces se queda, y lo correcto es acotar el daño: que el nombre feo viva sólo en el borde y que adentro se use el bueno, con una traducción en un solo lugar.

Los tres tipos, en un diff

src/access/can-view-invoice.ts+9−1

Hay 4 problemas en este cambio. Tocá la línea donde creas que está.

@@ -3,9 +3,17 @@ import { currentUser } from '../session';
33
44
55
6
6
7
8
9
10
11
12
13
14
715

Tres nombres y una función de permisos que ya no se puede leer de corrido.

El costo de un nombre

Cierre

Autoevaluación

¿Lo entendiste?

¿Por qué molesta un booleano llamado `isNotAvailable`?
Una función llamada `validateOrder` también persiste el pedido. ¿Cuál es la mejor lectura de esa señal?