Glosario Técnico

DRY

Don't Repeat Yourself

Definición: DRY (Don't Repeat Yourself - "No Te Repitas") es un principio de desarrollo de software que establece que cada pieza de conocimiento debe tener una única representación autoritativa dentro de un sistema.

— Fuente: NERVICO, Consultoría de Desarrollo de Software

Qué es DRY

DRY fue formulado por Andy Hunt y Dave Thomas en su libro "The Pragmatic Programmer" (1999). La idea central es simple: si un conocimiento está duplicado, eventualmente las copias divergirán y tendrás bugs.

Pero ojo: DRY no es solo sobre código duplicado. Es sobre conocimiento duplicado. Dos líneas de código idénticas pueden representar conocimientos diferentes (y está bien). Dos líneas diferentes pueden representar el mismo conocimiento (y eso es un problema).

Por Qué la Duplicación es Peligrosa

  • Cambios olvidados: Cambias una copia pero olvidas las otras. Bug asegurado.
  • Inconsistencia: Diferentes partes del sistema se comportan diferente para lo mismo.
  • Mantenimiento multiplicado: Cada copia hay que mantenerla, testearla, documentarla.
  • Comprensión difícil: ¿Cuál es la versión "oficial"? ¿Por qué hay diferencias?

Tipos de Duplicación

Duplicación Impuesta

El entorno te obliga a duplicar. APIs que requieren el mismo dato en varios sitios, frameworks que necesitan configuración redundante. Minimiza el impacto aislando la duplicación y generando código donde sea posible.

Duplicación Accidental

No te das cuenta de que ya existe. El equipo no conoce todo el código, o la búsqueda es difícil. Solución: mejor documentación, code reviews, comunicación.

Duplicación Perezosa

Es más fácil copiar y pegar que pensar. Todos lo hemos hecho. La solución es disciplina y code reviews que lo detecten.

Duplicación "Falsa"

Código que parece duplicado pero representa conceptos diferentes. Dos funciones que calculan "precio" pero una es para inventario y otra para facturación. No unifiques esto — son conocimientos diferentes que evolucionarán de forma independiente.

Cómo Aplicar DRY

Extrae Funciones

Si copias un bloque de código, probablemente es una función esperando a nacer. Dale un nombre que explique qué hace, no cómo lo hace.

Usa Constantes

Valores mágicos repetidos (URLs, configuraciones, mensajes) deben estar en un solo lugar. Si el valor cambia, cambias una línea.

Crea Abstracciones

Patrones repetidos de código pueden ser clases base, mixins, decoradores o funciones de orden superior.

Genera Código

Si la duplicación es inevitable (schemas, DTOs, configuraciones), genera el código desde una única fuente de verdad.

El Error de Aplicar DRY Demasiado Pronto

DRY prematuro es tan malo como la duplicación. Antes de extraer código común, necesitas ver el patrón al menos tres veces (la "Regla del Tres").

Si unificas código demasiado pronto, puedes crear abstracciones incorrectas que luego son difíciles de deshacer. A veces es mejor tener código duplicado por un tiempo hasta entender qué tienen realmente en común.

DRY vs WET

WET (Write Everything Twice, o "We Enjoy Typing") es lo opuesto a DRY. Pero existe también el concepto de "WET when appropriate" — duplicar cuando:

  • El código parece igual pero representa conceptos diferentes
  • La abstracción sería más compleja que la duplicación
  • Los casos evolucionarán de forma independiente
  • La duplicación es pequeña y localizada

Ejemplos Prácticos

Mal: Validación Duplicada

Validas email en el frontend, en el backend y en la base de datos con regex diferentes. Cuando cambia el requisito, olvidas actualizar uno.

Solución: Una única función de validación compartida o generada.

Mal: Configuración Dispersa

La URL de la API está hardcodeada en 15 archivos diferentes.

Solución: Una constante o variable de entorno en un solo lugar.

Bien: Código Similar pero Diferente

calcularPrecioVenta() y calcularPrecioCompra() tienen lógica parecida pero reglas de negocio diferentes. Mantenerlos separados permite que evolucionen independientemente.

Términos Relacionados

¿Tu código necesita refactorización?

Te ayudamos a identificar y eliminar duplicación, creando abstracciones que tengan sentido.