Question

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 via une sorte d'API de plugin plutôt que d'avoir à modifier le code principal d'un système.

De telles choses ont-elles 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 permettre cela ?

Était-ce utile?

La solution

C'est généralement quelque chose que vous devrez exposer vous-même, donc 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 langues également).

Si, par exemple, vous aviez un programme écrit en C, pour Windows, les plugins seraient écrits pour votre programme sous forme de DLL.Au moment de l'exécution, vous chargeriez manuellement ces DLL et leur exposeriez une interface.Par exemple, les DLL peuvent exposer un gimme_the_interface() fonction qui pourrait accepter une structure remplie de pointeurs de fonction.Ces pointeurs de fonction permettraient à la DLL d'effectuer 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'une structure, et l'objet implémenterait une interface fournissant des fonctionnalités (réalisant la même chose que la structure, mais en moins moche).Pour Java, vous chargeriez 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 plugin C++, consultez le Foobar2000 SDK.Je ne l'ai pas utilisé depuis un bon moment, mais c'était vraiment bien fait.Je suppose que c'est toujours le cas.

Autres conseils

J'ai déjà utilisé des API basées sur des événements pour les plugins.Vous pouvez insérer des hooks pour les plugins en distribuant des événements et en donnant accès à l'état de l'application.

Par exemple, si vous écrivez une application de blog, vous souhaiterez peut-être déclencher un événement juste avant qu'une nouvelle publication ne soit enregistrée dans la base de données et fournir le code HTML de la publication au plugin pour qu'il le modifie si nécessaire.

Je suis tenté de vous diriger vers le livre Design Patterns 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 à la fois 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é à le supprimer où cela n'a pas de sens).

ce qui est logique, c'est d'identifier les éléments de votre système qui peuvent être étendus de manière significative et de prendre en charge une API appropriée pour ces cas (par ex.plug-ins de prise en charge linguistique dans un éditeur).Vous utiliseriez les modèles pertinents, mais l'implémentation spécifique dépend de votre choix de plate-forme/langue.

OMI, il est également utile d'utiliser un langage dynamique - permet de modifier le code de base au moment 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 d'extensions Firefox.

Je pense qu'il y a deux aspects à votre question :

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

Désormais, leur implémentation dépend du langage et de la plate-forme (par exemple en C/C++, vous avez les éléments de bibliothèque dynamique, etc.)

Plusieurs « frameworks » ont été développés pour vous offrir un environnement de programmation qui vous offre possibilité de branchement/extensibilité, mais comme d'autres personnes le mentionnent, ne soyez pas trop fou en rendant tout connectable.

Dans le monde Java, une bonne spécification à rechercher est OSGi (http://en.wikipedia.org/wiki/OSGi) avec plusieurs implémentations, la meilleure à mon humble avis étant Equinox (http://www.eclipse.org/equinox/)

  1. Découvrez les exigences minimales que vous souhaitez imposer à un rédacteur de plugin.Créez ensuite une ou plusieurs interfaces que le rédacteur doit implémenter pour que votre code sache quand et où exécuter le code.

  2. Créez une API que le rédacteur peut utiliser pour accéder à certaines fonctionnalités de votre code.

Vous pouvez également créer une classe de base dont l'écrivain doit hériter.Cela facilitera le câblage de l'API.Utilisez ensuite une sorte de réflexion pour analyser un répertoire et chargez les classes que vous trouvez qui correspondent à vos besoins.

Certaines personnes créent également un langage de script pour leur système ou implémentent un interpréteur pour un sous-ensemble d'un langage existant.C’est aussi une voie possible à suivre.

En fin de compte, c'est :Lorsque vous chargez le code, seule votre imagination devrait pouvoir vous arrêter.
Bonne chance.

Si vous utilisez un langage compilé tel que C ou C++, cela peut être une bonne idée de rechercher la prise en charge des plugins via des langages de script.Python et Lua sont tous deux d'excellents langages utilisés pour scripter 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 un assez bon travail en documentant l'API C/python.La documentation semblait moins complète pour Lua, mais je n'ai peut-être pas assez cherché.Quoi qu’il en soit, vous pouvez proposer une plate-forme de script assez solide sans une quantité de travail énorme.Ce n’est toujours pas anodin, mais cela vous offre une très bonne base de travail.

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