Frage

Gibt es ein allgemeines Verfahren zum Programmieren der Erweiterbarkeitsfähigkeit in Ihren Code?

Ich frage mich, wie das allgemeine Verfahren zum Hinzufügen von Erweiterungsfunktionen zu einem System, das Sie schreiben, aussieht, damit die Funktionalität über eine Art Plugin-API erweitert werden kann, anstatt den Kerncode eines Systems ändern zu müssen.

Hängen solche Dinge tendenziell von der Sprache ab, in der das System geschrieben wurde, oder gibt es eine allgemeine Methode, dies zu berücksichtigen?

War es hilfreich?

Lösung

Dies ist im Allgemeinen etwas, das Sie selbst offenlegen müssen. Es hängt also von der Sprache ab, in der Ihr System geschrieben ist (obwohl es oft auch möglich ist, Wrapper für andere Sprachen zu schreiben).

Wenn Sie beispielsweise ein Programm in C für Windows geschrieben hätten, würden Plugins für Ihr Programm als DLLs geschrieben.Zur Laufzeit würden Sie diese DLLs manuell laden und ihnen eine Schnittstelle zur Verfügung stellen.Beispielsweise könnten die DLLs eine verfügbar machen gimme_the_interface() Funktion, die eine mit Funktionszeigern gefüllte Struktur akzeptieren könnte.Diese Funktionszeiger würden es der DLL ermöglichen, Aufrufe zu tätigen, Rückrufe zu registrieren usw.

Wenn Sie in C++ arbeiten würden, würden Sie das DLL-System verwenden, außer dass Sie wahrscheinlich einen Objektzeiger anstelle einer Struktur übergeben würden und das Objekt eine Schnittstelle implementieren würde, die Funktionalität bereitstellt (das Gleiche wie die Struktur, aber weniger hässlich).Für Java würden Sie Klassendateien bei Bedarf anstelle von DLLs laden, aber die Grundidee wäre dieselbe.

In allen Fällen müssen Sie eine Standardschnittstelle zwischen Ihrem Code und den Plugins definieren, damit Sie die Plugins initialisieren können und die Plugins mit Ihnen interagieren können.

P.S.Wenn Sie ein gutes Beispiel eines C++-Plugin-Systems sehen möchten, schauen Sie sich das an foobar2000 SDK.Ich habe es eine ganze Weile nicht benutzt, aber es war wirklich gut gemacht.Ich gehe davon aus, dass es immer noch so ist.

Andere Tipps

Ich habe in der Vergangenheit ereignisbasierte APIs für Plugins verwendet.Sie können Hooks für Plugins einfügen, indem Sie Ereignisse auslösen und Zugriff auf den Anwendungsstatus gewähren.

Wenn Sie beispielsweise eine Blogging-Anwendung schreiben, möchten Sie möglicherweise ein Ereignis auslösen, kurz bevor ein neuer Beitrag in der Datenbank gespeichert wird, und den HTML-Code des Beitrags dem Plugin zur Verfügung stellen, damit dieser bei Bedarf geändert werden kann.

Ich bin versucht, Sie für diese allgemeine Frage auf das Design Patterns-Buch zu verweisen :p

Im Ernst, ich denke, die Antwort ist nein.Sie können standardmäßig keinen erweiterbaren Code schreiben, er wird sowohl schwer zu schreiben/erweitern als auch äußerst ineffizient sein (Mozilla begann mit der Idee, sehr erweiterbar zu sein, verwendete überall XPCOM, und jetzt erkannten sie, dass es sich um einen Fehler handelte, und begannen, ihn zu entfernen wo es keinen Sinn ergibt).

Was sinnvoll ist, ist, die Teile Ihres Systems zu identifizieren, die sinnvoll erweitert werden können, und eine geeignete API für diese Fälle zu unterstützen (z. B.Sprachunterstützungs-Plugins in einem Editor).Sie würden die relevanten Muster verwenden, aber die konkrete Implementierung hängt von Ihrer Plattform-/Sprachwahl ab.

Meiner Meinung nach hilft es auch, eine dynamische Sprache zu verwenden – sie ermöglicht es, den Kerncode zur Laufzeit zu optimieren (wenn unbedingt erforderlich).Ich schätze, dass die Erweiterbarkeit von Mozilla beim Schreiben von Firefox-Erweiterungen auf diese Weise funktioniert.

Ich denke, Ihre Frage hat zwei Aspekte:

Der Entwurf des Systems soll erweiterbar sein (Entwurfsmuster, Umkehrung der Steuerung und andere architektonische Aspekte) (http://www.martinfowler.com/articles/injection.html).Und zumindest für mich sind diese Muster/Techniken plattform-/sprachunabhängig und können als „allgemeines Verfahren“ angesehen werden.

Nun ist ihre Implementierung sprach- und plattformabhängig (in C/C++ gibt es beispielsweise die dynamischen Bibliotheksinhalte usw.)

Es wurden mehrere „Frameworks“ entwickelt, um Ihnen eine Programmierumgebung zu bieten, die Ihnen Pluggability/Erweiterbarkeit bietet, aber wie einige andere bereits erwähnt haben, sollten Sie nicht zu verrückt werden, wenn Sie alles Pluggable machen.

In der Java-Welt ist OSGi eine gute Spezifikation (http://en.wikipedia.org/wiki/OSGi) mit mehreren Implementierungen, die meiner Meinung nach beste ist Equinox (http://www.eclipse.org/equinox/)

  1. Finden Sie heraus, welche Mindestanforderungen Sie an einen Plugin-Autor stellen möchten.Erstellen Sie dann eine oder mehrere Schnittstellen, die der Autor implementieren muss, damit Ihr Code weiß, wann und wo er den Code ausführen muss.

  2. Erstellen Sie eine API, mit der der Autor auf einige Funktionen in Ihrem Code zugreifen kann.

Sie können auch eine Basisklasse erstellen, die der Autor erben muss.Dadurch wird die Verkabelung der API einfacher.Verwenden Sie dann eine Art Reflexion, um ein Verzeichnis zu scannen und die Klassen zu laden, die Ihren Anforderungen entsprechen.

Manche Leute erstellen auch eine Skriptsprache für ihr System oder implementieren einen Interpreter für eine Teilmenge einer vorhandenen Sprache.Dies ist auch ein möglicher Weg.

Fazit ist:Wenn Sie den Code zum Laden bringen, sollte Sie nur Ihre Fantasie aufhalten können.
Viel Glück.

Wenn Sie eine kompilierte Sprache wie C oder C++ verwenden, ist es möglicherweise eine gute Idee, sich mit der Plugin-Unterstützung über Skriptsprachen zu befassen.Sowohl Python als auch Lua sind ausgezeichnete Sprachen, die zum Skripten einer großen Anzahl von Anwendungen verwendet werden (Civ4 und Blender verwenden Python, Supreme Commander verwendet Lua usw.).

Wenn Sie C++ verwenden, schauen Sie sich die Boost-Python-Bibliothek an.Ansonsten enthält Python Header, die in C verwendet werden können, und dokumentiert die C/Python-API recht gut.Für Lua schien die Dokumentation weniger vollständig zu sein, aber ich habe vielleicht nicht genau genug gesucht.So oder so können Sie eine ziemlich solide Skriptplattform ohne großen Arbeitsaufwand anbieten.Es ist immer noch nicht trivial, aber es bietet Ihnen eine sehr gute Basis zum Arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top