7

¿Cómo identificar y corregir el código siguiente olor:Código Olor: Configuración pesadilla

Tengo una pequeña aplicación informática científica de que estoy escribiendo que tiene que ser capaz de manejar una gran cantidad de variaciones sobre el mismo tema. El funcionamiento interno de la misma está bien factorizado, principalmente utilizando el patrón de método de plantilla y algunas funciones de orden superior. Sin embargo, especificar cómo se deben instanciar y usar todas estas clases y funciones y con qué parámetros en una ejecución determinada del programa es tan complicado que a veces pienso que la forma más fácil de hacerlo sería reescribir main() para cada ejecución y recompilar eso.

¿Existe una forma relativamente simple y liviana de realizar una gestión de configuración que no sea exagerada para una pequeña aplicación científica? Básicamente solo he usado conmutadores de línea de comandos y se están volviendo bastante difíciles de manejar.

Editar: La aplicación es lo suficientemente pequeña como para que los tiempos de construcción sean insignificantes. Veo poca ventaja en enlazar a un lenguaje de scripting sobre simplemente modificar el código en el idioma nativo. (La aplicación está escrita en el lenguaje de programación D.)

Edición n. ° 2: Pensé en la idea del archivo de configuración y sería útil, pero me gustaría escribir el archivo de configuración sería casi tan difícil como volver a escribir main() cada vez.

+2

¿Qué tal un archivo de configuración XML? o un archivo .INI –

+2

Me puede estar faltando algo, pero ¿no puede simplemente establecer esos parámetros en un archivo de configuración? Puede crear diferentes archivos para diferentes escenarios, y luego simplemente modificar según sea necesario. – Jay

+0

Re: Editar 2: Pero dijiste que los conmutadores de la línea de comandos se volvían difíciles de manejar. En su forma más simple, podría simplemente almacenar los conjuntos de conmutadores de línea de comando que usa en su archivo de configuración, y usar un interruptor en la línea de comando para cambiar el archivo de configuración que usa. No es necesario que te apetezca estar cerca del lugar donde debes estar. –

Respuesta

7

Desde la perspectiva de un patrón de diseño, el patrón Builder puede ser útil para usted. Le permitirá definir algunas buenas configuraciones predeterminadas al tiempo que le permite anular determinados pasos. Funciona especialmente bien con Fluent Interface.

También viene a la mente el patrón Facade, porque le permite predefinir las opciones de configuración comunes. Puede usar Constructores para implementar las Fachadas.

+0

Una interfaz fluida aún requeriría que codifique y recompile para cambiar la configuración, ¿no es esta parte del problema el que está intentando deshacerse? –

+0

Honestamente, no puedo decir de la pregunta. Si la recompilación es el problema, entonces estás en lo correcto. Si el problema está relacionado con la mantenibilidad, una interfaz fluida podría ayudar ... –

0

Parece que necesita darle un enlace al código central en su lenguaje de scripting favorito, y luego usar ese lenguaje para crear configuraciones.

3

Parece que lo mejor es insertar un lenguaje de scripting y usarlo para controlar su aplicación. Los lenguajes de scripting son excelentes archivos de "configuración". Sugeriría investigar lua (ampliamente utilizado en juegos) y tcl (ampliamente utilizado en electrónica CAD). Ambos son fáciles de integrar, pequeños y fáciles de aprender.

0

Si puede dar nombres para cada conjunto de configuraciones, puede simplemente pasar los nombres a su main().

Incluso si tiene cientos de parámetros que puede configurar, ¿cuántas combinaciones realmente usa al final? Si usa, digamos que 4 combinaciones le dan a cada uno de ellos nombres e incluso puede mantenerlos codificados como conjuntos diferentes.

Por ejemplo, cuando seleccionas Red Army en el juego de estrategia, puede haber miles de parámetros para cada ejército, pero están listos para algo que representaría al Ejército Rojo.

0

Puede buscar en algún lenguaje de scripting como Python y llamarlo desde main().

Otra opción sería crear su propio DSL (lenguaje específico del dominio) para su aplicación. Puede usar ANTLR para esto.

1

Si D admite la serialización de objetos, ¿por qué no crear una clase que represente su configuración (podría terminar como una clase con muchas propiedades o varias agregadas por una clase padre) y serializar/deserializar eso?

Recomendaría un poco de trabajo adicional para crear un objeto de configuración de ejemplo y serializarlo y editarlo para darle una configuración de plantilla con la que trabajar.

Cuestiones relacionadas