Modification du comportement par défaut dans une application C ++ avec des plugins [fermé]

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

  •  10-07-2019
  •  | 
  •  

Question

En bref: quel est le meilleur moyen de concevoir et de mettre en œuvre un mécanisme fabrique + plug-in, afin que les plug-ins puissent remplacer des objets dans l'application principale.

Nous avons une base de code à partir de laquelle nous construisons nos applications. La base de code convient à 70-95% des applications, ce qui signifie que dans chaque nouvelle application, nous devons modifier 5-30% du comportement par défaut (ajouter de nouvelles fonctionnalités, modifier la logique par défaut, ajouter une interface graphique, etc.).

L’implémentation est basée sur un plugin: la base de code est intégrée à un fichier EXE et à des DLL. Lorsque le fichier EXE principal est en cours d’exécution, nous chargeons une DLL qui ajoute les fonctionnalités requises.

Actuellement, chaque plug-in présente la fonction suivante:

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

Où PluginInterface est défini comme:

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

Et SomeClass1 / SomeClass2 ont un comportement par défaut, mais peuvent être remplacés et modifiés par le plugin.

L'implémentation actuelle rend difficile l'ajout de nouvelles classes personnalisées. Nous aimerions remplacer chaque classe de l’application principale à partir du plug-in, il est donc logique d’utiliser des fabriques d’objets.

Un SDK que je connais utilise la technique suivante:

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

Je me demande s’il existe des alternatives à cette approche.

Comment recommanderiez-vous la conception et la mise en œuvre d’un système / d’une usine de plug-ins, comme je viens de le décrire?

Était-ce utile?

La solution

Il y a quelque temps déjà, un article du docteur Dobb traitait de ce problème précis. Voici un lien vers l'article en question.

En passant, vous voudrez peut-être vous en tenir à une interface C simple pour les plugins de votre projet. De cette façon, vous pouvez relier du code écrit dans presque toutes les langues de votre framework avec un minimum de tracas Bien que le C ++ soit une bonne chose, pouvoir exploiter plus que ce qui existe en C ++, comme les incroyables frameworks existant en Java et en Python, pourrait s'avérer bénéfique à long terme.

Autres conseils

Avez-vous examiné les exemples CodeProject pour les frameworks de plugins? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top