2. Fichero: confirmaciones.
py (La Red de Seguridad)
"Empezaré por el módulo de confirmaciones. Este fichero es el encargado de validar las
intenciones del usuario antes de ejecutar acciones críticas."
Explicación técnica (Casi línea a línea):
● Función confirmar_accion_general(mensaje):
○ Esta es nuestra función base. Recibe un mensaje personalizado.
○ Limpieza de datos: Usamos .strip().lower() para que el programa
entienda la respuesta sin importar si el usuario usa mayúsculas o deja
espacios.
○ Bucle de Validación: Implementé un while respuesta not in ['s',
'n']. Esto obliga al usuario a dar una respuesta válida; el programa no
'asume' nada, simplemente insiste hasta recibir una instrucción clara.
● Funciones Especializadas:
○ confirmar_eliminar_usuario: Muestra específicamente el Nombre y
DNI del usuario para que no haya dudas de a quién se está borrando.
○ confirmar_sobrescribir_fichero: Lanza una advertencia sobre la
posible pérdida de datos antes de llamar a la función general.
3. Fichero: [Link] (El Centro de Operaciones)
"Este es el fichero más extenso porque gestiona todo lo que el usuario ve en pantalla. Se
apoya constantemente en los módulos de validaciones y datos."
MODULOS =
- OS: interactuar con el sistema de archivos del ordenador.
- from validaciones import …: Importamos estas funciones para que la interfaz sea
'tonta'. La interfaz solo pregunta el dato
- from datos import …: traes la lógica de persistencia y memoria
- from confirmaciones import ... : Importamos estas herramientas para estandarizar
cómo el programa pide permiso al usuario
A. Función anadir_usuario(usuarios)
"Esta es la puerta de entrada de nuevos datos. Lo más importante aquí es el filtrado
preventivo."
● Líneas de validación: "Antes de procesar nada, usamos if not
es_nombre_valido(nombre):. Si la validación falla, imprimimos un mensaje de
error y usamos un return. Esto es clave: detenemos la ejecución antes de que el
error llegue a la base de datos."
● Normalización: "Fíjense que usamos .strip() para limpiar espacios accidentales
y .upper() en el DNI, facilitando que el usuario pueda escribir en minúsculas sin
que el sistema falle."
B. Función mostrar_usuarios(usuarios)
"Aquí el reto era la legibilidad en la consola."
● Formateo de tablas: "He utilizado f-strings con modificadores de alineación como
:<12 y :<25. Esto reserva un espacio fijo para cada columna, asegurando que los
datos se vean como una tabla profesional y no como una lista desordenada."
C. La lógica de Edición (editar_usuario y sus derivados)
"He estructurado la edición en tres niveles para que el código sea modular:"
1. editar_usuario (Menú): "Simplemente actúa como un selector entre memoria y
fichero."
2. editar_usuario_memoria (Edición inteligente): "Aquí hay un detalle de calidad:
permitimos que el usuario deje campos en blanco. El código verifica if
nuevo_nombre:; si no hay entrada, se mantiene el dato original. Esto mejora
mucho la experiencia de usuario."
3. editar_usuario_fichero (Persistencia): "Esta función es más compleja.
Primero carga los datos del archivo a una lista temporal, realiza la edición y luego
vuelve a guardar (persiste) los datos en el disco."
D. Gestión de Ficheros (guardar_fichero y cargar_fichero)
"Aquí es donde integramos la seguridad del módulo os."
● [Link](ruta): "Antes de guardar, verificamos si el archivo ya existe. Si
es así, disparamos una confirmación para evitar que el usuario sobrescriba datos
valiosos por error."
● Manejo de Excepciones: "He implementado bloques try...except para capturar
errores de lectura/escritura (como falta de permisos o archivo no encontrado), lo que
garantiza que el programa no 'explote' ante fallos del sistema operativo."
4. Conclusión Técnica (Para el Tribunal)
"En resumen, mi parte del código asegura que:
1. El usuario esté guiado: No puede romper el programa con entradas inválidas.
2. Los datos sean persistentes: Gestionamos ficheros externos de forma segura.
3. El sistema sea mantenible: Al separar las confirmaciones en un fichero aparte, si
mañana queremos cambiar el idioma de la aplicación, solo tenemos que tocar un
archivo."
Posibles preguntas "trampa" y cómo
responderlas
● ¿Por qué usas [Link] en lugar de solo intentar abrir el archivo?
○ Respuesta: "Es una medida de programación defensiva. Verificar la
existencia antes de operar evita que el programa se detenga bruscamente
con un error de sistema (FileNotFoundError) y nos permite dar un mensaje
amigable al usuario".
● ¿Qué pasa si el usuario responde algo distinto a 's' o 'n' en una confirmación?
○ Respuesta: "Gracias al bucle while en confirmar_accion_general, el
sistema rechazará la entrada y volverá a preguntar infinitamente hasta que la
respuesta sea válida".
● ¿Cómo aseguras que el DNI esté en mayúsculas?
○ Respuesta: "En la interfaz aplicamos .upper() inmediatamente después de
recibir el input, normalizando el dato antes de validarlo o guardarlo".