Digamos que tengo un programa que tiene una gran cantidad de opciones de configuración. El usuario puede especificarlos en un archivo de configuración. Mi programa puede analizar este archivo de configuración, pero ¿cómo debería almacenar internamente y pasar las opciones?¿Cómo diseñar un programa con muchas opciones de configuración?
En mi caso, el software se utiliza para realizar una simulación científica. Hay alrededor de 200 opciones, la mayoría de las cuales tienen valores predeterminados. Normalmente, el usuario solo tiene que especificar una docena más o menos. La dificultad que afronto es cómo diseñar mi código interno. Muchos de los objetos que deben construirse dependen de muchas opciones de configuración. Por ejemplo, un objeto puede necesitar varias rutas (para donde se almacenarán los datos), algunas opciones que deben pasarse a los algoritmos que llamará el objeto, y algunas opciones que el objeto mismo usa directamente.
Esto lleva a que los objetos necesiten una gran cantidad de argumentos para ser construidos. Además, como mi base de código se encuentra en desarrollo muy activo, es muy difícil pasar por la pila de llamadas y pasar una nueva opción de configuración hasta donde sea necesario.
Una forma de evitar ese dolor es tener un objeto de configuración global que se pueda usar libremente en cualquier parte del código. No me gusta particularmente este enfoque ya que conduce a funciones y clases que no toman ningún argumento (o solo uno) y no es obvio para el lector con qué datos trata la función/clase. También evita la reutilización del código ya que todo el código depende de un objeto de configuración gigante.
¿Alguien me puede dar algunos consejos sobre cómo debe estructurarse un programa como este?
Aquí es un ejemplo de lo que quiero decir para la configuración de estilo opción de paso:
class A:
def __init__(self, opt_a, opt_b, ..., opt_z):
self.opt_a = opt_a
self.opt_b = opt_b
...
self.opt_z = opt_z
def foo(self, arg):
algo(arg, opt_a, opt_e)
Aquí se muestra un ejemplo del estilo global config:
class A:
def __init__(self, config):
self.config = config
def foo(self, arg):
algo(arg, config)
Los ejemplos están en Python, pero mi pregunta significa cualquier langauge de programación similar.
El objeto de configuración global combina todo el código. Sería bueno que el programa sea más modular. Me gusta la solución que muestra @HYRY. Parece lo mejor de ambos mundos. – qsc