Durante la resolución de los Desafíos de Lógica de Programación, me surgió una pregunta importante:
¿Deberíamos validar las entradas del usuario aunque el ejercicio no lo requiera explícitamente?
Mi respuesta es un SÍ, y aquí te explico por qué.
Código Original (Sin Validaciones)
// Enfoque básico del ejercicio
let nombre = prompt("Ingresa tu nombre:");
let edad = prompt("Ingresa tu edad:");
if (edad >= 18) {
alert("Puedes obtener la licencia");
} else {
alert("No puedes obtener la licencia");
}
Problemas Identificados
- Datos Vacíos: ¿Qué pasa si el usuario no ingresa nada?
- Datos Inválidos: ¿Y si ingresa texto en lugar de números?
- Cancelación: ¿Cómo manejamos cuando presiona "Cancelar"?
- Experiencia del Usuario: Sin feedback claro sobre errores
Mi Solución: Sistema de Validaciones
Arquitectura de Validación
He implementado un sistema modular compuesto por:
1. Validadores Específicos
/**
* Valida si un texto no está vacío
* @param {string} valor - Valor a validar
* @returns {boolean} True si es válido
*/
function esTextoValido(valor) {
return valor !== null && valor.trim() !== "";
}
/**
* Valida si una edad es válida (1-150 años)
* @param {string} edad - Edad como string
* @returns {boolean} True si es válido
*/
function esEdadValida(edad) {
const edadNum = parseInt(edad);
return !isNaN(edadNum) && edadNum > 0 && edadNum <= 150;
}
/**
* Valida formato de nombre (solo letras y espacios)
* @param {string} nombre - Nombre a validar
* @returns {boolean} True si es válido
*/
function esNombreValido(nombre) {
if (!esTextoValido(nombre)) return false;
const nombreLimpio = nombre.trim();
const regex = /^[a-zA-ZáéíóúÁÉÍÓÚñÑ\s]{2,50}$/;
return regex.test(nombreLimpio);
}
2. Función Genérica de Validación
/**
* Solicita datos con validación automática y reintentos
* @param {string} mensaje - Mensaje del prompt
* @param {Function} validador - Función de validación
* @param {string} mensajeError - Mensaje de error personalizado
* @returns {string|null} Valor válido o null si se cancela
*/
function solicitarDatoConValidacion(mensaje, validador, mensajeError = "Dato inválido") {
let valor;
do {
valor = prompt(mensaje);
if (valor === null) return null; // Usuario canceló
if (!validador(valor)) {
alert(mensajeError);
}
} while (!validador(valor));
return valor.trim();
}
3. Implementación en el Código
// Antes (vulnerable)
const nombre = prompt("Ingresa tu nombre:");
// Después (robusto)
const nombre = solicitarDatoConValidacion(
"Por favor, ingresa tu nombre:",
esNombreValido,
"Por favor, ingresa un nombre válido (solo letras y espacios, 2-50 caracteres)."
);
if (nombre === null) {
console.log("Usuario canceló la operación");
return;
}
Mi Recomendación:
"Mejor validar de más que de menos. Es más fácil quitar validaciones que agregarlas después."
Lecciones Aprendidas
- Piensa más allá del ejercicio: ¿Qué puede fallar?
- La experiencia del usuario importa: Siempre
- El código robusto ahorra tiempo: A largo plazo
- Las validaciones son una inversión: No un costo