Saltar al contenido

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:

Rust
// 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.

Rust
// 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: