2008-08-11 7 views
15

Existe-t-il une procédure générale pour programmer la capacité d'extensibilité dans votre code? Je me demande quelle est la procédure générale pour ajouter une capacité de type extension à un système que vous écrivez afin que la fonctionnalité puisse être étendue à travers un API de plugin plutôt que d'avoir à modifier le code de base d'un système.Suggestions pour ajouter une capacité de plugin?

Est-ce que de telles choses ont tendance à dépendre de la langue dans laquelle le système a été écrit, ou existe-t-il une méthode générale pour le faire?

Répondre

3

C'est généralement quelque chose que vous devrez vous exposer, alors oui, cela dépendra de la langue dans laquelle votre système est écrit (bien qu'il soit souvent possible d'écrire des wrappers pour d'autres langages aussi).

Si, par exemple, vous aviez un programme écrit en C, pour Windows, les plugins seraient écrits pour votre programme en tant que DLL. Lors de l'exécution, vous devez charger manuellement ces DLL et leur exposer une interface. Par exemple, les DLL peuvent exposer une fonction gimme_the_interface() pouvant accepter une structure remplie de pointeurs de fonction. Ces pointeurs de fonction permettraient à la DLL de faire des appels, d'enregistrer des rappels, etc.

Si vous étiez en C++, vous utiliseriez le système DLL, sauf que vous passeriez probablement un pointeur d'objet au lieu d'un struct, et l'objet serait implémenter une interface qui fournissait des fonctionnalités (accomplissant la même chose que la structure, mais moins moche). Pour Java, vous chargiez des fichiers de classe à la demande au lieu de DLL, mais l'idée de base serait la même.

Dans tous les cas, vous devrez définir une interface standard entre votre code et les plugins, afin que vous puissiez initialiser les plugins, et que les plugins puissent interagir avec vous.

P.S. Si vous souhaitez voir un bon exemple de système de plugins C++, consultez le foobar2000 SDK. Je ne l'ai pas utilisé depuis longtemps, mais c'était vraiment bien fait. Je suppose que c'est toujours le cas.

+0

Oui, je crains que ce serait une réponse comme ça. Pourtant, l'avantage est que cela signifie que vous avez un contrôle total sur ce que les plugins peuvent faire, je suppose. – kaybenleroll

1
  1. Découvrez les exigences minimales que vous souhaitez appliquer à un plugin writer. Ensuite, créez une ou plusieurs interfaces que l'auteur doit implémenter pour que votre code sache quand et où exécuter le code.

  2. Créez une API que l'auteur peut utiliser pour accéder à certaines fonctionnalités de votre code.

Vous pouvez également créer une classe de base dont l'enregistreur doit hériter. Cela facilitera le câblage de l'API. Utilisez ensuite une sorte de réflexion pour analyser un répertoire et charger les classes correspondant à vos besoins.

Certaines personnes créent également un langage de script pour leur système ou implémente un interpréteur pour un sous-ensemble d'une langue existante. C'est aussi un itinéraire possible.

La ligne de fond est: Lorsque vous obtenez le code à charger, seul votre imagination devrait être en mesure de vous arrêter.
Bonne chance.

4

J'ai utilisé des API basées sur des événements pour les plugins dans le passé. Vous pouvez insérer des hooks pour les plugins en envoyant des événements et en fournissant un accès à l'état de l'application.Par exemple, si vous écrivez une application de blog, vous pouvez déclencher un événement juste avant l'enregistrement d'un nouveau message dans la base de données et fournir le code HTML au plugin pour le modifier au besoin.

2

Je suis tenté de vous indiquer les modèles de conception livre pour cette question générique: p

Sérieusement, je pense que la réponse est non. Vous ne pouvez pas écrire de code extensible par défaut, il sera difficile à écrire/étendre et terriblement inefficace (Mozilla a commencé avec l'idée d'être très extensible, a utilisé XPCOM partout, et maintenant ils ont réalisé que c'était une erreur et ont commencé à l'enlever où cela n'a pas de sens). Ce qui est logique, c'est d'identifier les parties de votre système qui peuvent être significativement étendues et de prendre en charge une API appropriée pour ces cas (par exemple, les plug-ins de prise en charge linguistique dans un éditeur). Vous utiliseriez les modèles pertinents, mais la mise en œuvre spécifique dépend de votre choix de plate-forme/langue. IMO, il aide également à utiliser un langage dynamique - permet de modifier le code de base lors de l'exécution (lorsque cela est absolument nécessaire)

J'ai apprécié que l'extensibilité de Mozilla fonctionne de cette façon lors de l'écriture des extensions Firefox.

1

Si vous utilisez un langage compilé tel que C ou C++, il peut être judicieux d'examiner la prise en charge des plugins via les langages de script. Les deux Python et Lua sont d'excellentes langues qui sont utilisées pour écrire un grand nombre d'applications (Civ4 et Blender utilisent Python, Supreme Commander utilise Lua, etc.).

Si vous utilisez C++, consultez la bibliothèque boost python. Sinon, python est livré avec des en-têtes qui peuvent être utilisés en C, et fait du bon travail en documentant l'API C/python. La documentation semblait moins complète pour Lua, mais je n'avais peut-être pas assez regardé. De toute façon, vous pouvez offrir une plate-forme de script assez solide sans une énorme quantité de travail. Ce n'est pas trivial, mais cela vous donne une très bonne base de travail.

2

Je pense qu'il ya deux aspects à votre question:

La conception du système à extensible (les modèles de conception, l'inversion de contrôle et d'autres aspects architecturaux) (http://www.martinfowler.com/articles/injection.html). Et, au moins pour moi, oui, ces modèles/techniques sont indépendants de la plate-forme/langue et peuvent être considérés comme une «procédure générale».

Maintenant, leur mise en œuvre est la langue et dependend de plate-forme (par exemple en C/C++, vous avez l'étoffe de bibliothèque dynamique, etc.)

Plusieurs « cadres » ont été développés pour vous donner un environnement de programmation qui vous offre Pluggability/extensibilité, mais comme d'autres personnes le mentionnent, ne soyez pas trop fous tout ce qui est pluggable.

Dans le monde Java une bonne spécification de regarder est OSGi (http://en.wikipedia.org/wiki/OSGi) avec plusieurs mises en œuvre le meilleur à mon humble avis être Equinox (http://www.eclipse.org/equinox/)

Questions connexes