2008-08-14 15 views
6

Empfiehlt jemand ein Entwurfsmuster zum Entnehmen einer binären Datendatei, zum Parsen von Teilen davon in Objekte und zum Speichern der resultierenden Daten in einer Datenbank?Entwurfsmuster zum Analysieren von binären Dateidaten und Speichern in einer Datenbank

Ich denke, ein ähnliches Muster könnte verwendet werden, um eine XML-oder Tabulator-getrennte Datei zu nehmen und es in ihre repräsentativen Objekte zu analysieren.

Eine gemeinsame würde Datenstruktur umfassen:

(Header) (DataElement1) (DataElement1SubData1) (DataElement1SubData2) (DataElement2) (DataElement2SubData1) (DataElement2SubData2) (EOF)

denke ich gutes Design würde eine Möglichkeit bieten, die Analysedefinition basierend auf dem Dateityp oder einigen definierten Metadaten, die in der Kopfzeile enthalten sind, zu ändern. So wäre ein Factory Pattern Teil des Gesamtentwurfs für den Parser-Teil.

Antwort

21
  1. Sie Ihre Datei-Parser schreiben, mit was auch immer Techniken kommen
  2. schreiben viele Unit-Tests in den Sinn dafür sicher sind
bedeckt alle Fälle Ihre Kante machen Sobald Sie dies getan haben, Sie werden tatsächlich eine vernünftige Vorstellung von dem Problem/der Lösung haben.

Im Moment haben Sie nur Theorien im Kopf, von denen die meisten sich als falsch erweisen.

Schritt 3: Refactor gnadenlos. Ihr Ziel sollte sein, etwa die Hälfte Ihres Codes zu löschen.

Sie werden feststellen, dass Ihr Code am Ende entweder einem vorhandenen Designmuster ähnelt oder Sie ein neues erstellt haben. Sie werden dann qualifiziert sein, diese Frage zu beantworten :-)

1

Das Strategie-Muster ist vielleicht eines, das Sie betrachten möchten. Die Strategie ist der Dateianalysealgorithmus.

Dann möchten Sie eine separate Strategie für die Datenbankeinfügung.

4

Ich stimme voll und ganz mit Orion Edwards, und es ist normalerweise die Art, wie ich das Problem angehen; aber in letzter Zeit habe ich angefangen, ein paar Muster (!) zu sehen.

Für komplexere Aufgaben, die ich in der Regel so etwas wie ein interpreter (oder einem strategy), die einige builder (oder factory) nutzt jeden Teil der Daten zu erstellen.

Für das Streaming von Daten würde der gesamte Parser etwa wie ein adapter aussehen und sich von einem Stream-Objekt an einen Objektstrom (der normalerweise nur eine Warteschlange ist) anpassen.

Für Ihr Beispiel würde es wahrscheinlich einen Builder für die komplette Datenstruktur (von Kopf bis EOF) geben, der intern Builder für die internen Datenelemente verwendet (gespeist vom Interpreter). Sobald der EOF auftritt, wird ein Objekt ausgegeben.

Objekte, die in einer switch-Anweisung in einer Factory-Funktion erstellt werden, sind jedoch wahrscheinlich der einfachste Weg für viele weniger wichtige Aufgaben.Außerdem mag ich es, meine Datenobjekte unveränderlich zu halten, da man nie weiß, wenn jemand Gleichzeitigkeit in den Hals schiebt :)

1

Verwenden Sie Lex und YACC. Wenn Sie die nächsten zehn Jahre nicht ausschließlich diesem Thema widmen, werden sie jedes Mal einen besseren und schnelleren Code produzieren.