Preferencias sin base de datos
El almacén clave-valor: cuándo es la herramienta correcta, cómo se sincroniza a disco sin escribir en cada tecla, y los valores por omisión que evitan la mitad de los problemas.
Cuándo cada uno
La última fila importa más de lo que parece en soporte: pedirle a un usuario que abra su fichero de preferencias y te diga qué pone es mucho más fácil que pedirle que consulte una base.
Guardar sin escribir constantemente
El problema práctico: si guardas en cada cambio, mover un panel escribe el fichero cincuenta veces por segundo. La respuesta es la misma que la del nivel 40.4:
// agrupar: marcar sucio y volcar cuando se calmestruct Prefs { valores: RwLock<Mapa>, sucio: AtomicBool,}// en cada cambioprefs.sucio.store(true, Ordering::Relaxed);// y en una tarea que corre cada segundoif prefs.sucio.swap(false, Ordering::Relaxed) { prefs.guardar_atomico()?; // nivel 40.2}Y tres momentos donde hay que volcar sí o sí, sin esperar al temporizador:
- Al cerrar la aplicación. Es lo que evita perder el último cambio.
- Al perder el foco de la ventana, que es un buen momento y barato.
- Y antes de cualquier operación arriesgada, como una migración.
El primero es el que se olvida y produce el fallo clásico: el usuario cambia una preferencia, cierra, vuelve a abrir y no está.
Los valores por omisión
El detalle que evita la mitad de los problemas: leer siempre con un valor por omisión, nunca suponer que la clave existe.
// mal: falla, o devuelve algo raro, en la primera ejecuciónlet tema = prefs.get("tema").unwrap();// bien: la primera ejecución y una clave nueva se comportan igual que siemprelet tema = prefs.get("tema").unwrap_or(Tema::Sistema);Con eso, tres situaciones se resuelven solas:
- La primera ejecución, donde no hay fichero.
- Una preferencia nueva que añades en una versión posterior: los usuarios existentes no la tienen y toman el valor por omisión sin ninguna migración.
- Y un fichero editado a mano al que le falta algo. Nivel 39.4: tus propios ficheros son entrada no confiable.
Y por eso el almacén de preferencias casi nunca necesita migraciones, a diferencia de la base de datos: añadir claves es gratis, y quitarlas también —dejan de leerse—. Solo cambiar el significado de una clave requiere cuidado, y la solución es no hacerlo: usar una clave nueva y dejar de leer la vieja.
Que no se convierta en una base de datos mala
La deriva a evitar, y ocurre siempre igual: