No Te Repitas
Cada pieza de conocimiento debe tener una única representación autorizada en el código.
La Duplicación Es la Raíz de Todo Mal
Cada vez que copias y pegas código, creas dos lugares que deben cambiar juntos — pero no lo harán. DRY no es solo sobre duplicación de código. Es sobre duplicación de conocimiento: si la misma regla de negocio vive en dos lugares, cada corrección de bug debe aplicarse dos veces, y alguien fallará. La base de código miente hasta que ambas copias se actualicen.
Tasa de impuesto duplicada
function calculateOrderTotal(order):
return order.subtotal * 1.08 // 8% tax
function calculateInvoiceTotal(invoice):
return invoice.amount * 1.08 // 8% tax — copy-pasted
function calculateRefundAmount(order):
return order.subtotal * 1.08 // 8% tax — now in 3 places
Fuente única de verdad
TAX_RATE = 1.08 // change here → changes everywhere
function calculateOrderTotal(order):
return order.subtotal * TAX_RATE
function calculateInvoiceTotal(invoice):
return invoice.amount * TAX_RATE
function calculateRefundAmount(order):
return order.subtotal * TAX_RATE
Duplicación Estructural
La duplicación no siempre es una copia exacta. A veces es la misma estructura repetida: la misma lógica de validación escrita con nombres de variables ligeramente diferentes, el mismo patrón de manejo de errores copiado en 10 endpoints de API, la misma query de BD con una cláusula WHERE diferente. Abstrae el patrón, parametriza la variación.
// ✗ Same structure, different subject — 3x duplication
function validateUserName(name):
if not name or length(name) < 2:
raise ValueError("Name must be at least 2 characters")
function validateUserEmail(email):
if not email or length(email) < 5:
raise ValueError("Email must be at least 5 characters")
function validateUserBio(bio):
if not bio or length(bio) < 10:
raise ValueError("Bio must be at least 10 characters")
// ✓ Abstract the pattern, parameterize the variation
function validateMinLength(value, fieldName, minLen):
if not value or length(value) < minLen:
raise ValueError(fieldName + " must be at least " + minLen + " characters")
function validateUser(user):
validateMinLength(user.name, "Name", minLen: 2)
validateMinLength(user.email, "Email", minLen: 5)
validateMinLength(user.bio, "Bio", minLen: 10)El DRY Equivocado — No Sobre-Abstraigas
DRY trata sobre la duplicación de conocimiento, no de similitud textual. Dos funciones que parecen iguales pero representan diferentes reglas de negocio deben permanecer separadas — unirlas acopla conceptos que pueden evolucionar de forma diferente. Pregunta: "¿Si una cambia, la otra también debe cambiar?" Si no, no son el mismo conocimiento. El DRY prematuro crea la abstracción equivocada, lo cual es peor que la duplicación.
Abstracción equivocada
// Looks like duplication — but they're different rules
function calculateEmployeeBonus(salary):
return salary * 0.10
function calculateContractorBonus(rate):
return rate * 0.10
// "DRY" merge — now they're coupled:
function calculateBonus(amount):
return amount * 0.10
// Problem: employee rate changes to 12%,
// contractor stays at 10% — now you must un-merge
Mismo texto, distinto conocimiento → mantén separados
EMPLOYEE_BONUS_RATE = 0.10
CONTRACTOR_BONUS_RATE = 0.10 // same today, may diverge tomorrow
function calculateEmployeeBonus(salary):
return salary * EMPLOYEE_BONUS_RATE
function calculateContractorBonus(rate):
return rate * CONTRACTOR_BONUS_RATE
Desafío de Código
La lógica de validación aparece 3 veces. Extráela una vez. Luego observa que el patrón de creación también se repite — extráelo también.
💡Conclusión clave
DRY trata sobre el conocimiento, no sobre el texto. Una regla de negocio = un lugar en el código. Pero no unas cosas que solo parecen similares — pueden divergir.
🔧 Algunos ejercicios pueden tener errores. Si algo parece incorrecto, usa el botón Feedback (abajo a la derecha) para reportarlo — nos ayuda a corregirlo rápido.
Pista: Encuentra qué *cambia* y qué *permanece igual* en los bloques repetidos. Lo que permanece igual → extrae a una función. Lo que cambia → conviértelo en parámetro de esa función.
✗ Tu versión