web-dev-qa-db-fra.com

Comment concevoir un logiciel extensible (architecture de plugin)?

Il me faut des ressources qui expliquent comment concevoir votre logiciel de manière à ce qu’il soit extensible, c’est-à-dire pour que d’autres personnes puissent écrire des add-ons/plug-ins qui y ajoutent des fonctionnalités.

Que recommandez-vous? Y a-t-il des livres sur le sujet?
Je préférerais quelque chose qui est court et précis; un peu de théorie et un tas d'exemples concrets.

Je ne vise pas un langage spécifique, je veux pouvoir comprendre l'idée de base pour pouvoir l'implémenter dans n'importe quelle langue.

Et pour la même raison, je préfère ne pas le faire en utilisant un framework que quelqu'un d'autre a construit (à moins que le framework ne soit pas de très haut niveau, c'est-à-dire ne cache pas trop beaucoup), pour le moment je ne vouloir m'éduquer sur le sujet et expérimenter différentes façons de le mettre en œuvre. De plus, un framework suppose généralement que l'utilisateur connaisse le sujet.

METTRE À JOUR

Je ne pose pas de question sur OOP ni sur l'héritage de mes classes. Je parle de la conception d'une application qui sera déployée sur un système, de telle sorte qu'elle puisse être étendue par des add-on tiers après son déploiement.

Par exemple, Notepad ++ a une architecture de plug-in dans laquelle vous pouvez placer un fichier .dll dans le dossier plugins et ajoute des fonctionnalités à l'application absente, telles que la sélection des couleurs, l'insertion d'extraits de code ou de nombreuses autres choses. (une large gamme de fonctionnalités).

67
hasen
24
bugmagnet

OSGI est un bon exemple pratique de cadre technique permettant de faire ce que vous voulez.

Le la théorie est ici .

Le (gratuit!) Livre est là .

L’extensibilité et la possibilité d’écrire un plugin doivent tenir compte du cycle de vie du service

  • ajout/suppression de service/plugin sur place
  • gérer les dépendances entre les services
  • gestion des états de services (déclarés, installés, démarrés, arrêtés, ...)

à quoi sert OSGI?

L’une des fonctions principales d’un module est une unité de déploiement… que nous pouvons soit construire, soit télécharger et installer pour étendre les fonctionnalités de notre application.

Vous trouverez un bonne introduction ici , sur la notion centrale de (qui est lié à votre question et qui explique certains problèmes liés aux services, composant clé de l'extensibilité).

Extrait:

Pourquoi les services sont-ils si importants si tant d'applications peuvent être construites sans eux? Les services constituent le moyen le plus connu de dissocier les composants logiciels les uns des autres.

L'un des aspects les plus importants des services est qu'ils minimisent considérablement les problèmes de chargement de classes, car ils fonctionnent avec des instances d'objets, et non avec des noms de classes. Instances créées par le fournisseur, pas par le consommateur. La réduction de la complexité est assez surprenante

Non seulement les services minimisent la configuration, mais ils réduisent également de manière significative le nombre de packages partagés.

15
VonC

Implémentez les principes SOLID dans votre application.

1. Principe de responsabilité unique:} [ Une classe ne devrait avoir qu'une seule responsabilité (c'est-à-dire qu'un seul changement potentiel dans la spécification du logiciel devrait pouvoir affecter la spécification de la classe.

2. Principe ouvert/fermé: Les entités logicielles… doivent être ouvertes pour extension, mais fermées pour modification

3. Principe de substitution de Liskov:} [ Les objets d'un programme doivent pouvoir être remplacés par des occurrences de leurs sous-types sans en altérer l'exactitude.

4. Principe de séparation des interfaces: De nombreuses interfaces spécifiques au client sont meilleures qu'une interface à usage général

5. Principe d'inversion de dépendance: _ ​​On devrait dépendre des abstractions. Ne comptez pas sur les concrétions

Questions Stackoverflow:

Exemple de principe de responsabilité unique

Le principe d'ouverture/fermeture est-il une bonne idée?

Quel est le principe de substitution de Liskov?

Principe de séparation des interfaces - Programmer une interface

Qu'est-ce que le principe d'inversion de dépendance et pourquoi est-il important?

4
Ravindra babu

Vous essayez d'atteindre deux objectifs contradictoires:

  1. Les composants de votre logiciel doivent exposer beaucoup d’eux-mêmes, pour pouvoir être réutilisés
  2. Les composants de votre logiciel doivent exposer très peu d’eux-mêmes, pour pouvoir être réutilisés

Explication: Pour encourager la réutilisation du code, vous devez pouvoir étendre les classes existantes et appeler leurs méthodes. Cela n'est pas possible lorsque les méthodes sont déclarées "privées" et que les classes sont "finales" (et ne peuvent pas être étendues). Donc, pour atteindre cet objectif, tout doit être public et accessible. Pas de données ou méthodes privées.

Lorsque vous publiez la deuxième version de votre logiciel, vous constaterez que nombre des idées de la version 1 étaient tout à fait fausses. Vous devez modifier de nombreuses interfaces ou votre code, les noms de méthodes, supprimer des méthodes, casser l'API. Si vous faites cela, beaucoup de gens se détourneront. Donc, pour pouvoir faire évoluer votre logiciel, les composants ne doivent pas exposer quoi que ce soit qui n’est pas absolument nécessaire - au prix de la réutilisation du code.

Exemple: je souhaitais observer la position du curseur (curseur) dans un SWT StyledText. Le curseur n'est pas destiné à être étendu. Si vous le faites, vous constaterez que le code contient des vérifications telles que "est cette classe dans le paquet org.Eclipse.swt" et que de nombreuses méthodes sont privées, finales et autres. J'ai dû copier environ 28 classes de SWT dans mon projet simplement pour implémenter cette fonctionnalité car tout est verrouillé.

SWT est un cadre de Nice à utiliser et à prolonger.

4
Aaron Digulla

Bien sûr, il y a le fameux principe Open Closed - http://fr.wikipedia.org/wiki/Open/closed_principle

3
LenW

Cela dépend de la langue. 

  • En C/C++, je suis presque sûr qu'il existe une fonction loadlibrary qui vous permet d'ouvrir une bibliothèque au moment de l'exécution et d'appeler ses fonctions exportées. C'est généralement ce qui se passe en C/C++.
  • Dans .NET, il existe Reflection, qui propose des offres similaires (mais plus larges) à loadlibrary. Il existe également des bibliothèques entières basées sur Reflection, telles que Managed Extension Framework ou Mono.Addins, qui s’occupe déjà de la plupart des tâches lourdes.
  • En Java, il y a aussi la réflexion. Et il y a le JPF (Java Plugin Framework) qui est utilisé dans des choses comme Eclipse IIRC.

En fonction de la langue que vous utilisez, je pourrais vous recommander des tutoriels/livres. J'espère que cela a été utile.

2
joemoe

L'article Rédaction d'applications à base de plug-in explique clairement les responsabilités des différentes parties de l'architecture à l'aide d'un exemple très simple. le code source est fourni (VB.Net). Je l'ai trouvé très utile pour comprendre les concepts de base.

1
Tom Juergens

Comme je n’ai pas assez de points de rep pour laisser un commentaire, je l’affiche comme réponse. SharpDevelop est un IDE pour développer des applications en C #/VB.NET/Boo. Son architecture est assez impressionnante et peut être étendue de différentes manières - des nouveaux éléments de menu à la prise en charge du développement de toutes nouvelles langues.

Il utilise un peu de configuration XML pour agir en tant que couche collante entre un noyau de l'implémentation IDE et le plugin. Il prend en charge la localisation, le chargement et la gestion des versions des plugins. Le déploiement de nouveaux plugins consiste simplement à copier le nouveau fichier de configuration XML et les assemblys requis (DLL), puis à redémarrer l'application. Vous pouvez en apprendre plus à ce sujet dans le livre "Dissection d’une application csharp" du ou des auteurs originaux - Christian Holm, Mike Krüger et Bernhard Spuida de l’application de here . Le livre ne semble pas être disponible sur ce site, mais j’en ai trouvé un exemplaire qui pourrait encore être dans les environs ici

Également trouvé une question connexe ici

0
Shreyas Murali

Si vous travaillez avec .Net, notre recherche a abouti à deux approches: l’écriture de scripts et la composition.

Scripting

Vous étendez les fonctionnalités de ce que vos classes peuvent faire en les orchestrant à l'aide de scripts. Cela signifie exposer ce qui est compilé dans votre langage .Net préféré dans un langage dynamique.

Certaines options que nous avons trouvé intéressant d'explorer:

Composition

Si vous démarrez un projet avec .Net 4 ou une version ultérieure, vous devez examiner de près le MEF (Managed Extensibility Framework). Il vous permet d'étendre les fonctionnalités de vos applications de manière plug-in.

MEF (Managed Extensibility Framework) est une couche de composition pour .NET qui améliore la flexibilité, la maintenabilité et la testabilité de grandes applications. MEF peut être utilisé pour un plugin tiers l'extensibilité, ou il peut apporter les avantages d'un couplage lâche architecture de type plugin aux applications régulières.

Managed Add-In Framework est également une bonne lecture. 

0
Ricardo

L'architecture de plugin devient très populaire pour son extensibilité et donc sa flexibilité.

Pour c ++, le serveur Apache httpd est en fait basé sur un plugin, mais un concept de module est utilisé à la place. La plupart des fonctionnalités d'Apache sont implémentées sous forme de modules, comme le cache, la réécriture, l'équilibrage de la charge et même le modèle de thread. C'est un logiciel très modulaire que j'ai jamais vu.

Et pour Java, Eclipse est définitivement basé sur des plugins. Le noyau d’Eclipse est un système de modules OSGI qui gère les bundles, un autre concept de plug-in. Bundle peut fournir des points d’extension sur lesquels nous pouvons construire des modules avec moins d’efforts. La caractéristique la plus complexe d'OSGI est sa caractéristique dynamique, ce qui signifie que les ensembles peuvent être installés ou désinstallés au moment de l'exécution. Pas de syndrome stop-the-world!

0
yanky

Commander "CAB" - Microsoft Composition Application Building Block Framework . Je pense qu'ils ont aussi une "version web" de ça ...

0
Thomas Hansen

Je viens de commencer à développer une application client intelligente. Ce sont deux options que je considère.

Utilisation de System.AddIn namespace de Microsoft. Cela semble très prometteur, mais cela risque d’être un peu complexe pour notre solution finale.

Ou le client intelligent - Bloc d'applications d'interface utilisateur composite de Microsoft

Récemment, j'ai envisagé de prendre les composants à la fois du bloc d'application d'interface utilisateur composite et de l'espace de noms System.AddIn pour créer le mien. Étant donné que le code source est disponible pour le CAB, il est facile à étendre. Je pense que notre solution finale sera une version allégée du CAB, utilisant définitivement le Unity Application Block

0
Rohan West