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).
Antworten:
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
quelle
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
Wofür ist OSGI?
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:
quelle
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?
quelle
Sie versuchen zwei konkurrierende Ziele zu erreichen:
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.
quelle
Natürlich gibt es das berühmte Open Closed-Prinzip - http://en.wikipedia.org/wiki/Open/closed_principle
quelle
Nun, es kommt auf die Sprache an.
Je nachdem, welche Sprache Sie verwenden, kann ich einige Tutorials / Bücher empfehlen. Ich hoffe das war hilfreich.
quelle
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.
quelle
Kasse "CAB" - Microsoft Composition Application Building Blocks Framework . Ich denke, sie haben auch eine "Webversion" davon ...
quelle
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
quelle
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!
quelle
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.
Managed Add-In Framework ist auch eine gute Lektüre.
quelle
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
quelle
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.
quelle