La mejor práctica para crear una clase de configuración 'global' utilizada por numerosos componentes

11

Tengo un gran proyecto con una parte del controlador y alrededor de 5 bibliotecas que realizan varias tareas asociadas. Muchas de las bibliotecas requieren acceso a datos de configuración 'globales' que se leen desde una base de datos al inicio mediante el código del controlador. Por conductor me refiero a la parte que contiene la función principal.

Mi idea sobre cómo manejar esto fue crear una clase de configuración con un método estático para obtener los elementos de configuración. ¿Es este el mejor enfoque? ¿De qué otra forma se podría lograr esto?

p.ej:

class config {
 public:
   static get_item(key);

 private:
   static values;
};

¿Es apropiado el diseño singleton aquí?

usuario619818
fuente

Respuestas:

14

La forma no única es crear una clase de configuración regular con propiedades / miembros regulares, instanciar ese objeto con la configuración correcta de la base de datos en el controlador y pasar la instancia a todas las bibliotecas, probablemente a través de std :: shared_ptr. Este es un patrón de diseño común llamado inyección de dependencia .

De esta forma, evita todos los problemas potenciales del patrón de diseño singleton y su código será más comprobable, ya que puede instanciar una instancia de su clase de configuración de la forma que desee, con cualquier dato, para probar.

Joris Timmermans
fuente
+1, quería agregar esa cosa sobre la capacidad de prueba a mi propia respuesta, pero fuiste más rápido.
Doc Brown
Ligeramente OT: ¿No es todavía un Singleton, solo implementado de manera diferente?
adhominem
1
@adhominem: no, es un objeto para el que solo existe una instancia, pero no hay maquinaria especial a su alrededor.
Joris Timmermans
@OliverWeiler: correcto, y realmente debería haber hecho referencia a ese nombre de patrón de diseño en mi respuesta, así que lo estoy agregando ahora.
Joris Timmermans
1

Creo que este es uno de los momentos en que un Singleton es realmente lo correcto.

Con respecto a la interfaz de la clase en sí, puede hacer get-by-key-name o tener accesores para los valores de configuración individuales. El último esquema ofrece cierta conveniencia (finalización de IDE para uno) y le permite convertir los valores de configuración a sus tipos de datos correctos antes de usarlos. También introduce cierta separación entre los usuarios de la clase config y su implementación interna (el hecho de que todos los valores de configuración se almacenen como, por ejemplo, cadenas, es un detalle de implementación del que el usuario de la clase no debería preocuparse).

adhominem
fuente