"unbekannte" Klassen als Plug-Ins laden
-
Hem, ein Plugin-System. Tja, müssen die Plugins halt in eine DLL (unter Windows) und sich irgendwie bei einem Manager anmelden. Dabei muß der Manager ein bestimmtes Plugin-Verzeichnis durchsuchen und dort alle DLLs (Plugins) laden und sie aufrufen, damit die sich beim Manager melden können.
Fertigen Code kann ich dir nicht abliefern, aber dürfte ja auch nicht so schwer umzusetzen sein. Notfalls schauste dir das Plugin-System von www.Codeblocks.org an.
-
prolog schrieb:
google mal nach factory pattern ob es das ist was du suchst.
Hmm, meinst du nicht eher das Visitor-Pattern?
-
Hi,
ja ich hatte es zunächst wie artchi verstanden, dass er klassen dynamisch erzeugen will je nachdem welche gerade benötigt wird.
Aber wenn er visitor verwendet müsste er für jeden algo einen bereitstellen und jede der klassen die besucht werden können müssten entsprechend den acceptor implementieren. Und für jede neue konkrete klasse wäre eine entsprechende methode im visitor nötig.
Ich hab jetzt noch ein paar mal über den ausgangspost gelesen und bin mir nicht mehr sicher was er eigentlich will.
-
Vielen Dank alle zusammen,
also das große Problem dadei ist, das ich die Algo-Klassen -noch- nicht kenne.
Und später jederzeit neue Klassen hinzukommen können.
Also kann ich sie nicht über den Namen referenzierern und wenn eine neue Klasse hinzukommt soll man nicht das ganze Programm neu kompilieren müßen.
D.h. ich muß einen Weg finden zu erkennen das eine neue Klasse verfügbar ist und von ihr eine Instanz erzeugen mit der gearbeitet werden kann.Die Idee von Archi geht in die Richtung wie es gemeint war und gebraucht wird.
Problem: nicht Plattformunabhängig. (Für die Plattformabhängigen Teile steht Qt4 zur Verfügung.) Aber die Richtung ist das schon. Ähnlich wie dem Listener-Konzept in Java wär die Sache nicht schlecht. Doch dafür müssen die Klassen sich halt beim Manager registrieren, also schonmal auf sie zugegriffen worden sein.Und das ist es: Wie greife ich auf die unbekannten Klassen zu?
-
frosty schrieb:
Vielen Dank alle zusammen,
also das große Problem dadei ist, das ich die Algo-Klassen -noch- nicht kenne.
Und später jederzeit neue Klassen hinzukommen können.
Also kann ich sie nicht über den Namen referenzierern und wenn eine neue Klasse hinzukommt soll man nicht das ganze Programm neu kompilieren müßen.
D.h. ich muß einen Weg finden zu erkennen das eine neue Klasse verfügbar ist und von ihr eine Instanz erzeugen mit der gearbeitet werden kann.Die Idee von Archi geht in die Richtung wie es gemeint war und gebraucht wird.
Problem: nicht Plattformunabhängig. (Für die Plattformabhängigen Teile steht Qt4 zur Verfügung.) Aber die Richtung ist das schon. Ähnlich wie dem Listener-Konzept in Java wär die Sache nicht schlecht. Doch dafür müssen die Klassen sich halt beim Manager registrieren, also schonmal auf sie zugegriffen worden sein.Und das ist es: Wie greife ich auf die unbekannten Klassen zu?
Falls alles zur Laufzeit geschehen soll, brauchst du irgendeinen Angriffspunkt. Sonst kann es gar nicht funktionieren. Zum Beispiel können die Klassen in Plugins liegen, die in einem Verzeichnis abgelegt werden. Neue Klassen implementieren einfach das Plugininterface und werden in das Verzeichnis gestellt.
Die Hauptanwendung scannt das Verzeichnis (oder sie lässt sich Dateinamen direkt geben) und lädt die gefundenen Klassen. Über ein Standardplugininterface registrieren sich dann die Klassen beim System. Um die Plugins systemunabhängig zu laden, bietet sich die Klasse QLibrary (http://doc.trolltech.com/4.0/qlibrary.html) an.
Zum Beispiel kann jedes Plugin die Methode register_classes(Manager
anbieten, die vom Programm aufgerufen wird. Diese Methode verwendet dann das Interface des Managers, um sich selbst als Graphenalgorithmus zu registrieren.
-
wenn eine neue Klasse hinzukommt soll man nicht das ganze Programm neu kompilieren müßen.
Die funktionalitaet der neuen klasse musst aber auch irgendwie implementieren . Willst die in c++ codieren, muss sie ja auch compilliert werden, ohne das hauptprogramm noch mal neu zu linken, kommst um ein Plugin System da nich herum (Windows - Dll's, Unixe - so's )
Alternativ, wenn du deine funktionalitaet nich zu komplex gestaltest, und das gut textual zu beschreiben ist, kannst du ne art scriptinterpreter bauen, und deine Generische Manager klasse iss eigentlich nen interpreter fuer deine Scripts, die er dynamisch ausm verzeichniss laden kann ...
Wie greife ich auf die unbekannten Klassen zu?
Interfaces sind hier das A & O !
Um eine unbekannte klasse verwenden zu koennen, muss sie sich halt nach richtlinen verhalten -> InterfacesWie die Vorgaenger schon geschrieben haben ... Plugin-System / Manager, ObjectFabriken, Interfaces sind die themen wo dich intensiv mit beschaeftigen solltest ....
Ciao ...
-
Nochmals Danke für die Tips.
An eine Liste mit allen Dateinamen in einem Verzeichnis habe ich auch schon gedacht.
Ein Scriptinterpreter geht nicht. Die Algorithmen sind sehr Komplex und sollen auf Ausführungszeit optimiert werden.Die Sache mit dem Interface ist nicht das Problem. Das werde ich im Pflichtenheft mit einer Abstrakten-Oberklasse definieren.
Doch fehlt mir bisher das Wissen wie ich die Klassen, die ja ohne Probleme in einem bestimmten Verzeichnis liegen können/müssen, instanziieren kann.Ich werde mir mal die QLibrary ansehen. Vielleicht ist das das was ich such.
Ich komme aus der Java-Ecke und sitz das erste mal vor C++.
Hätt ich gewußt was diese "Kleinigkeit" für Probleme liefern wird, ......
Aber Danke das Ihr soviel Geduld habt!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
RHBaum schrieb:
Alternativ, wenn du deine funktionalitaet nich zu komplex gestaltest, und das gut textual zu beschreiben ist, kannst du ne art scriptinterpreter bauen, und deine Generische Manager klasse iss eigentlich nen interpreter fuer deine Scripts, die er dynamisch ausm verzeichniss laden kann ...
Das ist genau das, was mir in kürze bevorsteht. Ich möchte mit einem Kollegen eine (anfangs erstmal recht simple) Scriptsprache entwickeln, die nicht nur ohne neukompilation auskommt, sondern sogar in einen laufenden deamon gespeist wird, um dessen inneres Verhalten zu ändern.
Das ganze soll eine Client-Server-Architektur werden, wo registrierte Clients auf persöniche Accountobjekte zugreifen können und von dort aus Aktionen an anderen, verlinkten Objekten ausgeführt werden können.
Eine Codeänderung und neue Klassen werden einfach eingespeist und mit speziellen Initialisierungen in das laufende System eingebunden, ohne dass das davon groß beeinträchtigt wird. Es wird vermutlich eine ziemliche Herausforderung, weil das Programm die Klassen während der Laufzeit mitsamt dem gewünschten Verhalten neu erzeugen muss.
Würd mich mal interessieren, ob jemand Erfahrung in der Richtung hat...
-
Wieso nicht die Klassen auf einer Plugin laden, diese mittels einer Objektfactory instantisieren, die Ausführung mittels eines Visitors implementieren. Schliesslich sind all diese Teilprobleme bereits angesprochen worden. Unter http://www.gamedev.net/reference/articles/article928.asp kannst du nachlesen, wie man solch ein Pluginsystem recht einfach hochziehen kann.
MfG Kimmi
-
Hallo,
ich habe mich neulich mal mit dem Factory-Pattern auseinandergesetzt. Im Internet danach gesucht. Die Seite die ich gefunden hatte war aber nicht sehr hilfreich. Der Beschreibung nach, für meine Zwecke net geeignet.
Habe dann heute nochmal gesucht und ne Seite gefunden die es richtig erklärte. Ja, das ist sehr hilfreich. Werde mich damit jetzt mal genauer beschäftigen.
Kennt jemand vielleicht ein gutes Buch oder ne Seite dazu?Ciao
-
ohja:
Gamma/Helm/Johnson/Vlissides: "Entwurfsmuster" (design patterns)
Entwurfsmuster | ISBN: 3827321999