Wie entwerfe ich erweiterbare Software (Plugin-Architektur)? [geschlossen]

75

Ich benötige einige Ressourcen, die darüber sprechen, wie Sie Ihre Software so erweitern können, dass sie erweiterbar ist, dh damit andere Benutzer Add-Ons / Plug-Ins schreiben können, die ihr Funktionen hinzufügen.

Was empfehlen Sie? Gibt es Bücher, die sich mit diesem Thema befassen?
Ich würde etwas bevorzugen, das kurz und auf den Punkt ist; ein bisschen Theorie und ein paar konkrete Beispiele.

Ich ziele nicht auf eine bestimmte Sprache ab, sondern möchte die Kernidee verstehen, damit ich sie in jeder Sprache implementieren kann.

Und aus dem gleichen Grund ziehe ich es vor, es nicht mit einem Framework zu tun, das jemand anderes erstellt hat (es sei denn, das Framework ist nicht sehr hoch, dh es verbirgt sich nicht zu sehr). Im Moment möchte ich mich nur über das Framework informieren Thema und experimentieren Sie mit verschiedenen Möglichkeiten, um es umzusetzen. Außerdem setzt ein Framework normalerweise das Wissen des Benutzers über das Thema voraus.

AKTUALISIEREN

Ich frage nicht nach OOP oder erlaube nicht, dass meine Klassen vererbt werden. Ich spreche über das Entwerfen einer Anwendung, die auf einem System bereitgestellt wird, sodass sie nach der Bereitstellung durch Add-Ons von Drittanbietern erweitert werden kann.

Notepad ++ verfügt beispielsweise über eine Plug-In-Architektur, in der Sie eine DLL-Datei im Plugins-Ordner ablegen können, und fügt der Anwendung Funktionen hinzu, die nicht vorhanden waren, z. B. Farbauswahl, Einfügen von Snippets oder viele andere Dinge (eine breite Palette von Funktionen).

hasen
quelle
Ich denke, Sie werden feststellen, dass die meisten Plug-In-Umgebungen Basisklassen zum Schreiben eines Plug-Ins bereitstellen. Ihr benutzerdefiniertes Plug-In von Drittanbietern würde von der Basisklasse abgeleitet und die Funktionalität des "Plug-In-Standards" erweitern.
Kieveli
3
Sie werden feststellen, dass die Erweiterbarkeit von Software wie Firefox und Notepad ++ auf den Wurzeln des OO-Designs beruht. Das gleiche Prinzip, das Ihre Klassen erweiterbar macht, hilft dabei, Ihre gesamte Software erweiterbar zu machen.
Orokusaki

Antworten:

25

Wenn es sich um .NET handelt, versuchen Sie, .NET-Anwendungen mit VBScript in CodeProject zu skripten. Viele konkrete Beispiele dort.

Im Folgenden finden Sie Websites, die verschiedene Techniken zur Anwendungserweiterung implementieren

Bugmagnet
quelle
1
Spooky, die Plugin-Architektur mit C # -Link besteht aus Code, der genau wie ein POC aussieht, den ich einmal geschrieben habe. Es fehlte nur eines: Ein Dateisystemwatcher zum Aufnehmen neuer Module zur Laufzeit. Ideal für Demos: "Legen Sie die DLL in dieses Verzeichnis und ... Voila! Eine neue Menüauswahl."
Guge
1
akzeptiert wegen dieses Links codeguru.com/cpp/misc/misc/plug-insadd-ins/article.php/c3879, den ich zuerst nicht bemerkt habe!
Hasen
Vielen Dank. Asante. Shukria. Shukran. Tenkyu tru. Obligad. Merci. Gracias. Arigato. Xie xie. Navazisch.
Bugmagnet
wirklich interessantes Zeug! Vielen Dank!
Sander Versluys
16

OSGI ist ein gutes praktisches Beispiel für ein technisches Framework, mit dem Sie das tun können, wonach Sie suchen .

Die Theorie ist hier .

Das (kostenlose!) Buch ist da .

Die Erweiterbarkeit und die Fähigkeit, Plugins zu schreiben, müssen sich mit dem Servicelebenszyklus befassen

  • Service / Plugin vor Ort hinzufügen / entfernen
  • Verwalten von Abhängigkeiten zwischen Diensten
  • Verwalten von Dienstzuständen (deklariert, installiert, gestartet, gestoppt, ...)

Wofür ist OSGI?

Eine der Hauptfunktionen eines Moduls ist die Bereitstellung… etwas, das wir entweder erstellen oder herunterladen und installieren können, um die Funktionalität unserer Anwendung zu erweitern.

Hier finden Sie eine gute Einführung in den zentralen Begriff des Dienstes (der mit Ihrer Frage zusammenhängt und einige Probleme im Zusammenhang mit Diensten erklärt, Schlüsselkomponente für die Erweiterbarkeit).

Extrakt:

Warum sind Dienste dann so wichtig, wenn so viele Anwendungen ohne sie erstellt werden können? Nun, Services sind die bekannteste Methode, um Softwarekomponenten voneinander zu entkoppeln.

Einer der wichtigsten Aspekte von Diensten besteht darin, dass sie Probleme beim Laden von Klassen erheblich minimieren, da sie mit Instanzen von Objekten und nicht mit Klassennamen arbeiten. Instanzen, die vom Anbieter erstellt werden, nicht vom Verbraucher. Die Reduzierung der Komplexität ist ziemlich überraschend

Services minimieren nicht nur die Konfiguration, sondern reduzieren auch die Anzahl der gemeinsam genutzten Pakete erheblich.

VonC
quelle
Was ist Osgi? Ich habe mir die Website angesehen, aber ich verstehe nicht, wie sie mit meiner Frage zusammenhängt!
Hasen
2
Schauen Sie sich diese stackoverflow.com/questions/106222/what-does-osgi-solve
victor hugo
"Hinzufügen / Entfernen von Diensten / Plugins vor Ort" ist nur für Anwendungen vom Servertyp nützlich, die kontinuierlich ausgeführt werden. Andere Anwendungen können beim Start die neueste Version eines Plugins laden.
Raedwald
5

Implementieren Sie SOLID- Prinzipien in Ihrer Anwendung.

1. Prinzip der Einzelverantwortung: Eine Klasse sollte nur eine Einzelverantwortung haben (dh nur eine mögliche Änderung der Softwarespezifikation sollte die Spezifikation der Klasse beeinflussen können

2.Open/closed-Prinzip: Software-Entitäten… sollten zur Erweiterung geöffnet, aber zur Änderung geschlossen sein

3. Liskov-Substitutionsprinzip: Objekte in einem Programm sollten durch Instanzen ihrer Subtypen ersetzt werden können, ohne die Richtigkeit dieses Programms zu ändern

4. Prinzip der Schnittstellentrennung: Viele clientspezifische Schnittstellen sind besser als eine Allzweckschnittstelle

5. Prinzip der Abhängigkeitsinversion: Man sollte sich auf Abstraktionen verlassen . Verlassen Sie sich nicht auf Konkretionen

Stackoverflow-Fragen:

Beispiel für das Prinzip der Einzelverantwortung

Ist das Open / Closed-Prinzip eine gute Idee?

Was ist das Liskov-Substitutionsprinzip?

Prinzip der Schnittstellentrennung - Programmieren Sie eine Schnittstelle

Was ist das Prinzip der Abhängigkeitsinversion und warum ist es wichtig?

Ravindra Babu
quelle
4

Sie versuchen zwei konkurrierende Ziele zu erreichen:

  1. Die Komponenten Ihrer Software müssen viel von sich selbst aussetzen , damit sie wiederverwendet werden können
  2. Die Komponenten Ihrer Software müssen nur sehr wenig von sich selbst zeigen, damit sie wiederverwendet werden können

Erläuterung: Um die Wiederverwendung von Code zu fördern, sollten Sie in der Lage sein, vorhandene Klassen zu erweitern und ihre Methoden aufzurufen. Dies ist nicht möglich, wenn die Methoden als "privat" deklariert sind und die Klassen "final" sind (und nicht erweitert werden können). Um dieses Ziel zu erreichen, sollte alles öffentlich und zugänglich sein. Keine privaten Daten oder Methoden.

Wenn Sie die zweite Version Ihrer Software veröffentlichen, werden Sie feststellen, dass viele der Ideen von Version 1 einfach falsch waren. Sie müssen viele Schnittstellen oder Ihren Code ändern, Methodennamen, Methoden löschen und die API beschädigen. Wenn Sie dies tun, werden sich viele Menschen abwenden. Um Ihre Software weiterentwickeln zu können, dürfen die Komponenten nichts preisgeben, was nicht unbedingt erforderlich ist - auf Kosten der Wiederverwendung von Code.

Beispiel: Ich wollte die Position des Cursors (Caret) in einem SWT StyledText beobachten. Das Caret soll nicht verlängert werden. Wenn Sie dies tun, werden Sie feststellen, dass der Code Prüfungen wie "Ist diese Klasse im Paket org.eclipse.swt" enthält und viele Methoden privat und endgültig sind und so weiter. Ich musste ungefähr 28 Klassen aus SWT in mein Projekt kopieren, um diese Funktion zu implementieren, da alles gesperrt ist.

SWT ist ein schönes Framework und die Hölle zu erweitern.

Aaron Digulla
quelle
2

Nun, es kommt auf die Sprache an.

  • In C / C ++ gibt es ziemlich sicher eine Loadlibrary-Funktion, mit der Sie eine Bibliothek zur Laufzeit öffnen und die exportierten Funktionen aufrufen können. Dies geschieht normalerweise in C / C ++.
  • In .NET gibt es Reflection, das eine ähnliche (aber breitere) Ladebibliothek bietet. Es gibt auch ganze Bibliotheken, die auf Reflection basieren, wie Managed Extension Framework oder Mono.Addins, die den größten Teil der Arbeit bereits für Sie erledigen.
  • In Java gibt es auch Reflection. Und es gibt das JPF (Java Plugin Framework), das in Sachen wie Eclipse IIRC verwendet wird.

Je nachdem, welche Sprache Sie verwenden, kann ich einige Tutorials / Bücher empfehlen. Ich hoffe das war hilfreich.

Joemoe
quelle
"loadlibrary": nicht in Standard C / C ++.
Raedwald
1

Der Artikel Schreiben von Plugin-basierten Anwendungen erläutert anhand eines sehr einfachen Beispiels die Verantwortlichkeiten der verschiedenen Teile der Architektur. Quellcode wird bereitgestellt (VB.Net). Ich fand es sehr hilfreich, um die Grundkonzepte zu verstehen.

Tom Jürgens
quelle
0

Kasse "CAB" - Microsoft Composition Application Building Blocks Framework . Ich denke, sie haben auch eine "Webversion" davon ...

Thomas Hansen
quelle
0

Ich habe gerade mit der Entwicklung einer Smart Client-Anwendung begonnen. Dies sind zwei Optionen, die ich in Betracht ziehe.

Verwenden des System.AddIn- Namespace von Microsoft . Sieht sehr vielversprechend aus, kann jedoch für unsere Endlösung etwas komplex sein.

Oder der Smart Client - Composite UI Application Block von Microsoft

Vor kurzem habe ich mir überlegt, Komponenten sowohl den Composite UI Application Block als auch den System.AddIn-Namespace zu verwenden, um meine eigenen zu erstellen. Da der Quellcode für das CAB verfügbar ist, kann er leicht erweitert werden. Ich denke, unsere Endlösung wird eine leichte Version des CAB sein, die definitiv den Unity Application Block verwendet

Rohan West
quelle
0

Die Plugin-Architektur wird aufgrund ihrer Erweiterbarkeit und damit Flexibilität immer beliebter.

Für c ++ basiert der Apache httpd-Server tatsächlich auf Plugins, es wird jedoch stattdessen ein Modulkonzept verwendet. Die meisten Apache-Funktionen werden als Module implementiert, z. B. Cache, Umschreiben, Lastausgleich und sogar Threading-Modell. Es ist eine sehr modulare Software, die ich je gesehen habe.

Und für Java ist Eclipse definitiv Plugin-basiert. Der Kern von Eclipse ist ein OSGI-Modulsystem, das Bundles verwaltet, ein weiteres Konzept für Plugins. Bundle kann Erweiterungspunkte bereitstellen, auf denen wir mit weniger Aufwand Module erstellen können. Das komplizierteste an OSGI ist seine dynamische Eigenschaft, was bedeutet, dass Bundles zur Laufzeit installiert oder deinstalliert werden können. Kein Stop-the-World-Syndrom mehr!

yanky
quelle
0

Wenn Sie mit .Net arbeiten, ergab unsere Forschung zwei Ansätze: Skripterstellung und Komposition.

Skripting

Sie erweitern die Funktionalität Ihrer Klassen, indem Sie sie mithilfe von Skripten orchestrieren. Das bedeutet, dass Sie das, was in Ihrer bevorzugten .Net-Sprache kompiliert ist, in einer dynamischen Sprache verfügbar machen.

Einige Optionen, die es wert waren, erkundet zu werden:

Komposition

Wenn Sie ein Projekt mit .Net 4 oder höher starten, müssen Sie sich das Managed Extensibility Framework (MEF) genau ansehen. Damit können Sie die Funktionalität Ihrer Apps auf Plugin-Weise erweitern.

Das Managed Extensibility Framework (MEF) ist eine Kompositionsschicht für .NET, die die Flexibilität, Wartbarkeit und Testbarkeit großer Anwendungen verbessert. MEF kann für die Erweiterbarkeit von Plugins von Drittanbietern verwendet werden oder die Vorteile einer lose gekoppelten Plugin-ähnlichen Architektur für reguläre Anwendungen nutzen.

Managed Add-In Framework ist auch eine gute Lektüre.

Ricardo
quelle
0

Da ich nicht genügend Wiederholungspunkte habe, um einen Kommentar zu hinterlassen, poste ich dies als Antwort. SharpDevelop ist eine IDE zum Entwickeln von Anwendungen in C # / VB.NET / Boo. Es hat eine ziemlich beeindruckende Architektur, die sich auf verschiedene Arten erweitern lässt - von neuen Menüpunkten bis hin zur Entwicklungsunterstützung für ganz neue Sprachen.

Es verwendet ein bisschen XML-Konfiguration, um als Klebeschicht zwischen einem Kern der IDE und der Plugin-Implementierung zu fungieren. Es übernimmt das sofortige Auffinden, Laden und Versionieren von Plugins. Zum Bereitstellen neuer Plugins müssen Sie lediglich die neue XML-Konfigurationsdatei und die erforderlichen Assemblys (DLLs) kopieren und die Anwendung neu starten. Weitere Informationen hierzu finden Sie in dem Buch "Präparieren einer csharp-Anwendung" der ursprünglichen Autoren - Christian Holm, Mike Krüger und Bernhard Spuida der Anwendung von hier aus . Das Buch scheint auf dieser Seite nicht verfügbar zu sein, aber ich habe eine Kopie gefunden, die möglicherweise noch hier ist

Habe hier auch eine verwandte Frage gefunden

Shreyas Murali
quelle
-8

Verwenden Sie die Rahmen in der Hand, anstatt das Rad neu zu erfinden. Eclipse und Netbeans unterstützen beide Plugin-basierte Erweiterungen. Sie müssen jedoch in Java arbeiten.

questzen
quelle