Código Duplicado: DRY o Muere en el Intento

“No te repitas” es una de las reglas más antiguas en la programación—y, sin embargo, seguimos haciéndolo. Copiar y pegar lógica es rápido… hasta que se rompe en cuatro lugares al mismo tiempo.

Este artículo explora el code smell de Código Duplicado, por qué es perjudicial a largo plazo y nos presenta posibles soluciones.

¿Qué es el Código Duplicado?

El Código Duplicado ocurre cuando el mismo código (o muy parecido) aparece en múltiples lugares.

Esto incluye:

  • Clones exactos de funciones o bloques
  • Versiones ligeramente modificadas de la misma lógica
  • Constantes o cálculos repetidos

Esto hace que tu código sea:

  • Difícil de mantener
  • Propenso a errores (lo arreglas en un lugar, pero se te olvida en otro)
  • Más largo y difícil de leer

Antes: Nos Repetimos

Supongamos que necesitamos imprimir los datos del cliente tanto en una factura como en una etiqueta de envío. Así es como podría verse un mal código:

function printCustomerInvoice(customer: Customer) {
  console.log(`${customer.name}, ${customer.address}, ${customer.city}`);
}

function printShippingLabel(customer: Customer) {
  console.log(`${customer.name}, ${customer.address}, ${customer.city}`);
}

Esto podría parecer algo pequeño, pero implica que cuando necesites agregar un código postal o formatear la dirección, tendrás que hacer el cambio en varios lugares.

Después: Extraer a un Método Compartido

La solución es simple y poderosa: extrae la lógica repetida en una función compartida.

function formatCustomerAddress(customer: Customer): string {
  return `${customer.name}, ${customer.address}, ${customer.city}`;
}

function printCustomerInvoice(customer: Customer) {
  console.log(formatCustomerAddress(customer));
}

function printShippingLabel(customer: Customer) {
  console.log(formatCustomerAddress(customer));
}

¿Por Qué Funciona Esto?

  • Solo un lugar que actualizar cuando cambie el formato
  • Más fácil escribir pruebas unitarias para el formato de dirección
  • Mejora la consistencia entre funcionalidades

Extra: DRY en Bucles, Condicionales y Clases

Aquí tienes otra versión común de este code smell: lógica condicional duplicada.

if (user.age > 18 && user.status === 'active') {
  // do something
}

...

if (user.age > 18 && user.status === 'active') {
  // do something else
}

Refactoriza a una función reutilizable:

function isActiveAdult(user: User): boolean {
  return user.age > 18 && user.status === 'active';
}

Ahora podemos:

if (isActiveAdult(user)) {
  // do something
}

¿Qué Ha Mejorado?

Esto es lo que hemos ganado:

  • Una fuente única de la verdad
  • Actualizaciones más simples
  • Pruebas más fáciles
  • Mayor consistencia
  • Funciones más cortas y claras

¿Por Qué Importa Esto?

El código duplicado no solo desperdicia espacio—también amplifica el riesgo.

Una pequeña corrección de errores se convierte en una búsqueda del tesoro.

Las inconsistencias se van colando con el tiempo.

Las pruebas se vuelven más difíciles de mantener y confiar.

Al centralizar la lógica compartida:

  • Mejoras la mantenibilidad
  • Reduces errores
  • Aceleras el refactoring
  • Haces tu código más fácil de entender y reutilizar por otros desarrolladores

El código limpio no se trata solo de estética—se trata de construir software que sobreviva al cambio.

Reconocimientos

El concepto de code smells, incluido el Código Duplicado, fue introducido por Martin Fowler en Refactoring: Improving the Design of Existing Code, basado originalmente en ideas de Kent Beck.

Escribir comentario

* Estos campos son obligatorios

Comentarios

Sin comentarios