Einzelnen Beitrag anzeigen

Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Neues Projekt, wie würdet Ihr das lösen?

  Alt 14. Dez 2008, 16:28
Hallo!

Es geht um die Planung eines neuen Projektes bei dem ich mir nicht im Klaren darüber bin wie man dieses am besten anpacken sollte. Daher Interessiere ich mich sehr für eure Meinung und Erfahrungen hierzu.

Im Folgenden habe ich das Projekt kurz beschrieben und auch aufgelistet welche Gedanken ich mir dazu gemacht habe. Das Ganze ist hierdurch recht lang geworden. Wer keine Lust hat sich alles durch zu lesen, für den reicht wahrscheinlich ein Blick in „Worum geht’s“ und dann in die 3. Lösungsmöglichkeit und die Fragen die ich dazu habe.


Worum geht's – Das Projekt:

Das Projekt ist eine Art Galerie oder Bilderdatenbank. Hauptsächlich geht es darum, dass ein in einem Ordner und dessen Unterordner alle Bilder zusammensucht und zu jedem Bild alle möglichen Metadaten sammelt, speichert und verwaltet werden sollen.
Dem Ordner werden laufend neue Bilder hinzugefügt und alte Bilder gelöscht. Dies geschieht nicht unbedingt über das zu erstellende Programm selbst sondern man kann ein Bild auch einfach per Windows Explorer aus dem Ordner löschen. Das Programm muss seine Daten also permanent überprüfen und mögliche Änderungen verfolgen.

Die Informationen die über die Bilder gesammelt und aufbereitet werden, sollen dann an zwei verschiedenen Stellen genutzt werden:
  • In einem Viewer als eigenständiges Programm mit dem man durch die Bilderdatenbank surfen kann.
  • In einem Viewer der als PlugIn in ein existierendes Grafikprogramm integriert werden soll.

In einem nächsten Schritt soll das Ganze auch im Netzwerk funktionieren. Der Ordner mit den Bildern befindet sich auf einem Rechner, das Viewer-Programm auf einem anderen.


Wie würdet Ihr das machen?
Ich habe mir nun schon einige Gedanken dazu gemacht, wie man diese Anforderungen wohl am besten umsetzen kann, ich bin mir jedoch noch sehr unsicher und wüsste gerne eure Meinung dazu. Welche Lösungsstrategie würdet Ihr wählen?

Im Groben habe ich mir folgende Lösungsmöglichkeiten überlegt:

1. Getrennte Programme
Die gewünschte Funktionalität wird einfach in jedem Viewer Programm komplett umgesetzt. Wird das externe Viewer-Programm gestartet indiziert es den Ordner, lädt die schon bekannten Bildinformationen und zeigt diese an.

Natürlich müssten die Funktionen nur einmal implementiert werden, würden aber sowohl in den externen Viewer als auch in das PlugIn compiliert.

Vorteile: Recht einfach umzusetzen

Nachteile: Die gesamte Arbeit wird doppelt gemacht. Beide Viewer müssen vorhandenen Daten lesen, indizieren und aufbereiten. Sind beide Programme gleichzeitig aktiv, greifen diese gleichzeitig auf dieselben Daten zu wodurch es ggf. zu Konflikten kommen kann. Wir in einem Viewer ein Bild eingefügt/gelöscht/verändert weiß der andere Viewer noch nichts davon und muss die Änderung mal erfassen. Alles in allem sehr ineffizient. Zudem ist es möglich, dass der externe Viewer in Version 2 vorliegt und das PlugIn in Version 1. Großes Konfliktpotential.


2. Getrennte Programme mit gemeinsamen Funktionen
Arbeitet wie Lösung 1, allerdings sind die wesentlichen Funktionen hier in eine DLL ausgelagert auf die beide Viewer zugreifen.

Vorteile: Beide Viewer arbeiten immer mit den gleichen Funktionen. Das Problem, dass ein Programm in Version 1 und das andere in Version 2 vorliegt, kann damit nicht mehr auftreten.

Nachteile: Genau wie Lösung 1 bis auf den gelösten Versionskonflikt. Also kein echter Fortschritt.

Problem: Durch die Nutzung einer gemeinsamen DLL wird nur Quelltext ausgelagert, die Funktion bzw. die Logik bleibt getrennt in jedem der beiden Viewer. Das „Wissen“ über die Bilder (der Programmzustand) ist immer noch doppelt vorhanden und muss doppelt verwaltet werden.


3. Trennung von Darstellung und Funktion (Client / Server)
Das gesamte Problem wird in zwei Teile gespalten: Ein Programm das die Daten sammelt, aufbereitet und verwaltet (Bilderdatenbank) und ein Programm das die Daten darstellt (die Viewer). Das Ganze könnte als Client/Server System arbeiten. Die Datenbank ist der Server von dem die Viewer die Daten abfragt die dargestellt werden sollen.

Vorteile: Die gesamte Verwaltungsarbeit wird an zentraler Stelle ausgeführt und somit nicht mehr doppelt erledigt. Die zuvor beschriebenen Konflikte werden damit vollständig gelöst.

Nachteile: Wie kann sowas implementiert werden? Wie können die Daten zwischen Datenbank und Viewern abgefragt und ausgetauscht werden?


Die Lösung 3 erscheint mir als perfekt, ich habe allerdings leider keine Erfahrung damit wie ich diese Umsetzten könnte. Mein Problem ist, dass ich die hierfür notwendigen Techniken zwar grob kenne, tieferes Wissen oder gar Erfahrung habe ich hierzu jedoch leider nicht. Daher fehlt es mir an Ansatzpunkten mit welchen Techniken, etc. ich mich nun näher beschäftigen sollte. Daher die Frage an euch: Wie würdet Ihr das machen?

Bei der Frage wie der Galerie- und der Viewer-Prozess Daten tauschen und abfragen können ist mir spontan COM eingefallen. Da ich jedoch noch nicht wirklich mit COM gearbeitet habe fehlt mir die Erfahrung um zu entscheiden ob das wirklich das richtige wäre. Zudem weiß ich, dass .NET unter anderem als Ablösung für COM gedacht ist. Wäre es also vielleicht sinnvoller damit zu arbeiten? Dort habe ich aber genauso viel Erfahrung...

Beim Stichwort Client/Server kommt man natürlich auch schnell zu der Lösung die Daten zwischen den Programmen per TCP/UDP auszutauschen. Allerdings müsste ich dann ja quasi ein eigenes Protokoll entwickeln das definiert wie und in welcher Form genau die Daten ausgetauscht werden. Dies stellt ich mir allerdings recht kompliziert und aufwändig vor. Ich glaube nicht, dass dies der richtige Weg wäre.

Gibt es keine Möglichkeit, dass ein Programm direkt Funktionen in einem anderen Programm aufruft ohne dass dafür eigens ein eigenes Protokoll entworfen werden muss? COM, DCOM und OLE sind für mich zwar eher graue Wolken als klar durchschaute Modelle aber soweit ich die Konzepte verstanden habe geht es dabei doch darum auf Funktionen in anderen Programmen zugreifen zu können und diese zu steuern in dem hierfür eine entsprechende Schnittstelle bereit gestellt wird ohne ein eigenes Protokoll entwerfen zu müssen.

Ich habe mich ein wenig mit .NET als Lösung, genau mit der Windows Communication Foundation (WCF), beschäftigt. Soweit ich das verstanden habe geht es dabei um die Implementierung von Services. Diese arbeiten allerdings zustandslos und wären somit nicht das was ich suche (ist das richtig?).

Ein Service wäre ja grob ein Programm, dass mir die Antwort auf eine Frage liefert, also z.B. Frage: „Welche Bilder sind größer als 1 MB?“, Antwort: „Liste aller Bilder größer 1 MB“. Der Programmzustand (welche Bilder sind vorhanden, wie groß sind diese, etc.) müsst für die Beantwortung der Frage neu erstellt werden und würde nach der Beantwortung wieder vergessen. Ich suche aber nach einer Lösung, bei der ein Programm (die Galerie) die Liste der Bilder permanent breit hält (= seinen Zustand nicht vergisst) und dann auf Anfrage eine Antwort aus der vorhandenen Liste ermittelt.

Was ich also suche ist quasi folgendes:
Gibt es irgendeine Technik (.NET, COM, etc.) mit der Programm A Funktionen in Programm B aufrufen kann um Daten zwischen den Programmen auszutauschen wobei der Austausch auf eine schon vorhandene Art und Weise stattfindet und kein eigenes Protokoll entworfen werden muss?

So, das war jetzt eine lange Beschreibung meines Problems Ich hoffe ihr habt bis zum Ende durchgehalten und ich konnte verständlich beschreiben was ich suche.

Für jeden Tipp oder Hinweis wäre ich wirklich dankbar!
Herzlichen Dank!
Ares
  Mit Zitat antworten Zitat