Simyl
simylflow
Inicio del curso
Módulo 2: Prácticas Técnicas
Lección 3 de 5
12 min

Refactorización

Mejorar el código sin cambiar lo que hace. La disciplina que mantiene saludables las bases de código.

1Qué es la Refactorización (y qué no es)

Refactorización es mejorar la estructura interna del código sin cambiar su comportamiento externo.

Esa definición tiene dos partes críticas:

Mejorar la estructura: Hacer que el código sea más fácil de entender, modificar o extender. Esto incluye mejores nombres, funciones más pequeñas, organización más clara, menos duplicación.

Sin cambiar el comportamiento: El código hace exactamente lo que hacía antes. Las entradas producen las mismas salidas. Los efectos secundarios son idénticos. Las pruebas siguen pasando.

La refactorización no es:

  • Reescribir desde cero
  • Agregar funcionalidades
  • Corregir errores
  • Optimización de rendimiento (usualmente)

Si estás cambiando lo que hace el código, no estás refactorizando—estás haciendo otra cosa. La refactorización se trata específicamente de estructura, no de comportamiento.

La refactorización es como limpiar tu cocina. La comida sigue sabiendo igual. Pero cocinar se vuelve más fácil, más rápido y menos frustrante.

2El Catálogo de Refactorización

Martin Fowler documentó docenas de refactorizaciones específicas, cada una con:

  • Un nombre (para que los equipos puedan comunicarse)
  • Una motivación (cuándo usarla)
  • Mecánica (paso a paso de cómo hacerlo de forma segura)

Aquí hay algunas que usarás constantemente:

Extraer Función: Toma algo de código y ponlo en una nueva función con un nombre claro. Esta es probablemente la refactorización más común.

Renombrar: Cambia el nombre de una variable, función o clase para expresar mejor su propósito. Los buenos nombres son sorprendentemente importantes.

Función en Línea: Lo opuesto de extraer—reemplaza una llamada a función con su cuerpo. Úsala cuando una función no agrega claridad.

Extraer Variable: Toma una expresión compleja y dale un nombre asignándola a una variable.

Mover Función: Mueve una función a una clase donde tenga más sentido.

Reemplazar Condicional con Polimorfismo: Reemplaza declaraciones complejas if/else o switch con despacho orientado a objetos.

Estas no son refactorizaciones "avanzadas". Son herramientas cotidianas. Apréndelas hasta que sean automáticas.

3Refactorizar de Forma Segura

La refactorización solo es segura cuando tienes pruebas. Sin pruebas, cada cambio podría romper algo, y no lo sabrás hasta producción.

El proceso de seguridad:

  1. Asegúrate de que las pruebas pasen antes de comenzar
  2. Haz un pequeño cambio
  3. Ejecuta las pruebas
  4. Si las pruebas pasan, continúa; si fallan, revierte inmediatamente
  5. Repite

Los pasos pequeños son clave. No intentes refactorizar cinco cosas a la vez. Extrae una función, ejecuta las pruebas, haz commit. Renombra una variable, ejecuta las pruebas, haz commit. De esta manera, si algo se rompe, sabes exactamente qué lo causó.

Los IDEs modernos tienen refactorizaciones automatizadas que son más seguras que los cambios manuales. "Renombrar" en tu IDE actualiza todas las referencias. "Extraer Función" crea la función y actualiza el sitio de llamada. Usa estas herramientas.

La Regla del Boy Scout: Deja el código mejor de lo que lo encontraste. Cuando toques código por cualquier razón, haz una pequeña mejora. Con el tiempo, la base de código se vuelve más limpia en lugar de más sucia.

Sin Pruebas = Sin Seguridad

Refactorizar sin pruebas es solo cambiar código y esperar. No es refactorización—es apostar.

4Cuándo Refactorizar

Refactoriza constantemente. La refactorización no es una fase o sprint separado. Es continua.

Disparadores específicos para refactorizar:

Antes de agregar una funcionalidad: Si la estructura actual hace que la funcionalidad sea difícil de agregar, refactoriza primero. Haz el cambio fácil, luego haz el cambio fácil.

Después de hacer que una prueba pase: Este es el "refactorizar" en rojo-verde-refactorizar. Limpia antes de pasar a la siguiente prueba.

Cuando notes un code smell: Código duplicado, métodos largos, nombres poco claros, condicionales complejos—estas son señales de que se necesita refactorización.

Durante la revisión de código: Si ves algo que mejorarías, hazlo o anótalo para después.

Cuando tengas tiempo: Ten un "backlog de refactorización" de problemas conocidos. Cuando tengas holgura, toma algo de la lista.

No refactorices cuando:

  • No tengas pruebas
  • Estés por lanzar (estabiliza, no cambies)
  • No entiendas qué hace el código (entiende primero)

5Deuda Técnica y Refactorización

Deuda técnica es el costo acumulado de tomar atajos. Cada vez que dices "limpiaré esto después" y no lo haces, agregas deuda. Cada vez que copias y pegas en lugar de extraer, agregas deuda.

La deuda acumula intereses. El código desordenado toma más tiempo en cambiar. Los errores se esconden en la complejidad. Los nuevos miembros del equipo luchan por entender. El costo del cambio aumenta.

La refactorización es cómo pagas la deuda. La refactorización regular mantiene la deuda manejable. Descuidar la refactorización deja que la deuda se acumule hasta que la base de código se vuelve inmanejable.

La idea clave: La refactorización no es un lujo. Es mantenimiento esencial. No pides permiso para pagar la deuda—simplemente lo haces como parte de tu trabajo.

XP integra la refactorización en el proceso. Cada funcionalidad, cada corrección de error, cada tarea incluye tiempo para dejar el código mejor de lo que lo encontraste. No necesitas un "sprint de refactorización"—necesitas un hábito de refactorización.

Buena Práctica de Refactorización

Al corregir un error, notas código duplicado cerca. Corriges el error primero (cambio de comportamiento), luego extraes la duplicación en una función (refactorización). Dos commits: corrección de error, luego refactorización.

Refactorización Mal Hecha

Mientras agregas una funcionalidad, decides también refactorizar el sistema de autenticación, reorganizar la estructura de carpetas y actualizar el esquema de la base de datos. Pierdes el rastro de qué cambió, las pruebas fallan misteriosamente y pasas horas depurando.

Conclusiones clave
  • La refactorización mejora la estructura del código sin cambiar el comportamiento
  • Las pruebas son esenciales—refactorizar sin pruebas es solo cambiar código y esperar
  • Da pasos pequeños: un cambio, ejecuta las pruebas, repite
  • Usa la Regla del Boy Scout: deja el código mejor de lo que lo encontraste
  • La refactorización es continua, no una fase separada—intégrala en el trabajo diario
Errores comunes a evitar
  • Refactorizar y agregar funcionalidades al mismo tiempo (haz una cosa o la otra)
  • Refactorización de big-bang en lugar de pasos pequeños
  • Refactorizar sin pruebas (demasiado arriesgado)
  • Pedir permiso para refactorizar (es parte del trabajo)

Ejercicios prácticos