Techniken für objektorientierte oder modulare Datei- und Daten-I / O?

8

Es sieht so aus, als ob ich jedes Mal, wenn ich Code schreibe, der mit Fetch-, Push-, Lese- oder Schreiboperationen arbeitet, ad hoc, hässlich und völlig unbrauchbar außerhalb des Kontextes dieser exakten Anwendung ist. Schlimmer noch, es fühlt sich an, als müsste ich das Rad jedes Mal, wenn ich diese Dinge entwerfe, neu erfinden. Es scheint mir, dass die Art der E / A-Operationen sehr linear ist und nicht gut für modulare oder objektorientierte Muster geeignet ist.

Ich hoffe wirklich, dass jemand mir sagen kann, dass ich hier falsch liege. Gibt es Techniken / Muster für objektorientierte oder modulare Datei- und Daten-I / O? Gibt es eine Konvention, der ich folgen kann, um einige Code-Wiederverwendbarkeit hinzuzufügen? Ich weiß, dass verschiedene Tools existieren, um das Lesen einzelner Dateien zu erleichtern, wie XML-Parser und dergleichen, aber ich bin in Bezug auf die größeren Designs, die diese Werkzeuge verwenden.

Das Problem ist nicht auf eine einzige Sprache beschränkt; Ich traf die gleiche Wand in Java, C, Matlab, Python und anderen.

Ein Unterthema wird in dieser Frage zu welchem ​​Objekt sollte das Speichern aufgerufen . Diese Frage scheint sich auf ein Factory-Muster zu beziehen, in dem der Inhalt einer Datei aufgebaut und schließlich auf die Festplatte geschrieben wird. Meine Frage bezieht sich auf die gesamte Architektur, einschließlich Factories für Schreiboperationen, aber auch (Insert Pattern Here) zum Lesen / Holen von Operationen.

Das Beste, was ich mir vorstellen konnte, ist ein Fassadenmuster ... aber heilig raucht ist der Code in diesen Fassaden hässlich.

Jemand bitte sagen Sie mir, dass ein Muster existiert, in dem ich entweder etwas von meinem Code wiederverwenden könnte, oder zumindest einer Vorlage für zukünftige Lese-Schreibvorgänge folgen könnte.

Jemand hat nach Modular Design hier gefragt, aber die Antworten sind spezifisch für das Problem dieses Fragestellers und nicht ganz nützlich .

Beispiel

Dies ist nur ein Beispiel und basiert auf einem Projekt, das ich letztes Jahr gemacht habe. Fühlen Sie sich frei, ein anderes Beispiel zu geben.

Unser Programm ist eine Physik-Sandbox. Wir wollen XML-Daten laden, die physikalische Attribute von Objekten in dieser Sandbox beschreiben. Wir müssen auch .3DS-Dateien laden, die 3D-Rendering-Informationen enthalten. Schließlich müssen wir eine SQL-Datenbank abfragen, um herauszufinden, wer welche Objekte besitzt.

Wir müssen auch 3D-Modellformate unterstützen können, wenn sie herauskommen. Wir wissen nicht, wie diese Dateien aussehen werden, aber wir wollen das Code-Framework im Voraus einrichten. Sobald wir das neue Datenschema erhalten haben, kann die Laderoutine schnell implementiert werden.

Daten aus allen drei Quellen würden verwendet, um Instanzen von Objekten in unserer Software zu erstellen.

Später müssen physikalische Informationen wie Position und Geschwindigkeit in einer Datenbank gespeichert und benutzerdefinierte Texturinformationen in lokalen Dateien gespeichert werden. Wir wissen nicht, welche Art von Datei die Textur sein wird, also wollen wir nur die Code-Struktur auslegen, damit wir den Speichercode später einfügen können.

Ohne irgendeine Art von Entwurfsmuster führt selbst eine kleine Anzahl von Objekten schnell zu einem eng gekoppelten Netzwerk.

Eine Fassade kann die Objekte / Daten von den entsprechenden Dateien entkoppeln, aber nur das Problem innerhalb der Eingangs- und Ausgangsfassaden wird zentralisiert, was sich in Eile in ein alptraumhaftes Chaos verwandeln kann. Außerdem sind die Objekte / Daten jetzt eng mit der Fassade verbunden, so dass keine Modularität wirklich erreicht wird.

Bearbeitet vor 3 Wochen ...

Zuvor hatte ich eine Menge Pseudo-Code für das Problem bereitgestellt, mit dem ich konfrontiert war, als ich diese Frage zum ersten Mal stellte, aber ich habe entschieden, dass es meine Hauptfrage verschleierte. Es genügt zu sagen: Ich musste ungefähr 2000 Zeilen wirklich wonky Code für diese bestimmte Reihe von Leseoperationen verwenden, es machte bemerkenswert wenig in Bezug auf die Verarbeitung und Organisation, und ich werde nie wieder in der Lage sein, irgendetwas davon in einem anderen Projekt zu verwenden .

Ich möchte in Zukunft vermeiden, solchen Code zu schreiben.

    
drmuelr 05.06.2016, 19:30
quelle

3 Antworten

2

Es kann Besonderheiten Ihres Problems oder Ihrer Frage geben, auf die diese Lösung nicht vollständig eingeht, aber ich möchte den Ansatz teilen, den ich zur Vereinheitlichung von I / O-Operationen verfolgt habe. Ich habe das schon früher in ein paar verschiedenen Hochsprachen benutzt. Diese Strategie skaliert am besten, wenn sie in Verbindung mit der Serialisierung verwendet wird.

Es scheint, dass die zwei grundlegenden I / O-Operationen Save / Put und Load / Get sind. Hier ist die abstrakteste universelle Schnittstelle, die das darstellt:

%Vor%

Diese Strategie ist ausreichend für alle Arten von E / A-Operationen, bei denen die Ressourcen-ID (eine Datenbank-UUID / GUID / Zeichenfolge, ein Dateipfad, eine Web-URL usw.) bekannt ist.

Die einfachsten Implementierungen variieren je nach Sprache und Framework, aber ich finde, dass die universell anwendbaren Implementierungen auf Standardformularen zur Serialisierung basieren, nämlich binär, XML und JSON. Bei der Verwendung proprietärer Objekte verwende ich am häufigsten ein XmlFileRepository, das mein einfaches Datenobjekt in / aus Xml übersetzt und den ausgewählten Dateipfad speichert / lädt.

Außerdem ist es, wenn es in Verbindung mit dem Abstrakt-Fabrik-Muster verwendet wird, ziemlich trivial, verschiedene Datenformat-Eingaben und -Ausgaben für sogar einen einzigen Objekttyp zu verwenden. Beispielcode:

%Vor%     
Silas Reinagel 30.06.2016, 02:39
quelle
2

Holub verwendet ein Builder-Muster zum Exportieren von Daten aus Objekten (Rendering) und etwas, das er ein Inverse-Builder-Muster für die Initialisierung nannte.

>

Diese Exporter / Importer-Objekte, wie er sie nennt, sind Teil des Domänenmodellmodells selbst. Auf diese Weise sollte ein Modell persistent sein und sich selbst mit verschiedenen Datenquellen erstellen.

Ссылка

Ссылка

    
Weltschmerz 30.06.2016 01:58
quelle
0

Vorlagenmuster

Erstellen Sie hier im Template-Muster eine abstrakte Klasse, die sich auf I / O-Operationen bezieht, die abstrakte Methoden und wenige andere Methoden enthalten, wenn eine Wiederverwendbarkeit besteht. Und alles externe System wie Datenbank, Text ... kann diese abstrakte Klasse erweitern und den spezifischen Job tun.

    
Sudhish K 04.07.2016 22:53
quelle

Tags und Links