klassenstruktur gesucht

Status
Nicht offen für weitere Antworten.

diggaa1984

Top Contributor
hiho,

also ich haben nen DatenController, welcher alleinig die Daten beinhaltet (ne ArrayList<xy>) .. sämtliche Manipulationen der Daten laufen über diesen Controller und werden bei Gültigkeit weitergeleitet an die Datenstruktur.

So, nun besteht ja nich selten der Bedarf das ganze zu speichern. Könnte ich ja problemlos in den Controller mit reinschreiben, aber um den nicht unnötig aufzublähen wollte ich das Speichern auslagern, aber dann habe ich das Problem das ich diese Klasse spezifisch auf die Datenstruktur anpassen müsste (Klasse xy), damit die Speicherklasse mit den Daten arbeiten kann. Aber das hätte ja 0 Wiederverwendungswert und da könnte ich es auch gleich in den Datencontroller schreiben.

Als Beispiel sei mal der Export in einer XML-datei genannt. Wenn ich mir nen Adapter schreibe der wirklich nur auf Klasse XY ausgelegt ist, kann ich das doch gleich in den Controller schreiben.

Universell auslagern wäre ja nur möglich, wenn ich bytes[] schreibe oder? weil dann is das Speichern unabhängig von dem was als byte-array reinkommt. Aber sobald ich dann zB xml schreiben möchte kann ich ja keine byte[] mehr schieben, da gibts doch bestimmt methoden zum schreiben von elementen und deren inhalten, da komm ich ja mit bytes nicht weit.


oder gibts da generell andere mechanismen die man nutzen sollte? Serialisierung kommt gar nicht erst in Frage

also ziel wäre es ... das Speichern in eine extra Klasse auszulagern, und je nachdem wie der Nutzer das gern speichern möchte (Filtervorgabe im JfileChooser), würde ich die entsprechende Methode aufrufen wollen und die Daten angeben die gespeichert werden sollen.

ich vermute ich komme nicht um eine spezifische Implementierung für meine Datenstruktur herum, später muss ich auch noch einen Graphen speichern, aber da hat der Nutzer keine Wahl, der wird mit selben Dateinamen und spezieller endung angelegt, da wäre etwas spezifisches nicht schlimm.
 
wie willst du denn eine universelle Speichermethode schreiben, die alles von selbst kann?

Du schreibst dir halt für jeden von unterstützten dateityp einen adapter, der dir deine Daten in das spezielle format exportiert. Wenn der Benutzer per FileChooser eine xml datei auswählt, rufst du halt deinen XMLAdapter auf. Wenn er eine txt datei auswählt rufst den TextAdapter auf. Natürlich musst du das alles speziell ausimplementieren.
 
mir fiel noch ein eventuell ne klasse zu baun, die alles in bytes[] bekommt und das dann jeweils in das format umwandelt das zum speichern benötigt wird (strings oder weiss der geier was) .. da müsste ja einigermaßen funktionieren oder?

und dann kann ich da reinschieben was ich möchte und der baut mir dann alles entsprechend so, dass er es mittels der java-klassen in eine datei schreiben kann !? 😀
 
H,

also ich würde mir ein Interface anlegen, das eine Methode a la:
Code:
public void save(XY xy)

hat und dieses Interface je nach Zielformat implementieren. Sprich, eine Implementierung, die das ganze nach XML rausschreibt, eine für bytes, eine für eine Datenbank und so weiter undso fort. Dann kannst du das immer flexibel erweitern und hast es schön weggekapselt.

Nur so eine Idee.

Grüße,
Andreas
 
ja richtig, versuch nur grad was zu basteln was eben datentypunabhängig wäre 😀 ... aber sonst ist mit dem interface klar, würde ich auch so machen wenns kein andern weg gibt
 
Du könntest natürlich per Reflection beliebige Strukturen analysieren und irgendwie unter Verwendung der toString-Methoden in irgendeinem Format ausgeben - aber das wäre eigentlich auch nur eine eigene Form von Serialisierung.

Für das XML-Format gibt es mitXStream eine generische XML-Serialisierung.
 
Hi,

das klingt nicht wirklich gut, Murray, denn dann würde die Geschäftslogik der Anwendung davon abhängen, dass die Datenobjekte eine vernünftige toString()-Methode haben. Und man sollte niemals seine Geschäftslogik von dieser Methode abhängig machen. Die Gefahr, dass dann etwas schiefgeht, ist einfach zu groß.

Grüße,
Andreas
 
Einen Tod muss man sterben - wenn es einen allgemeinen Mechanismus zum Ausschreiben und Einlesen von Datenstrukturen geben soll, der von den konkreten Strukturen aber nichts wissen darf, dann geht das nur, wenn die Datentypen bestimmte "Verträge" einhalten.
 
hm so auf den ersten blick sah XStream auch nicht danach aus was am ende herauskommen soll 😀

muss mir wenn ich mehr zeit hab nochma gedanken machen, und xml-libs wühlen.
das format wollt ich auf jeden Fallen mit reinnehmen
 
Was willst Du genau erreichen? Sollen beliebige Datenstrukturen in verschiedene Formate (z.B. XML) gespeichert und wieder eingelesen werden können? Für mich sieht das so aus, als wolltest Du etwas zuviel an Abstraktion und Wiederverwendbarkeit.
 
diggaa, dir wird nichts anderes übrig bleiben als pro Objekt Entscheidungen zu treffen. Kein Algorithmus wird entscheiden können ob bei einem Objekt X Member y nun gespeichert werden soll oder nicht. Die Entscheidung bleibt immer am Programmierer hängen, denn diese basiert auf Informationen die das Programm nicht hat. (Selbst mit der Java eigenen Serialisierung stößt man schnell an Grenzen und muss auch dieser beibringen gewisse Member anderst zu behandeln als andere.)

Die einzige Möglichkeit die man hat ist die eigentlichen Datenspeicherungsprozesse auszulagern, die Definition was wie gespeichert werden soll wird immer am Programmierer hängen bleiben.


Wenn man Datenspeicherung kapseln will, so würde ich persönlich immer zum DAO Pattern greifen:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
Aber auch dort bleibt es dem Programmierer überlassen zu definieren was nun wie gespeichert werden soll.
 
ja na was ich speichern will muss ich selber festlegen sicherlich, mir gehts um das auslagern, aber da will ich nun nicht unbedingt was basteln, was wirklich nur auf das aktuelle programm und dessen datenstrukturen geeicht ist.

wie gesagt ich muss mal selbst noch ein wenig rumprobieren, aber momentan is zeit wieder mangelware ;/

sowas wie: MyXMLWriter.write(this); wobei this nun mal die klasse sei mit datenstrukturen oder eine der datenklassen selbst .. kanns nicht werden und solls auch gar nich ^^
 
Es ging nicht nur darum was gespeichert werden soll, sondern auch wie.

Woher soll z.B. irgendein Programm wissen, dass Bei Klasse Person Member Haustier gespeichert werden soll, Bei der Klasse Haustier Member Besitzer aber nicht. Das ist auch eine Entscheidung "wie" nun die Klasse Haustier gespeichert werden soll und man muss entweder in den Klassen selbst definieren wie diese zu speichern sind, oder Teile der ausgelagerten Datenspeicherungsstruktur auf die spezifischen Datenstrukturen anzupassen.

Ansonsten wie gesagt, Link DAO ist immer recht fein, um Datenspeicherungsverfahren (z.B. Datenbankanfragen, XML Generierung, etc) auszulagern und redundanten Code zu vermeiden. Sowie hat man dort auch die Möglichkeit mehrere Verfahren parallel zu implementieren, was deinem Vorhaben oben entsprechen würde. (Der Benutzer kann wählen)
 
du könntest die member mit annotations versehen und dann per reflection entscheiden, ob die membervariable mit rausgespeichert werden soll oder nicht. Dann steckt die Logik WAS gespeichert wird in den Datenhaltungsobjekten selbst drin. ich finde die Lösung aber eher eklig 🙂
 
na nu driftet mal nich so ab 😀 ... reflection wird hier nich reinspielen ^^

ich entzieh mich mal der diskussion bis ich zeit dafür habe mir mehr gedanken zu machen

danke dennoch für die hinweise, bissel was konnt ich ja mitnehmen
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben