Implementé los 5 desafíos adicionales de lógica de programación aplicando validaciones. Quiero compartir las técnicas de validación que utilicé y abrir el debate sobre mejores enfoques.
Desafíos Implementados
Desafío 02.1 - Validación de Días de la Semana
Reto: Verificar que el usuario ingrese un día válido
function esDiaValido(dia) {
if (!esTextoValido(dia)) return false;
const diasValidos = ['lunes', 'martes', 'miércoles', 'miercoles',
'jueves', 'viernes', 'sábado', 'sabado', 'domingo'];
return diasValidos.includes(dia.toLowerCase().trim());
}
Decisiones de diseño:
- Soporte para acentos y sin acentos (
miércoles
/miercoles
) - Case-insensitive y trim automático
- Array centralizado para fácil mantenimiento
¿Qué opinan? ¿Debería usar regex o esta aproximación con arrays es más legible?
Desafío 02.2 - Validación de Números
Reto: Distinguir entre números positivos, negativos y cero
function esNumeroValido(numero) {
if (!esTextoValido(numero)) return false;
const numeroNum = parseFloat(numero);
return !isNaN(numeroNum) && isFinite(numeroNum);
}
Decisiones de diseño:
- Soporte para enteros y decimales
- Validación con
isFinite()
para rechazarInfinity
parseFloat()
en lugar deparseInt()
para decimales
Pregunta para debate: ¿Es mejor ser estricto con solo enteros o permitir decimales? ¿parseFloat
vs Number()
?
Desafío 02.3 - Validación de Puntuación
Reto: Validar puntuación de juego en rango específico
function esPuntuacionValida(puntuacion) {
if (!esTextoValido(puntuacion)) return false;
const puntuacionNum = parseFloat(puntuacion);
return !isNaN(puntuacionNum) && puntuacionNum >= 0 && puntuacionNum <= 1000;
}
** Decisiones de diseño:**
- Rango lógico (0-1000) para puntuaciones de juego
- Permite decimales (¿puntuaciones fraccionarias?)
- Validación explícita de límites
¿Controversial? ¿Deberían las puntuaciones de juegos ser solo enteros? ¿Rango 0-1000 o 0-100?
Desafío 02.5 - Validación de Nombres
Reto: Validar nombres con caracteres especiales del español
function esNombreValido(nombre) {
if (!esTextoValido(nombre)) return false;
const nombreLimpio = nombre.trim();
const regex = /^[a-zA-ZáéíóúÁÉÍÓÚñÑ\s]{2,50}$/;
return regex.test(nombreLimpio);
}
Decisiones de diseño:
- Soporte completo para acentos españoles
- Longitud mínima (2) y máxima (50)
- Solo letras y espacios (sin números ni símbolos)
Debate cultural: ¿Es correcto limitar a solo caracteres latinos? ¿Qué pasa con nombres de otras culturas?