Programm Design, Speichern von Klassen
-
Hallo,
ich bin grade dabei ein Programm zu schreiben welches aus einer Datei ausließt welche Folgen einer Serie man schon gesehen hat. Dann mit einer anderen List(eventuell übers Netzwerk) abgleicht welche Folgen verfügbar sind.
Das Problem ist ich bin überhaupt nicht zufrieden mit meiner "Serien" Klasse. Irgendwie sieht mir das alles wie ein riesiges Durcheinander aus.
Series.h:
//Stark gekürtzter Code struct Season { Season(unsigned short seasonNr) : seasonNr(seasonNr) {} const unsigned short seasonNr; std::set<unsigned short> episodes; }; class Series { friend void readInSeries(std::istream&, std::vector<Series>& ); //List Textdatei aus und ruft read(...) auf die Werte zu speichern public: //constructor, getter, etc. void addEpisode(unsigned short seasonNr, unsigned short episode); void addEpisodes(unsigned short seasonNr,const std::set<unsigned short>& episode); void addEpisodesFromFile(std::string& str); private: void read(std::vector<std::string>&); std::string name_; std::vector<Season> seasonList_; };Die "struct Season" sollte ich so ändern das die Member private sind und das man neue Folgen über Funktionen hinzufügt oder?
Wie würdet ihr das ganze "abspeichern" also die Staffeln mit den Folgen? Hier mit Vector und Set gelöst.
Wie speichert man das am besten richtig ab? Also in eine Datei.
In ein Format bringen und dann wieder einlesen?
Oder doch eher so?
http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/index.html
-
Pringles schrieb:
Die "struct Season" sollte ich so ändern das die Member private sind und das man neue Folgen über Funktionen hinzufügt oder?
Bietet sich an, ja.
Wie würdet ihr das ganze "abspeichern" also die Staffeln mit den Folgen? Hier mit Vector und Set gelöst.
Wie speichert man das am besten richtig ab? Also in eine Datei.
In ein Format bringen und dann wieder einlesen?Sehr allgemein formuliert, aber ja.
Oder doch eher so?
http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/index.htmlDas ist kein Widerspruch. Boost Serialization hilft dir bei eben dieser Aufgabe, die Daten in ein Format zu bringen und dieses zu lesen und zu schreiben.
Ich würde es aber wenigstens einmal selber machen. Dazu sind solche Übungsaufgaben schließlich da. Und vielleicht danach noch einmal mit Boost, damit man sieht, wie es damit gehen würde.
-
Pringles schrieb:
Season(unsigned short seasonNr) : seasonNr(seasonNr) {} const unsigned short seasonNr; std::set<unsigned short> episodes;Nimm int statt short. short ist nur gut in Arrays um Speicherplatz zu sparen (vector<short> z.B.). Der Speicherzugriff ist meistens langsamer als auf einen int und Speicherplatz sparen tust du bei std::set auch nicht.
Wenn du keinen guten Grund hast, was kleineres als int zu wählen, dann nimm int.
friend void readInSeries(std::istream&, std::vector<Series>& );Gefällt mir als friend. Vielleicht noch std::istream& zurückgeben wie das std::getline macht. Einfach aus Konsistenzgründen.
void addEpisode(unsigned short seasonNr, unsigned short episode); void addEpisodes(unsigned short seasonNr,const std::set<unsigned short>& episode);Gibt es einen Grund, eine spezielle Überladung mit set anzubieten? Das wäre eine reine Komfortfunktion, die würde ich im Zweifelsfall weglassen. Oder wenigstens eine allgemeinere anbieten die zwei Iteratoren entgegennimmt.
void addEpisodesFromFile(std::string& str);Ist eine Input/Output-Funktion, die gehört nicht in diese Klasse. Stell dir vor, du willst plötzlich zwei Formate unterstützen, das geht dann schon nicht mehr so schön. Mach das aus der Klasse raus.
-
/s schrieb:
Nimm int statt short. short ist nur gut in Arrays um Speicherplatz zu sparen (vector<short> z.B.). Der Speicherzugriff ist meistens langsamer als auf einen int und Speicherplatz sparen tust du bei std::set auch nicht.
Wenn du keinen guten Grund hast, was kleineres als int zu wählen, dann nimm int.
Ok.
/s schrieb:
Gibt es einen Grund, eine spezielle Überladung mit set anzubieten? Das wäre eine reine Komfortfunktion, die würde ich im Zweifelsfall weglassen. Oder wenigstens eine allgemeinere anbieten die zwei Iteratoren entgegennimmt.
Ich werde das mit den Iteratoren machen. Es hat den Grund das ich so nicht für jede Folge den vector<Season> nach seasonNr absuchen muss.
/s schrieb:
Ist eine Input/Output-Funktion, die gehört nicht in diese Klasse. Stell dir vor, du willst plötzlich zwei Formate unterstützen, das geht dann schon nicht mehr so schön. Mach das aus der Klasse raus.
Steht in eigentlichen Programm auch nicht drin

Muss wohl beim kürzen irgendwie mit rein gerutscht sein.
Lass ich es trotzdem in Series.h stehen?SeppJ schrieb:
Sehr allgemein formuliert, aber ja.
Wäre so ein Format denkbar?
[SERIE] <NAME>The Following <SEASON>1:1,2,3,4,5,6, <SEASON>2:1,2,3,4,5,6, <ADDITIONAL>blahblahtesttest <RATING>0 [/SERIE] [SERIE] <NAME>Unforgetable <SEASON>1:5,6,8, <ADDITIONAL>final <RATING>0 [/SERIE]
-
EDIT:
Pringles schrieb:
Ich werde das mit den Iteratoren machen. Es hat den Grund das ich so nicht für jede Folge den vector<Season> nach seasonNr absuchen muss.

Ich kann das nur mit Iteratoren von set machen da ich templates noch nicht hatte.
Mach ich das trotzdem oder lass ich es einfach bei den Referenz auf set.
-
Pringles schrieb:
Ich kann das nur mit Iteratoren von set machen da ich templates noch nicht hatte.
Mach ich das trotzdem oder lass ich es einfach bei den Referenz auf set.Wenn du diesen Konstruktor anbietest, dann mach es mit der set-Referenz. set-Iteratoren würden gar keinen Sinn machen. Höchstens als Übung für die Variante mit den Templates.
-
Pringles schrieb:
SeppJ schrieb:
Sehr allgemein formuliert, aber ja.
Wäre so ein Format denkbar?
[SERIE] <NAME>The Following <SEASON>1:1,2,3,4,5,6, <SEASON>2:1,2,3,4,5,6, <ADDITIONAL>blahblahtesttest <RATING>0 [/SERIE] [SERIE] <NAME>Unforgetable <SEASON>1:5,6,8, <ADDITIONAL>final <RATING>0 [/SERIE]Klar wäre das denkbar.
Aber wieso ein neues ganz Format erfinden?
Serialisierung ist ein altes Problem, und wurde bereits vielfach gelöst. Genau so gibt es bereits viele standardisierte Dateiformate die flexibel genug sind um deine Daten aufnehmen zu können.Was Dateiformate angeht würde ich dir empfehlen dir mal folgende anzugucken:
* .ini Files (ist kein "harter" Standard, aber sehr einfach)
* JSON
* XML (ist vermutlich Overkill)Wenn du dir eins ausgesucht hast, kannst du dich auf die Suche nach einer geeigneten Library machen die dieses Format lesen & schreiben kann.
Ansonsten bietet sich bei deinen Daten natürlich auch an alles in einer Datenbank zu speichern, beispielsweise mit SQLite. Wobei so Datenbank Files natürlich nicht so angenehm anzugucken bzw. mit Hand zu ändern sind -- du brauchst dazu dann immer gleich nen spezielles Programm (SQLite Database Browser etc.).
-
Pringles schrieb:
SeppJ schrieb:
Sehr allgemein formuliert, aber ja.
Wäre so ein Format denkbar?
[SERIE] <NAME>The Following <SEASON>1:1,2,3,4,5,6, <SEASON>2:1,2,3,4,5,6, <ADDITIONAL>blahblahtesttest <RATING>0 [/SERIE] [SERIE] <NAME>Unforgetable <SEASON>1:5,6,8, <ADDITIONAL>final <RATING>0 [/SERIE]Klar. Du kannst dir ausdenken, was du möchtest. Man kann es natürlich günstiger oder ungünstiger machen. Oder sich an bekannte Vorgaben halten, dann kann man gleich fertige Bibliotheken für diese benutzen (würde ich für diese Übung aber nicht machen). Das hier gezeigte Format sieht durchaus nutzbar aus. Was mir nicht gefällt ist die Mischung aus Formatierungstags und Whitespace (hier: Zeilenumbruch) zur Formatierung; sowie die Mischung von verschiedenen Formaten für die Tags. Vorschlag:
[SERIE] [NAME]The Following[/NAME] ... [/SERIE]Aber dann kannst du auch gleich XML nehmen, womit wir zurück bei den bekannten Vorgaben wären

Das heißt nicht, dass das von dir vorgeschlagene Format nicht nutzbar wäre. Man muss halt mal den einen oder anderen Parser in C++ geschrieben haben (und hinterher von Werner Salomon kritisieren lassen), damit man sieht, was leicht geht und was nicht.
-
Ok.
Ich hatte auch erst an ini. gedacht aber wollte mir jetzt nicht extra ne neue Library antun.
Ich lese jetzt erst mal mein Buch zu ende damit ich templates lerne und dann schau ich mir das mit Datenbanken an.
-
Pringles schrieb:
Ok.
Ich hatte auch erst an ini. gedacht aber wollte mir jetzt nicht extra ne neue Library antun.Würde ich auch nicht. Es ist einfach eine bewährtes und sehr einfaches Format. Angucken, Ideen verstehen, selber umsetzen.
Ich lese jetzt erst mal mein Buch zu ende damit ich templates lerne
Gut! Keine Angst vor Templates!
und dann schau ich mir das mit Datenbanken an.
Würde ich nicht tun. Ist totaler Overkill. Für einfache Sachen brauchst du das nicht. Für komplexe Sachen, wo es wirklich Sinn macht, ist das wie eine neue Sprache (Wortwörtlich!). Datenbankspezialist ist ein eigener Beruf.