Question

J'ai besoin de ressources expliquant comment concevoir votre logiciel de manière à ce qu'il soit extensible, c'est-à-dire afin que d'autres personnes puissent écrire des add-ons / plug-ins qui 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 cible pas un langage spécifique, je veux pouvoir comprendre l'idée de base afin de pouvoir la mettre en œuvre 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 qu'il ne cache pas trop trop ), Au moment où je veux seulement me renseigner 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.

MISE À JOUR

Je ne parle pas de la POO ni de la possibilité d'hériter mes cours. 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 modules complémentaires tiers APRÈS qu’elle ait été déployée.

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 ou l'insertion d'extraits, ou beaucoup d'autres choses (une large gamme de fonctionnalités).

Autres conseils

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

La la théorie est arrivée .

Le livre (gratuit!) est là .

L'extensibilité et la capacité d'écriture d'un plug-in doivent traiter du cycle de vie du service

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

À quoi sert OSGI?

  

L’une des fonctions principales d’un module est d’être 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 une bonne introduction ici , sur la notion centrale de service (qui est liée à 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 sont le moyen le plus connu de découpler 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 classe, car ils fonctionnent avec des instances d'objets, et non avec des noms de classe. 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 considérablement le nombre de packages partagés.

Vous essayez d'atteindre deux objectifs concurrents:

  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 " private " et les cours sont "finaux". (et ne peut pas être étendu). 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 "cette classe est-elle dans le package org.eclipse.swt"? et beaucoup de méthodes sont privées et finales et ainsi de suite. J'ai dû copier environ 28 classes de SWT dans mon projet pour implémenter cette fonctionnalité car tout est verrouillé.

SWT est un cadre agréable à utiliser et une extension à prolonger.

Appliquez 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

Principe ouvert / fermé: Entités logicielles & # 8230; doit être ouvert pour une extension, mais fermé pour une 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 à un client valent mieux qu'une interface à usage général

5. Principe de l’inversion de dépendance: Cela 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

Quel est le principe d'inversion de dépendance et Pourquoi est-ce important?

Bien sûr, il existe le fameux principe de fermeture: http://fr.wikipedia.org / wiki / Open / closed_principle

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 pénibles.
  • En Java, il existe également une 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.

L'article Écrire des applications à base de plug-in explique clairement la responsabilités des différentes parties de l’architecture selon 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.

Checkout " CAB " - Le Framework de composition d'applications de Microsoft . Je pense qu'ils ont une "version Web". de cela aussi ...

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

Utilisation de l'espace de nom System.AddIn de Microsoft. Cela semble très prometteur, mais cela peut paraître un peu complexe pour notre solution finale.

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

Récemment, j'ai envisagé de prendre des composants à la fois dans le bloc d'applications d'interface utilisateur composite et dans 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 Bloc d'application Unity

L'architecture de plug-in est en train de devenir très populaire pour son extensibilité et donc sa flexibilité.

Pour c ++, le serveur Apache httpd est en réalité basé sur un plugin, mais un concept de module est utilisé à la place. La plupart des fonctionnalités d'apache sont implémentées en tant que modules, tels que 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. Plus aucun syndrome du stop-the-world!

Si vous travaillez avec .Net, nos recherches ont abouti à deux approches: l’écriture de scripts et la composition.

Script

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 langue .NET préférée dans une langue dynamique.

Certaines options que nous avons trouvées intéressantes à 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.

  

Managed Extensibility Framework (MEF) est une couche de composition destinée à   .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 non couplé   architecture de type plugin aux applications régulières.

Framework de complément géré est aussi une bonne lecture.

Comme je n'ai pas assez de points de repère 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 plusieurs façons - 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’EDI et la mise en œuvre du plug-in. 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 savoir plus à ce sujet dans le livre "Dissection d’une application csharp". par le ou les auteurs d'origine - Christian Holm, Mike Krer, Bernhard Spuida de l'application depuis ici . Le livre ne semble pas être disponible sur ce site, mais j’en ai trouvé un exemplaire qui pourrait encore se trouver ici.

Vous avez également trouvé une question connexe ici

.

Plutôt que de réinventer la roue, utilisez les cadres en main. Eclipse et Netbeans prennent tous deux en charge les extensions basées sur des plugins. Vous devez cependant travailler en Java.

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