Modifica del comportamento predefinito in un'applicazione C ++ con plugin [chiuso]

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

  •  10-07-2019
  •  | 
  •  

Domanda

In breve: qual è il modo migliore per progettare e implementare un meccanismo factory + plugin, in modo che i plugin possano sostituire gli oggetti nell'applicazione principale.

Abbiamo una base di codice da cui costruiamo le nostre applicazioni. La base di codice va bene per il 70-95% delle applicazioni, il che significa che in ogni nuova applicazione è necessario modificare il 5-30% del comportamento predefinito (aggiungere nuove funzionalità, modificare la logica predefinita, aggiungere la GUI, ecc.).

L'implementazione è basata su plug-in: la base di codice è integrata in un file EXE e DLL e quando il file EXE principale è in esecuzione cariciamo una DLL che aggiunge la funzionalità richiesta.

Attualmente ogni plugin espone la seguente funzione:

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

Dove PluginInterface è definito come:

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

E SomeClass1 / SomeClass2 hanno alcuni comportamenti predefiniti, ma possono essere sovrascritti e modificati dal plugin.

L'implementazione corrente rende difficile l'aggiunta di nuove classi personalizzate. Vorremmo sostituire ogni classe nell'applicazione principale dal plugin, quindi ha senso usare fabbriche di oggetti.

Un SDK che conosco utilizza la seguente tecnica:

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

Mi chiedo se ci siano alternative a questo approccio.

Come consiglieresti di progettare e implementare un sistema / fabbrica di plugin come ho appena descritto?

È stato utile?

Soluzione

C'era un articolo qualche tempo fa in Doctor Dobb che parlava di questo esatto problema. Ecco un link all'articolo in questione.

Per inciso, potresti voler utilizzare un'interfaccia C diritta per i plugin del tuo progetto. In questo modo puoi collegare il codice scritto in quasi tutte le lingue nel tuo framework con una seccatura minima. Mentre C ++ è bello, essere in grado di sfruttare più di quanto esiste in C ++, come gli incredibili framework che esistono nelle terre Java e Python, potrebbe rivelarsi utile a lungo termine.

Altri suggerimenti

Hai esaminato gli esempi di CodeProject per i framework di plugin? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top