Comment concevoir extensible logiciel (architecture de plugin)?
J'ai besoin de quelques ressources que parler de la façon de concevoir votre logiciel pour être extensible, c'est à dire afin que d'autres personnes peuvent écrire des add-ons/plugins qui ajoute des fonctionnalités à elle.
Que recommandez-vous? Tous les livres qui abordera le sujet?
Je préfère quelque chose de plus c'est court et au point; un peu de théorie et un tas d'exemples concrets.
Je ne suis pas le ciblage d'une langue spécifique, je veux être en mesure de comprendre l'idée de base afin que je puisse la mettre en œuvre dans n'importe quelle langue.
Et pour la même raison, je préfère ne pas le faire à l'aide d'un cadre que quelqu'un d'autre construit (à moins que le cadre n'est pas très haut niveau, c'est à dire de ne pas cacher trop beaucoup), à l'instant, je veux seulement me renseigner sur le sujet et à expérimenter avec différentes façons de la mettre en œuvre. De Plus, un cadre suppose généralement la connaissance de l'utilisateur sur le sujet.
Mise à JOUR
Je ne suis pas de demander à propos de la programmation orientée objet ou de permettre à mes cours pour être héritée. Je parle de la conception d'une application qui sera déployé sur un système, de sorte qu'il peut être étendu par des tiers add-ons APRÈS son déploiement.
Par exemple, Notepad++ possède une architecture de plug-in où vous pouvez placer une .fichier dll dans le dossier plugins, et il ajoute des fonctionnalités à la demande qui n'était pas là, comme la couleur, la cueillette ou l'insertion de fragments, ou bien d'autres choses (un large éventail de fonctionnalités).
- Je pense que vous trouverez que la plupart des plug-in environnements de fournir des classes de base pour l'utilisation dans l'écriture d'un plug-in. Personnalisé de votre 3ème partie plug-in ne se dériver de la classe de base, et de l'étendre de "plug-in standard" de la fonctionnalité.
- Vous verrez que la nature extensible de logiciels comme Firefox et Notepad ++ est originaire de il est de conception OO des racines. Le même principe qui fait vos classes extensible aideront à rendre votre logiciel ensemble extensible.
Vous devez vous connecter pour publier un commentaire.
SI nous parlons .NET, essayez de L'écriture de scripts .NET applications avec VBScript sur CodeProject. Beaucoup d'exemples concrets là.
Ci-dessous sont des sites de mise en œuvre de différentes techniques de prolongation de la
OSGI est un bon exemple pratique d'un cadre technique permettant de faire ce que vous êtes après.
La la théorie est ici.
La (gratuit!) le livre est-il.
De l'extensibilité et de la capacité à écrire le plugin doit composer avec cycle de vie des services
Qu'est-ce que OSGI pour ?
Vous trouverez une bonne présentation ici, sur la notion centrale de service (qui est liée à votre question, et ce qui explique certains des problèmes autour des services, élément clé pour l'extensibilité).
Extrait:
Vous essayez d'atteindre deux objectifs opposés:
Explication: afin D'encourager la réutilisation du code, vous devriez être en mesure d'étendre les classes existantes et appeler leurs méthodes. Ce n'est pas possible lorsque les méthodes sont déclarées "privé" et les classes sont "définitifs" (et ne peut pas être prolongé). Donc, pour répondre à cet objectif, tout doit être public et accessible. Pas de données privées ou des méthodes.
Lorsque vous relâchez la deuxième version de votre logiciel, vous trouverez que de nombreuses idées de la version 1 ont été simplement faux. Vous avez besoin de changer le nombre d'interfaces ou de votre code, les noms de méthodes, de supprimer les méthodes, le saut de l'API. Si vous faites cela, beaucoup de gens vont se détourner. Ainsi, pour être en mesure de faire évoluer votre logiciel, les composants ne doivent pas exposer tout ce qui n'est pas absolument nécessaire -, le coût de la réutilisation du code.
Exemple: j'ai voulu observer la position du curseur (caret) dans une SWT StyledText. L'accent circonflexe n'est pas destiné à être étendu. Si vous le faites, vous verrez que le code contient des contrôles comme "c'est cette classe dans le package org.eclipse.swt" et un grand nombre de méthodes sont privés et final et autres joyeusetés. J'ai dû copier sur 28 classes de SWT dans mon projet juste pour mettre en œuvre cette fonctionnalité, car tout est verrouillé.
SWT est un agréable cadre de l'utilisation et de l'enfer pour étendre.
Mettre en œuvre SOLIDE principes dans votre application.
1. Principe de responsabilité unique: Une classe ne doit avoir qu'une seule responsabilité (c'est à dire uniquement un changement potentiel dans les logiciels de spécification doit être en mesure d'influer sur la spécification de la classe
2.Ouvert/fermé principe: entités Logicielles ... devrait être ouvert pour l'extension, mais fermées pour la modification
3. Principe de substitution de Liskov: Objets dans un programme doit être remplaçable avec les instances de leurs sous-types, sans altérer la justesse de ce programme
4. L'Interface de la ségrégation principe: de Nombreux clients des interfaces spécifiques sont mieux qu'une general-purpose interface
5. Inversion de dépendance principe: Un doit Dépendre des Abstractions. Ne dépendent pas de concrétions
Stackoverflow questions:
Exemple de Principe de Responsabilité Unique
Est-il Ouvert/Fermé Principe, une bonne idée?
Quel est le Principe de Substitution de Liskov?
L'Interface de la Ségrégation Principe - Programme pour une interface
Quel est le Principe d'Inversion des Dépendances et pourquoi est-il important?
Bien sûr il y a le fameux Principe Ouvert Fermé - http://en.wikipedia.org/wiki/Open/closed_principle
Bien cela dépend de la langue.
En fonction du langage que vous utilisez, je recommanderais une tutoriel/livres. J'espère que cela vous a été utile.
L'article L'Écriture De Plugins Applications De Base De 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 dans la compréhension des concepts de base.
Checkout "CAB" - Microsoft logiciel de Composition de blocs de Construction de Cadre. Je pense qu'ils ont une "version web" de trop...
J'ai juste commencé à développer une application client intelligent. Ces deux options que j'envisage.
À l'aide de Microsoft Système.AddIn espace de noms. Semble très prometteur, mais il peut être un peu complexe pour notre solution de bout.
Ou la Smart Client - Composite de l'INTERFACE utilisateur de l'Application Bloc à partir de Microsoft
Récemment, j'ai regardé en prenant des composants à la fois l'INTERFACE utilisateur Composite Bloc d'Application et le Système.Complément de l'espace de noms de construire mon propre. Depuis le code source est disponible pour la CABINE, il est facile à étendre. Je pense que notre solution de bout en sera un peu de poids version de la CABINE, sans hésiter à l'aide de la L'Unité De Bloc D'Application
Architecture de Plugin est en train de devenir très populaire pour son extensibilité et donc de la souplesse.
Pour le c++, le serveur Apache httpd est en fait le plugin, mais d'un concept de module est utilisé à la place. La plupart de apache mise en œuvre des fonctionnalités sous forme de modules, comme le cache, de réécriture, d'équilibrage de la charge, et même le modèle de threading. C'est un très modulaire, le logiciel que j'ai jamais vu.
Et pour java, Eclipse est certainement plugin basé. Le noyau d'Eclipse est un OSGI module de système de gérer les ensembles, un autre concept pour le plugin. Bundle peut offrir des points d'extension sur laquelle nous pouvons construire des modules avec moins d'efforts. La plupart des complexes chose dans OSGI est sa caractéristique dynamique, ce qui signifie faisceaux peut être installé ou désinstallé à l'exécution. Pas de cessez-le-monde syndrome plus!
Si vous travaillez avec .Net, notre recherche a donné lieu à deux approches: - les scripts et la composition.
Script
Vous d'étendre les fonctionnalités de ce que vos classes peuvent le faire par leur orchestration à l'aide de scripts. Cela signifie que d'exposer ce qui est compilé dans vos favoris .Net de la langue dans un langage dynamique.
Certaines options que nous avons trouvé intéressant d'étudier:
Composition
Si vous commencer un projet avec .Net 4 ou ci-dessus, vous devez prendre un bon coup d'oeil à l'Managed Extensibility Framework (MEF). Il vous permet d'étendre les fonctionnalités de vos applications dans un plugin façon.
Complément géré dans le Cadre est également une bonne lecture.
Depuis je n'ai pas assez de points de rep pour laisser un commentaire, je vous poste ça comme réponse. SharpDevelop est un IDE pour le développement d'applications en C#/VB.NET/Boo. Il a une jolie architecture impressionnante qui permet lui-même, dans un certain nombre de façons, à partir de nouveaux éléments de menu de soutien au développement de l'ensemble de nouvelles langues.
Il utilise un peu de configuration XML pour agir comme une couche de colle entre un noyau de l'IDE et le plugin de mise en œuvre. Il gère la localisation, le chargement et la gestion des versions des plugins hors de la boîte. Le déploiement de nouveaux plugins est question de simplement copier dans le nouveau fichier de configuration xml et les assemblées (Dll) et de redémarrer l'application. Vous pouvez en lire plus à ce sujet dans le livre "la Dissection d'un csharp application" par l'auteur original(s) - Christian Holm, Mike Krüger, Bernhard Spuida de l'application de ici. Le livre ne semble pas être disponible sur ce site, mais j'ai trouvé une copie qui pourrait encore être autour de ici
Également constaté une question connexe ici
Plutôt que de réinventer la roue, utiliser les cadres dans la main. Eclipse et Netbeans à la fois de support de plugin en fonction des extensions. Vous devez travailler en Java si.