Atlasingeniería

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

El helper ya existía: buscar antes de escribir

Formatear una fecha, armar una URL con parámetros, calcular si algo está vigente. Todo eso ya estaba escrito en el repositorio, y la copia nueva no es sólo trabajo duplicado: es una segunda versión que se va a comportar distinto.

El comentario llega en una línea: «esto ya existe en shared». Duele un poco porque uno acaba de escribirlo y funciona. Pero el problema no es el tiempo perdido —eran veinte minutos—, sino lo que pasa dentro de seis meses.

Cuando hay dos funciones que hacen casi lo mismo, alguien arregla un bug en una. La otra sigue andando mal, y nadie sabe que existe.

Lo que siempre ya estaba escrito

Lo que se escribió de nuevoDónde estabaQué hacía distinto la versión vieja
Formatear un importeUtilidad compartida de monedaContemplaba el separador y la moneda por país
Armar una URL con parámetrosConstructor del módulo de navegaciónEscapaba los valores y respetaba la marca activa
Saber si una promoción está vigenteServicio de dominioComparaba en la zona horaria correcta, no en la del navegador
Agrupar una lista por una claveUtilidad genérica del proyectoManejaba la clave ausente en vez de crear un grupo `undefined`
En los cuatro casos, la copia nueva funcionaba para el caso que se estaba probando.

Ese es el patrón: la versión nueva no está mal, está incompleta. Cubre el caso de quien la escribió y no los tres casos raros que la vieja fue absorbiendo con el tiempo. Y esos casos raros son, casi siempre, bugs que alguien ya reportó.

Por qué no se busca

Nadie duplica por comodidad. Las razones que aparecen son concretas y tienen solución.

Las cuatro razones reales

  1. No se sabe cómo se llama. Buscar formatDate no encuentra toDisplayDate. La búsqueda por nombre falla justo cuando el vocabulario del proyecto no es el propio.
  2. Está en un módulo que uno no conoce. En un repositorio grande, media base de código es territorio ajeno.
  3. Se encontró, y no parecía servir. Tenía un parámetro de más o devolvía otra forma. Extenderla se siente más riesgoso que escribir una nueva.
  4. Apuro. El ticket estaba vencido ayer.

Cuando existe pero no alcanza

El caso interesante no es el helper idéntico sino el parecido. Ahí hay tres salidas y la equivocada es la primera.

Antes de seguir, predecí

Existe una función que hace el 80% de lo que necesitás. ¿Qué conviene?

La señal de que hay que separar en vez de extender es el nombre: si para nombrar bien la función extendida hace falta una conjunción, son dos cosas distintas.

Lo que hace el equipo para que se encuentre

Esto no se arregla pidiéndole a la gente que busque mejor. Se arregla haciendo que lo compartido sea encontrable.

Cuatro cosas que bajan la duplicación de verdad

  1. Un lugar obvio. Un solo módulo compartido por tipo de cosa, no utilidades desperdigadas por cada carpeta de funcionalidad.
  2. Vocabulario acordado. Si el equipo dice “vigencia”, que la función se llame así y no validity en un módulo y activeRange en otro.
  3. Que el review lo señale sin culpa. “Esto ya está en X” es información, no una corrección. El costo de escribirlo de nuevo ya se pagó; lo que se evita es el segundo mantenimiento.
  4. Borrar la duplicación cuando aparece. Encontrar dos versiones y dejarlas porque “las dos funcionan” es la forma en que se llega a cinco.
Más a fondo · nivel seniorEl reuso también tiene un costo

La otra cara: no todo lo parecido debe unificarse. Dos funciones que hoy hacen lo mismo por coincidencia, pero pertenecen a dominios distintos, se van a separar en el futuro, y unificarlas crea un acoplamiento entre partes que no tienen nada que ver. La pregunta no es “¿el código es igual?” sino “¿si cambia una, tiene que cambiar la otra?”. Si la respuesta es no, son dos cosas.

Lo que ya estaba escrito

src/reports/export-csv.ts+16−0

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

@@ -1,4 +1,22 @@
11
22
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Cuatro utilidades escritas a mano, tres con bugs que la versión compartida ya no tiene.

Que lo existente se encuentre

Cierre

Autoevaluación

¿Lo entendiste?

¿Cuál es el costo principal de duplicar una utilidad?
¿Cuándo NO conviene unificar dos funciones que hacen lo mismo?