Serialisierung - bessere Methode als toString()?
-
Hallo,
ich hoffe der Titel ist halbwegs aussagekräftig. Also ich erkläre erstmal mein Problem und stelle dann ganz unten die Frage. Ich habe eine kleine Bibliothek zum Erstellen von PDF-Dokumenten geschrieben. Man benutzt sie in etwa so (Pseudocode):
var page = new Page(); var text = new Text('hallo Welt'); page->add(text); var line = new Line(); page->add(line) page->toString();
In dem obigen Beispiel erstelle ich ein PDF mit einem Text und einer Linie. Der Aufruf von "page->toString()" würde den Inhalt eines PDFs als String liefern und dabei "page" und alle hinzugefügten Elemente "serialisieren". Das Ganze läuft nach dem Prinzip ab:
- jede Klasse (page, line, text usw...) enthält eine toString() Methode
- toString() erzeugt quasi den Text, der in einem PDF-File dazu führt, dass ein Text oder eine Linie angezeigt wird
- page->toString() ruft wiederum alle "toString()"-Methoden der hinzugefügten Elemente (also Line und Text) aufMeine Frage:
Gibt es eigentlich eine andere (elegantere?) Möglichkeit solche verschachtelten Objekte (welche ja im Grunde ein Dokument darstellen) in einen String umzuwandeln? Ich habe schon überlegt, ob ich sogenannte "Writer"-Klassen nutzen könnte. Also so etwas hier
var pdfWriter = new PdfWriter(page); pdfWriter->toString(); // erzeugt PDF var htmlWriter = new HtmlWriter(page); htmlWriter->toString(); // erzeugt HTML mit der gleichen Dokumentstruktur
Aber ich wüsste nicht wie man das realisieren könnte. Diese "Writer"-Klassen müssten ja direkt auf die interne Struktur von "page" zu greifen, damit die einzelnen Elemente (Text oder auch Linie) verarbeitet werden können. Die Klassen Text und Line verwalten intern auch einige Styles (z.B. Schriftart oder Größe) Das wiederspricht ja auch dem Prizip der Kapselung. Ich möchte die Klassen (Line, Text usw...) auch möglichst allgemein halten so dass ich sie jederzeit ändern kann.
-
hmm... Scheinbar kennt keiner von euch irgend ein anderes passendes Pattern oder so?
-
x++ schrieb:
hmm... Scheinbar kennt keiner von euch irgend ein anderes passendes Pattern oder so?
Oder du bist viel zu ungeduldig. Nach 4 Stunden schon anfangen zu meckern?
Abgesehen davon ist deine Fragestellung sehr allgemein formuliert. Da gibt es keine einfache Antwort darauf. Wie man sowas am besten umsetzt, darüber gibt es ganze Abhandlungen und Bücher. Kauf dir ein Buch zu Design Patterns.
Grüssli
-
Ja, irgend was mit Visitor ...
-
Für welche Programmiersprache suchst Du denn eine Lösung?
-
Entschuldigt meine ungeduld. Hab gedacht es gibt ein paar andere Varianten mit denen man das Problem etwas eleganter lösen kann. Werde mir das Visitor Pattern nochmal genauer anschauen. Vielleicht bekomme ich ja noch eine gute Idee. Aber diese "toString" Variante ist halt nicht soo flexibel.
Werner_logoff schrieb:
Für welche Programmiersprache suchst Du denn eine Lösung?
Ich entwickel die API in PERL.