Qué es
Hardcoded (o “hardcodeado” en spanglish) significa escribir valores fijos directamente en el código fuente, en lugar de obtenerlos de una fuente externa como:
- Variables de entorno
- Archivos de configuración
- Base de datos
- Entrada del usuario
Es una de las malas prácticas más comunes en desarrollo de software.
Pronunciación
IPA: /hɑːrd koʊdɪd/
Suena como: “jard-codid” - dos palabras, la ‘h’ se aspira suavemente
Errores comunes:
- ❌ “ar-coded” (la ‘h’ no es muda en inglés)
- ❌ “hard-codead” (no termina en ‘ead’)
Variantes aceptadas:
- Hard-coded (con guión)
- Hardcoded (junto)
- Hard coded (separado)
Ejemplo: El Número de Teléfono que Nadie Puede Cambiar
Código hardcodeado (MAL)
// ❌ MAL: Número hardcodeado
function enviarSMS(mensaje) {
const telefono = "+52-555-123-4567"; // 😱 Hardcodeado
smsService.send(telefono, mensaje);
}
// ❌ MAL: URL hardcodeada
function obtenerUsuarios() {
const url = "https://api.miempresa.com/users"; // 😱 Hardcodeado
return fetch(url);
}
// ❌ MAL: Credenciales hardcodeadas (PELIGROSO)
function conectarDB() {
const password = "admin123"; // 🚨 NUNCA hagas esto
return db.connect("admin", password);
}
Código correcto (BIEN)
// ✅ BIEN: Desde variable de entorno
function enviarSMS(mensaje) {
const telefono = process.env.SMS_PHONE_NUMBER;
smsService.send(telefono, mensaje);
}
// ✅ BIEN: Desde configuración
function obtenerUsuarios() {
const url = config.api.usersEndpoint;
return fetch(url);
}
// ✅ BIEN: Credenciales desde entorno
function conectarDB() {
const password = process.env.DB_PASSWORD;
return db.connect(process.env.DB_USER, password);
}
Por qué es un problema
| Problema | Consecuencia |
|---|---|
| Difícil de cambiar | Hay que modificar código, recompilar y redesplegar |
| Inseguro | Credenciales expuestas en repositorios |
| No escalable | Diferentes valores para dev/staging/producción |
| Difícil de mantener | Valores dispersos por todo el código |
| Rompe pruebas | No puedes usar valores de prueba fácilmente |
Caso Práctico: La Pizzería y sus Precios
Imagina que tienes un sistema de pedidos para tu pizzería.
Enfoque hardcodeado (problemas garantizados)
# precios.py - ❌ MAL
def calcular_total(pizzas, bebidas):
precio_pizza = 150 # 😱 Hardcodeado
precio_bebida = 35 # 😱 Hardcodeado
iva = 0.16 # 😱 Hardcodeado
subtotal = (pizzas * precio_pizza) + (bebidas * precio_bebida)
return subtotal * (1 + iva)
Problemas:
- El IVA sube a 17% → Hay que buscar todos los “0.16” en el código
- Promoción de pizzas a $120 → Modificar código, probar, desplegar
- Sucursal en otro país con precios diferentes → Imposible
Enfoque con configuración (flexible)
# config.py
PRECIOS = {
"pizza": float(os.getenv("PRECIO_PIZZA", 150)),
"bebida": float(os.getenv("PRECIO_BEBIDA", 35)),
"iva": float(os.getenv("IVA", 0.16)),
}
# precios.py - ✅ BIEN
from config import PRECIOS
def calcular_total(pizzas, bebidas):
subtotal = (pizzas * PRECIOS["pizza"]) + (bebidas * PRECIOS["bebida"])
return subtotal * (1 + PRECIOS["iva"])
Beneficios:
- Cambiar precios sin tocar código
- Diferentes precios por ambiente (dev/prod)
- Promociones instantáneas cambiando variables de entorno
Cuándo SÍ es aceptable hardcodear
A veces tiene sentido tener valores fijos:
// ✅ Constantes matemáticas
const PI = 3.14159265359;
// ✅ Valores que NUNCA cambian
const DIAS_SEMANA = 7;
const HORAS_DIA = 24;
// ✅ Valores por defecto (con opción de override)
const TIMEOUT = config.timeout || 5000; // Default: 5 segundos
// ✅ Enums o estados fijos
const ESTADOS = {
PENDIENTE: "pending",
COMPLETADO: "completed",
CANCELADO: "cancelled"
};
Cómo identificar código hardcodeado
Señales de alerta en tu código:
🚨 Strings con URLs completas
🚨 Números mágicos (42, 1000, 3600)
🚨 Credenciales o tokens
🚨 Rutas de archivos absolutas
🚨 Direcciones de email
🚨 Nombres de servidores
🚨 Puertos específicos
Cómo solucionarlo
1. Variables de entorno
# .env
DATABASE_URL=postgres://user:pass@localhost:5432/mydb
API_KEY=sk-1234567890
MAX_CONNECTIONS=100
2. Archivos de configuración
// config.json
{
"api": {
"baseUrl": "https://api.example.com",
"timeout": 5000
}
}
3. Constantes nombradas
// constants.js
export const MAX_RETRY_ATTEMPTS = 3;
export const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutos
Términos relacionados
- [[Refactoring]] - Proceso de mejorar código sin cambiar su comportamiento
- [[Environment Variables]] - Variables configuradas fuera del código
- [[Configuration Management]] - Gestión de configuración de aplicaciones
Recuerda: Si alguna vez piensas “esto nunca va a cambiar”, probablemente cambiará. Mejor usar configuración desde el inicio.