171 votes

Comment créer une Architecture de plug-in Flexible ?

Un même thème dans mon travail de développement a été l'utilisation ou la création d'une maison d'architecture de plug-in. Je l'ai vu il approcha de nombreuses façons de fichiers de configuration (XML, .conf, et ainsi de suite), l'héritage des cadres, des informations de base de données, bibliothèques, et autres. Dans mon expérience:

  • Une base de données n'est pas un endroit idéal pour stocker vos informations de configuration, en particulier co-mêle avec les données
  • D'essayer cela avec une hiérarchie d'héritage exige la connaissance sur les plugins être codés dans, sens de l'architecture de plug-in n'est pas dynamique
  • Les fichiers de Configuration de travail bien pour fournir des informations simples, mais ne peut pas gérer les comportements les plus complexes
  • Les bibliothèques semblent bien fonctionner, mais les dépendances doivent être soigneusement créé.

Comme je cherche à apprendre les différentes architectures qui j'ai travaillé, je suis également à la recherche de la communauté pour des suggestions. Comment avez-vous mis en place un solide architecture de plug-in? Quel a été votre pire échec (ou le pire cas d'échec, vous l'avez vu)? Que feriez-vous si vous alliez mettre en œuvre une nouvelle architecture de plug-in? Ce SDK ou un projet open source qui vous avez travaillé avec de a le meilleur exemple d'une bonne architecture?

Quelques exemples que j'ai trouvé sur mon propre:

Ces exemples semblent jouer à divers langue forces. Est une bonne architecture de plugin nécessairement lié à la langue? Est-il préférable d'utiliser des outils pour créer une architecture de plugin, ou de le faire sur ses propres modèles suivants?

96voto

Noufal Ibrahim Points 32200

Ce n'est pas une réponse comme beaucoup comme un tas de potentiellement utiles remarques/exemples.

  • Un moyen efficace pour rendre votre application extensible, c'est s'exposer elle-même comme un langage de script et écrire tous les meilleurs éléments de niveau dans cette langue. Ce fait est tout à fait modifiable et pratiquement dans l'avenir (si votre primitives sont bien choisis et mis en œuvre). Une histoire du succès de ce genre de chose est Emacs. Je préfère cela à l'éclipse de style système de plugin parce que si je veux étendre les fonctionnalités, je n'ai pas à apprendre l'API et de l'écriture/compiler un plug-in séparé. Je peux écrire 3 lignes extrait de code dans le tampon courant lui-même, de l'évaluer et de l'utiliser. Très lisse de la courbe d'apprentissage et de très bons résultats.

  • Une application que j'ai prolongé un peu de Trac. Il a une architecture de composants qui, dans cette situation signifie que les tâches sont déléguées à des modules qui font la publicité des points d'extension. Vous pouvez ensuite mettre en œuvre d'autres composants qui répondent à ces points et changer le flux. C'est un peu comme Kalkie la suggestion ci-dessus.

  • Un autre qui est bien, c'est py.test. Il suit le "meilleur de l'API est pas d'API" la philosophie et s'appuie uniquement sur des crochets d'être appelé à chaque niveau. Vous pouvez remplacer ces crochets dans les fichiers/fonctions nommé conformément à une convention et de modifier le comportement. Vous pouvez voir la liste des plugins sur le site pour voir comment rapidement/facilement ils peuvent être mis en œuvre.

Quelques points généraux.

  • Essayez de garder votre non-extensible/non modifiable par l'utilisateur de base aussi faible que possible. Déléguez tout ce que vous pouvez pour une couche supérieure, de sorte que l'extensibilité augmente. Moins de choses à corriger dans le noyau puis en cas de mauvais choix.
  • Liée au point précédent, c'est que vous ne devriez pas prendre trop de décisions sur l'orientation de votre projet dès le début. Mettre en œuvre le plus petit sous-ensemble nécessaire et puis commencez à écrire des plugins.
  • Si vous intégrez un langage de script, assurez-vous qu'il complète dans laquelle vous pouvez écrire des programmes généraux et non pas un jouet langue juste pour votre appl.
  • Réduire réutilisable autant que vous le pouvez. Ne vous embêtez pas avec des sous-classement, des Api complexes, plug-in d'enregistrement et des trucs comme ça. Essayez de garder les choses simples de sorte qu'il est facile et pas seulement possible de prolonger. Cela permettra à votre plugin API être utilisé plus et encourager les utilisateurs finaux à écrire des plugins. Non seulement les développeurs de plugin. py.test fait bien cela. Eclipse autant que je sache, n'a pas.

27voto

derivation Points 1399

Dans mon expérience, j'ai trouvé il y a vraiment deux types de plug-in Architectures. On suit le modèle Eclipse qui est destinée à permettre la liberté et elle est ouverte. L'autre nécessite généralement des plugins pour suivre un étroit API parce que le plugin va remplir une fonction spécifique. À l'état d'une autre façon, on permet à des plugins pour accéder à votre demande, tandis que l'autre permet à votre application d'accéder aux plugins. La distinction est subtile, et parfois il n'y a pas de distiction... vous souhaitez à la fois pour votre application.

Je n'ai pas énormément d'expérience avec Eclipse/Ouverture de votre Application pour les plugins (modèle de l'article dans Kalkie post est grande). J'ai lu un peu sur le chemin de l'éclipse fait des choses, mais rien de plus. Yegge de propriétés blog parle un peu de la façon dont l'utilisation des propriétés de modèle permet de plugins et de l'extensibilité.

La plupart du travail que j'ai fait a utilisé une architecture de plugin pour permettre à mon application à accéder à des plugins, des choses comme le temps/affichage/données de carte, etc. Il y a des années, je voudrais créer des usines, des plugin gestionnaires et des fichiers de configuration pour gérer tout cela, et permettez-moi de déterminer quel plugin utiliser lors de l'exécution. Maintenant j'ai l'habitude de simplement avoir un DI-cadre de faire la plupart de ce travail. J'ai encore à écrire des cartes pour utiliser des bibliothèques tierces, mais, généralement, ils ne sont pas si mauvais que cela.

14voto

Patrick Points 426

Une des meilleures architectures plug-in que j’ai vu est implémentée dans Eclipse. Au lieu d’avoir une application avec un modèle de plug-in, tout est un plug-in. L’application de base elle-même est le cadre plug-in.

http://www.Eclipse.org/articles/article-plug-in-architecture/plugin_architecture.html

7voto

Ian Ringrose Points 19115

Une fois, j'ai travaillé sur un projet qui devait être si souple dans la façon dont chaque client peut configurer le système, qui est la seule bonne conception, nous avons trouvé était à expédier au client un compilateur C#!

Si la spécification est rempli avec des mots comme:

  • Flexible
  • Plug-In
  • Personnalisable

Posez beaucoup de questions sur la façon dont vous aurez en charge le système (et comment la prise en charge sera facturé pour, chaque client va penser que leur cas est le cas normal et ne devrait pas avoir besoin de tout les plugins.), comme dans mon expérience

Le soutien des clients (ou source de soutien en ligne personnes) écrit Plugins est beaucoup plus difficile que la L'Architecture

6voto

Muse VSExtensions Points 1171

Généralement j’utilise MEF. Le Managed Extensibility Framework (ou la MEF pour faire court) simplifie la création d’applications extensibles. MEF offre des capacités de découverte et de la composition que vous pouvez exploiter pour charger les extensions d’application.

Si vous souhaitez en savoir plus...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X