Configuración persistente en aplicaciones de escritorio
¿Qué es una configuración persistente?
En aplicaciones de escritorio, o aplicaciones en general, cuando modificas una configuración de alto nivel esperas que esa configuración persista a través de las instancias de la aplicación o que esa configuración se mantenga y se aplique igual sin importar cuantas veces cierres y vuelvas a abrir la aplicación hasta que la cambies de nuevo.
Esto es lo que yo llamo una configuración persistente.
Un ejemplo de este tipo de configuración podría ser el tamaño y la posición de la ventana de la aplicación, de forma que cuando abras una aplicación estará en el mismo lugar y tendrá el mismo tamaño que tenía la última vez que la cerraste.
Cualquier ajuste que sea comparativamente temporal es lo que yo llamaría un ajuste transitorio.
Persistente o transitorio, ¿cómo elegir?
En la mayoría de los casos, la naturaleza de la configuración determinará si debe ser persistente o no.
Los ajustes persistentes suelen ser ajustes de aplicación de nivel superior, mientras que los ajustes transitorios suelen estar relacionados con subsecciones más pequeñas.
También puedes pensarlo temporalmente, si quieres que el ajuste dure para siempre hazlo persistente, si quieres que se aplique sólo esta vez hazlo transitorio.
Las configuraciones transitorias no son demasiado interesantes ya que viven probablemente como variables normales en memoria volátil.
Las configuraciones persistentes también viven en variables en esa misma memoria mientras la aplicación se está ejecutando, pero su estado necesita ser rastreado incluso cuando la aplicación no se está ejecutando.
¿Cómo se puede lograr esto?
¿Cómo implementarlo?
Memoria no volátil.
Con un poco de código de inicialización y limpieza (cierre, destructor), puedes lograr configuraciones persistentes simplemente, por ejemplo, leyendo la configuración de un archivo cuando se inicia la aplicación y escribiendo el valor de nuevo cuando se cierra.
Yo suelo hacer esto utilizando un archivo de configuración real que vive en el sistema de archivos normal, o mediante el uso de ubicaciones de memoria proporcionadas por el sistema operativo, por ejemplo, el registro en Windows. Una vez que elija dónde desea guardar el valor, todo lo que necesita para codificar para leer el valor cuando se inicia la aplicación y escribir el valor de nuevo, ya sea cuando el valor se cambia o simplemente cuando la aplicación se cierra.
Problemas que he encontrado y cómo resolverlos
Las configuraciones persistentes son geniales desde la perspectiva del usuario, pero, desde la perspectiva del desarrollador, introducen muchos efectos secundarios interesantes.
Valores iniciales
Con la adición de la configuración persistente en una aplicación, usted debe recordar que ahora hay una diferencia entre sólo iniciar una aplicación y el inicio de una aplicación por primera vez en una nueva máquina. Cuando hago pruebas de lanzamiento, siempre utilizo una máquina virtual limpia sólo para este propósito, así puedo asegurarme de que la verdadera experiencia de instalación por primera vez funciona como se espera.
Diferencias entre versiones
Es posible que en una nueva versión de la aplicación cambie la forma de utilizar o almacenar una configuración concreta. Debes tener en cuenta el caso de que tengas ajustes almacenados de una versión utilizados en una versión posterior - en el caso de que el usuario acabe de actualizar a una nueva versión. Esto podría evitarse cambiando el nombre o la ubicación de los ajustes cuya finalidad haya cambiado de una versión a otra.
Bucle de bloqueo
Si cambias una configuración persistente y causa un fallo, quizás debido a algún borde que no estabas comprobando, hay una buena posibilidad de que cuando intentes reiniciar la aplicación se bloqueará de nuevo, ya que volverá a leer el mismo valor que hizo que se bloqueara en primer lugar. Esto es un poco difícil de evitar, su mejor apuesta es simplemente probar contra todo el rango válido de los ajustes y validar que los ajustes están en ese rango probado cuando se leen en el inicio de la aplicación.
Manejando salidas sin gracia
Puede que hayas optado por conseguir una configuración persistente guardando el estado de la configuración en una memoria no volátil cuando se cierra la aplicación. Si usted toma este enfoque, entonces si por alguna razón su aplicación no sale correctamente, sus valores no se guardarán. Esto podría suceder si hay una pérdida repentina de energía, por ejemplo. Para evitar esto, debes guardar la configuración cada vez que la cambies. De esta forma, pase lo que pase, el valor correcto se leerá en el siguiente inicio de la aplicación. Evita esta solución si tu código de almacenamiento de ajustes es caro y se ejecuta con frecuencia o los ajustes cambian a menudo. En este caso podrías encontrar un término medio y guardar periódicamente (en un horario) los ajustes en lotes.
Vulnerabilidades
Ambas opciones de memoria no volátil, registro y archivo, para el almacenamiento persistente de configuraciones abren la aplicación al ataque de un usuario malintencionado. Este usuario puede ahora insertar lo que quiera directamente en tu aplicación modificando la memoria en la que decidiste almacenar tus configuraciones. Puedes protegerte contra este ataque encriptando tus configuraciones antes de almacenarlas, esto complicará ligeramente tus funciones de lectura/escritura.
Reflexiones finales
Cuando desarrolles con configuraciones persistentes, tienes que tener en mente el rango de lo que podría haber pasado antes de que la aplicación comience. Valida las configuraciones a medida que se leen, protege cualquier cosa sensible, asegúrate de que los datos de tu versión antigua no romperán tu última versión.