Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6345
Wohnort: Hamburg
|
Mich beschäftigt schon seit längerem die Frage, wie ich bei meinen Anwendungen ein Plugin realisieren kann bzw. ob es andere (sinnvolle) Wege gibt. Bisher hatte ich das Problem dadurch umgangen, dass ich einfach eine Pipe zu einem externen Prozess aufgebaut hatte und die Kommunikation über stdin und stdout stattfand. Nachteilig ist da aber, das der Anwender den externen Prozess kennen muss und ich den nicht so einfach fest in das GUI Menu einbauen kann. Eigentlich geht es in diesem Fall nur darum, das dass Plugin einen Text entgegen nehmen soll und diesen den individuellen wünschen des Anwenders entsprechend formatieren soll. Aber da die Wünsche der Anwender so vielfältig sind wie es Anwender gibt, möchte ich diese Aufgabe outsourcen. Bisher habe ich aber nicht wirklich verstanden, wie man ein Plugin realisiert. Von daher stellt sich auch die Frage, ob der Weg über eine Pipe wirklich eine unelegante Notlösung ist.
|
lionlizard
Anmeldungsdatum: 20. September 2012
Beiträge: 6244
Wohnort: Berlin
|
Ich weiß nicht, ob das für Dich hilfreich ist, aber für den TotalCommander, einen Dateimanager unter Windows, ist geanu so etwas realisiert: Es gibt 4 verschieden Arten von Plugins zum Download, und am Ende jeder Tabelle auf der verlinkten Seite findet sich eine Beschreibung, wie man ein solches Plugin zu schreiben hat (??? Plugin Guide). Da ich mir das noch nie angesehen habe, weiß ich nicht wie das aussieht oder ob das hilfreich für Dich ist. Aber vielleicht inspiriert Dich das ja, wie Du Deine Pluginschnittstelle realisieren könntest. Auf jeden Fall wurden mittels dieser Anleitungen jede Menge Plugins erstellt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Die Frage ist: Plugin für was? In Java sieht das anders aus als in C++ und dort wieder anders als in Ruby.
|
Developer92
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
Dakuan schrieb: Mich beschäftigt schon seit längerem die Frage, wie ich bei meinen Anwendungen ein Plugin realisieren kann bzw. ob es andere (sinnvolle) Wege gibt.
Gute Frage, das hängt ganz von den Anforderungen ab.
Eigentlich geht es in diesem Fall nur darum, das dass Plugin einen Text entgegen nehmen soll und diesen den individuellen wünschen des Anwenders entsprechend formatieren soll.
Mit vorgefertigten Werten? Dann würde sich eine Textbox anbieten, in welchem man das Ausgabeformat inkl. Platzhaltern spezifizieren kann (oder, alternativ, vorgefertigte Werte verwenden kann). Je nach Komplexität bieten sich hierfür auch reguläre Ausdrücke an.
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6345
Wohnort: Hamburg
|
@ lionlizard
Um das Beispiel zu verstehen, muss ich wohl erstmal herausfinden was das Teil machen soll. Als ich das letzte Mal im Dateisystem rumgewühlt hatte, war das noch für CP/M.
Die Frage ist: Plugin für was? In Java sieht das anders aus als in C++
Ist für C++. @ Developer92 Reguläre Ausdrücke verwende ich bisher nur zum Suchen. Mein Programm soll einfach nur den Rohtext und ggf. noch einige Zusatzdaten liefern und das Plugin soll dann selbst entscheiden, was davon verwertet wird. Bei einem älteren Projekt musste der Benutzer einmalig den Pfad zum externen Programm angeben, was unbequem ist. Ein Benutzer erwartet, das solche Erweiterungen automatisch gefunden werden. Die Idee dahinter ist auch, das man bei notwendigen Änderungen an der Ausgabe, nicht gleich das ganze Programm neu erstellen muss. Aber das scheint nicht so einfach zu sein, wie ich dachte.
|
barcc
Anmeldungsdatum: 13. Juli 2007
Beiträge: 696
Wohnort: Dortmund
|
Dakuan schrieb: … Bisher hatte ich das Problem dadurch umgangen, dass ich einfach eine Pipe zu einem externen Prozess aufgebaut hatte und die Kommunikation über stdin und stdout stattfand. …
Im Prinzip hast du bereits ein Plugin-System realisiert. Letztendlich sind Plugins nur eine Möglichkeit die Funktionalität eines Programms zu erweitern, ohne dass das Programm selbst verändert werden muss. Bei dir sind die Plugins eben ausführbare Programme. Ein paar Möglichkeiten, dein Plugin-System zu verbessern:
Alle Plugins müssen in dem Verzeichnis "~/.local/share/PROGRMMNAME/plugins/" liegen. Dann kann dein Programm das Verzeichnis durchsuchen und dem Benutzer eine Liste aller Plugins zeigen aus denen er auswählen kann. Alle Plugins haben eine Datei mit Metadaten (Pluginname, Dateiname, Plugin-Typ, Autor, Beschreibung, …) und der Dateierweiterung ".plugin" im Pluginverzeichnis. Plugins werden in eine Skriptsprache wie Python oder Lua geschrieben. Vorteil: weniger Overhead, da die Plugins im gleichen Prozess laufen. Nachteil: komplizierteres Interface
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Dakuan schrieb:
Die Idee dahinter ist auch, das man bei notwendigen Änderungen an der Ausgabe, nicht gleich das ganze Programm neu erstellen muss. Aber das scheint nicht so einfach zu sein, wie ich dachte.
Entscheidend ist, dass Du Dir über die API Gedanken machst. Die hängt natürlich davon ab, was die Plugins machen sollen. Vielleicht fallen Dir ja noch weitere Fälle ein, in denen Du Funktionalität in dieser Weise modularisiert auslagern willst.
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6345
Wohnort: Hamburg
|
@barcc Ein paar Möglichkeiten, dein Plugin-System zu verbessern:
Danke, über einige der Punkte hatte ich noch gar nicht ernsthaft nachgedacht. Bei dir sind die Plugins eben ausführbare Programme.
Was den Nachteil hat, das diese in einem eigenen Prozess laufen und somit keinen Zugriff auf meine Binärdaten hat. Die ganze Kommunikation muss über stdin/stdout laufen. @rklm Entscheidend ist, dass Du Dir über die API Gedanken machst.
Da bin ich gerade dabei. Zwischenzeitlich habe ich auch einiges zu diesem Thema gelesen. Ich komme langsam zur Erkenntnis, das ein "echtes" Plugin ein paar Nummern zu groß für mich ist. Was ich momentan brauche ist wohl eher ein "Ausgabefilter" (keine Ahnung wie das richtig heißt). Allerdings sollte das dann auch mitteilen können was es macht, damit das dem Benutzer angezeigt werden kann.
Vielleicht fallen Dir ja noch weitere Fälle ein, in denen Du Funktionalität in dieser Weise modularisiert auslagern willst.
Eigentlich nicht. Aber Du bringst mich da auf auf eine Idee. Ich könnte da etwas brauchen, was meine Rechtschreibfehler beseitigt 😉 Selber programmieren kann ich so etwas nicht.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo, Meister des Zettelkastens ☺ Vielleicht wären Signale und Slots oder der altbekannte DBus eine Möglichkeit für dich? Deine Kernanwendung hält die Daten bereit und "emittet" sie dann so, dass das jeweils lauschende Programm diese Daten bekommt und weiterverarbeitet. /edit: Link gefixt
|
Dakuan
(Themenstarter)
Anmeldungsdatum: 2. November 2004
Beiträge: 6345
Wohnort: Hamburg
|
Vielleicht wären Signale und Slots oder der altbekannte DBus eine Möglichkeit für dich?
Wohl eher (noch) nicht. Das Thema (also S&S) wurde mir zwar schon einmal in anderem Zusammenhang nahegelegt, aber ich denke das währe erst der nächste Schritt. Ich müsste dazu auch das Programmkonzept modifizieren, aber gut, das habe ich ja schon mehrfach machen müssen ... Ich brauche noch etwas Bedenkzeit. Was mich nachdenklich stimmt ist z.B. folgender Link, den ich gerade gefunden habe. Da müsste ich wohl erstmal ein Informatik Studium absolvieren.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Ja, ich studiere gern mit. Das wäre die eine Möglichkeit. Die andere wäre, nicht so perfektionistisch an die Sache ranzugehen. Hier gibt's sicher einige, die helfen würden den fertigen Code zu analysieren und ggf. zu verbessern. Ich werde es in naher Zukunft ggf. darauf ankommen lassen, ob dem so ist ☺ Allein bin ich mir schlichtweg unsicher, ob das alles so Sinn macht, was ich da tue... 😀
|