Cambio del comportamiento predeterminado en una aplicación C ++ con complementos [cerrado]

StackOverflow https://stackoverflow.com/questions/311247

  •  10-07-2019
  •  | 
  •  

Pregunta

En resumen: cuál es la mejor manera de diseñar e implementar un mecanismo de fábrica + plugin, para que los complementos puedan reemplazar objetos en la aplicación principal.

Tenemos una base de código a partir de la cual construimos nuestras aplicaciones. La base del código está bien para el 70-95% de las aplicaciones, lo que significa que en cada nueva aplicación necesitamos cambiar el 5-30% del comportamiento predeterminado (agregar nuevas funciones, cambiar la lógica predeterminada, agregar GUI, etc.).

La implementación está basada en complementos: la base del código está integrada en un EXE y DLL, y cuando se ejecuta el EXE principal, cargamos un DLL que agrega la funcionalidad requerida.

Actualmente cada complemento expone la siguiente función:

PluginInterface* PluginInit()
{
    return new MyCustomizedPluginInterface();
}

Donde PluginInterface se define como:

class PluginInterface {
public:
    virtual SomeClass1* customizedSomeClass1() = 0;
    virtual SomeClass2* customizedSomeClass2() = 0;
};

Y SomeClass1 / SomeClass2 tienen un comportamiento predeterminado, pero el complemento puede anularlo y cambiarlo.

La implementación actual dificulta la adición de nuevas clases personalizadas. Nos gustaría reemplazar cada clase en la aplicación principal desde el complemento, por lo que tiene sentido usar fábricas de objetos.

Un SDK que conozco utiliza la siguiente técnica:

PluginInterface* PluginInit(GodObject* godObject)
{
    FactoryForSomeClasses* factoryForSomeClasses = 
        godObject->factoryForSomeClasses();
    factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
    factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}

Me pregunto si hay alguna alternativa a este enfoque.

¿Cómo recomendaría diseñar e implementar un sistema / fábrica de complementos como acabo de describir?

¿Fue útil?

Solución

Hubo un artículo hace un tiempo en el Doctor Dobb que discutía este problema exacto. Aquí hay un enlace al artículo en cuestión.

Como aparte, es posible que desee seguir con una interfaz C directa para los complementos de su proyecto. De esa manera, puede vincular el código escrito en casi cualquier idioma en su marco con una molestia mínima. Si bien C ++ es bueno, poder aprovechar más de lo que existe en C ++, como los increíbles marcos que existen en las tierras de Java y Python, podría ser beneficioso a largo plazo.

Otros consejos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top