2012-06-25 31 views
7

Tengo una aplicación C++ bastante grande (en Windows, no hay otras plataformas planificadas), que actualmente almacena todas las configuraciones (incluso algunas clases de direcciones) en el registro de Windows.Mejores prácticas para almacenar configuraciones

A veces esto es un inconveniente, porque los usuarios tienen dificultades para cambiar las entradas en el registro. Me gustaría tener las versiones versionadas, por lo que la configuración siempre coincide con el código actual. Por el momento, versionamos reg-files, pero nunca está seguro si todos los reg-files se agregaron en las máquinas de destino. Con C# puede definir valores predeterminados en app.config, pero no sobrescribe la configuración existente. No sé si existe ese mecanismo o biblioteca para C++.

me gustaría tener las siguientes "características":

  • Los ajustes se pueden versionar
  • actualización simple en equipos de destino (puede ser realizado por el usuario)
  • Asegúrese de que en la actualización sólo los nuevos ajustes se añaden y no hay ajustes existentes se sobrescriben con los valores por defecto
  • cambio simple de configuración para el usuario
  • mismo flujo de trabajo en Win XP y Win 7

Por lo que veo, hay 3 posibilidades para almacenar la configuración en Windows:

  • registro de archivos
  • Ini
  • archivo XML Sólo

una aplicación de nuestra suite usa Qt en este momento, pero Boost estaría disponible.

Para las direcciones, las pondremos en una especie de libreta de direcciones XML, pero para las otras configuraciones no estamos seguros, cuál es la mejor práctica.

+2

Yo sugeriría otras alternativas: YAML/JSON para los humanos formato legible, SQLite para simple incrustado. En cuanto a los archivos 'ini', puede que le interese [Cómo analizar el archivo ini con Boost] (http://stackoverflow.com/questions/6175502/how-to-parse-ini-file-with-boost). –

+0

+1 para archivos Boost/ini, si puede KI ese SS. – DevSolar

+0

Si necesita varias capas de inclusiones, me gustaría buscar archivos XML/JSON. De lo contrario, INI podría ser la solución más simple. – Morwenn

Respuesta

3

Como mencionan los comentarios, las estructuras de clave/valor basadas en árbol son una solución común y las bibliotecas son fáciles de encontrar.

Boost's property_tree es una excelente opción, ya que es bien probado y puede ser fácilmente exportado como XML o JSON

En cuanto a sus requisitos:

  • Los ajustes se pueden versionar

Sí! Haga de la "versión" una clave de nivel superior. Que sea fácilmente comparable con otras versiones.

También puede categorizar su configuración en varios nodos de árboles y darle a cada nodo una versión.

  • actualización simple en equipos de destino (se puede hacer por el usuario)

que su solicitud hacerlo cuando se ejecuta. Vea abajo.

  • Asegúrese de que en la actualización sólo se añaden nuevos ajustes y no hay ajustes existentes se sobrescriben con los valores por defecto
  • cambio simple de configuración para el usuario
  • mismo flujo de trabajo en Win XP y Win 7

Como la configuración cambia de una versión a otra, generalmente estos cambios se dividen en tres categorías. Se necesitan nuevas propiedades, se abandonan las configuraciones antiguas y algunas configuraciones cambian el formato esperado. P.ej. "32 Fahrenheit" se convierte en "0 Celsius"

Cuando su aplicación inicializa:

  • carga el archivo de configuración existente, independientemente de su versión.
  • Si la versión no coincide con lo que es actual para la aplicación:
    • Crear un nuevo árbol de propiedad en blanco para la nueva configuración
    • Para cada nodo en el árbol, tener un conjunto de nombres de propiedades esperadas, y una función puntero o similar para obtener esta configuración si está ausente en el árbol del archivo anterior. Si una configuración cambia su formato, asígnele un nuevo nombre.
    • Busque cada configuración en el árbol anterior, copiando si se encuentra y utilizando el resultado de la función suministrada si no lo está.
    • Guarde su nuevo archivo de configuraciones.

Sus funciones que faltan "ajuste" puede:

  • devolver un valor predeterminado constante.
  • Consulta el árbol para un entorno diferente y convertirlo (con un valor por defecto si el ajuste anterior no se encuentra tampoco)
  • pedir al usuario