Refactorizar con IA sin cambiar lo que hace el código
Refactorizar es mejorar cómo está escrito el código sin cambiar lo que hace. La IA lo hace rápido, pero a menudo cambia más de lo que le pides. Aprende a fijar el comportamiento con console.assert, pedir un cambio cada vez y comprobar que todo sigue igual.
Refactorizar es cambiar la forma del código (nombres, duplicación, funciones) sin cambiar lo que hace.
Antes de tocar nada, fija el comportamiento: unas pocas comprobaciones con console.assert que digan qué salida esperas para cada entrada.
Pide a la IA un cambio cada vez y con nombre («extrae una función», «elimina la duplicación»), y prohíbele cambiar resultados o nombres que se usan desde fuera.
Después de cada cambio, vuelve a ejecutar las comprobaciones y revisa el diff. Si algo cambia, averigua por qué antes de seguir.
- Cambiar cómo está escrito el código sin cambiar lo que hace.
- Refactorizar es reorganizar el código para que sea más fácil de leer y de cambiar: quitar duplicación, dar nombres claros, partir una función enorme en varias pequeñas. Lo que no cambia es el comportamiento: con las mismas entradas, las mismas salidas.
- Las IA proponen refactorizaciones con facilidad, pero tienden a «mejorar» de paso otras cosas: cambian un redondeo, el orden de una lista, el valor por defecto de un parámetro o cómo se trata una lista vacía. Cada una de esas mejoras es un cambio de comportamiento escondido dentro de un cambio de forma.
- Unas pocas comprobaciones con console.assert.
- console.assert(condición, mensaje) no hace nada si la condición se cumple y muestra el mensaje en la consola si no. Escribe tres o cuatro con entradas y salidas que conoces: un caso normal, uno raro (una lista vacía, un cero) y uno en el límite.
Qué es refactorizar
Cambiar cómo está escrito el código sin cambiar lo que hace.
Refactorizar es reorganizar el código para que sea más fácil de leer y de cambiar: quitar duplicación, dar nombres claros, partir una función enorme en varias pequeñas. Lo que no cambia es el comportamiento: con las mismas entradas, las mismas salidas.
Las IA proponen refactorizaciones con facilidad, pero tienden a «mejorar» de paso otras cosas: cambian un redondeo, el orden de una lista, el valor por defecto de un parámetro o cómo se trata una lista vacía. Cada una de esas mejoras es un cambio de comportamiento escondido dentro de un cambio de forma.
Antes de tocar nada: fija el comportamiento
Unas pocas comprobaciones con console.assert.
console.assert(condición, mensaje) no hace nada si la condición se cumple y muestra el mensaje en la consola si no. Escribe tres o cuatro con entradas y salidas que conoces: un caso normal, uno raro (una lista vacía, un cero) y uno en el límite.
Ejecútalas antes del cambio: tienen que pasar todas en silencio. Si alguna falla ya antes, no es un problema de la refactorización: has encontrado un fallo, y se arregla por separado.
En proyectos más grandes estas comprobaciones se convierten en tests con herramientas como Vitest; la idea es la misma.
Pide un cambio cada vez, con nombre
Pide «extrae una función», no «mejóralo».
Después de cada cambio: compara
Ejecuta las comprobaciones y revisa el diff.
Vuelve a ejecutar las comprobaciones. Si alguna avisa, la refactorización ha cambiado el comportamiento: descarta el cambio o pide a la IA que explique qué ha hecho distinto.
Revisa también el diff (lo viste en la lección del agente): en una refactorización buena, las líneas cambian de sitio o de nombre, pero no aparecen números nuevos, condiciones distintas ni casos que antes no existían. Y haz un commit por cada cambio que funcione: si el siguiente sale mal, vuelves a ese punto.
Señales de un cambio de comportamiento escondido
Si ves esto en el diff de una refactorización, pregunta.
- Números distintos: un redondeo, un límite, un valor por defecto.
- Condiciones nuevas o que desaparecen (if (!lista.length) return … donde antes no había nada).
- Cambios de orden: un sort añadido, un reverse quitado.
- Nombres de funciones, clases o ids que se usan desde el HTML u otros ficheros.
- Dependencias nuevas «para simplificar».