Eigene Klassen oder Switchcase?
-
Hallo zusammen,
ich schreibe grade an einem Programm, darin habe ich eine Menge Bücher, die Bücher haben Texte, welche aus Absätzen bestehen.
Jetzt stellt sich mir die Frage, wie gehe ich damit um, wenn Absätze vorgelesen werden:
a) für jeden Einzelfall eine eigene Datei
lese_absatz1.cpp : class Lesung : public Absatz {Leins(); void lesenAktion(){...};}
lese_absatz2.cpp : class Lesung : public Absatz {Lzwei(); void lesenAktion(){...};}
lese_absatz3.cpp : class Lesung : public Absatz {Ldrei(); void lesenAktion(){...};}b) alles im einem umfangereichen switch-case
switch(LeseAbsatzNr) {case 1: ...; break; case 2: .... ;break; case 3: ....; }Die Vor- und Nachteile die ich dabei befüchte: das switchcase wird sehr lang, also bald unübersichtlich. Die Dateien werden sehr viele Einzeldateien, das wird sich langfristig daher vermutlich stark auf die Compilezeit auswirken, nehme ich an.
Gibt es dazu "best-practice" Ratschläge? Wie machen das andere in der Praxis? Welche Auswirkungen übersehe ich? Vermutlich gibt es Auswirkungen, wie im Bereich Speicherbedarf wegen der object header, oder bei der Performance. Haben ihr Hinweise auf Literatur, Vorträge, Codebeispiele oder eine Meinung dazu?
Danke im Voraus
-
Bücher... als Klassen in einem Programm?
Beschreib vielleicht mal was dein Programm machen soll. Weil so ohne weiteren Kontet, hört sich das erstmal nach dem falschen Ansatz an.
Bücher sind ja nichts "aktives", das sind bloss daten. Und Daten speichert man normalerweise entweder in Datenfiles (gibt verschiedenste Format), Datenbanken, oder, wenn es Sinn macht, in Datenstrukturen im Programm.
Aber man macht nicht eine Klasse pro Buch. Ich wüsste nicht was da der Sinn sein sollte.
-
Es ist hier gar nicht so wichtig, dass es um Bücher geht, es war nur ein Beispiel. Du könntest auch sagen Monster in einem Spiel. Oder Datensätze, deren Daten eigene Funktionen mitbringen. Mir geht es viel mehr um die Theorie dahinter. Hier im konkreten Fall, mit etwa 200 cases, ist es vermutlich egal und ich könnte es im Problemfall auch leicht umschreiben, um zu testen, ob der andere Ansatz besser ist. Ich frage mich, wie es "richtig" gemacht wird, wenn es 2.000, 20.000 oder 2.000.000 Bücher/Monster/Daten werden. Wofür entscheidet man sich dann? Welche Fragen muss man sich stellen?
-
Hallo @Sharky ,
wie würdest Du die Frage "Eigenes Auto oder nächste Kreuzung abbiegen?" beantworten? Da muss schon etwas mehr kommen.
-
Weder noch, weil beides bei dir, wie du schon selbst erkannt hast, zu umfangreichen (unübersichtlichen) Code führt.
Packe einfach die unterschiedlichen Funktionen in ein Array (wenn die Indizes, wie bei dirLeseAbsatzNr
, fortlaufend sind) oder aber in einestd::map<>
, z.B.const std::function<void ()> functions[] = { Leins, Lzwei, Ldrei, // ... mit besseren Namen! };
und rufe sie dann mit einer Anweisung auf:
functions[LeseAbsatzNr]();
(evtl. vorher noch den Range überprüfen, bzw. bei
std::map<>
mit find).
-
Falls das den unbedarften Lesern nicht sofort auffällt: Hier schwingen Cyborg-Beta-Gefühle im Thread.
-
@Sharky sagte in Eigene Klassen oder Switchcase?:
Es ist hier gar nicht so wichtig, dass es um Bücher geht, es war nur ein Beispiel. Du könntest auch sagen Monster in einem Spiel. Oder Datensätze, deren Daten eigene Funktionen mitbringen. Mir geht es viel mehr um die Theorie dahinter.
Was du machen willst ist schon wichtig dafür wie eine gute Lösung aussieht.
Hier im konkreten Fall, mit etwa 200 cases, ist es vermutlich egal und ich könnte es im Problemfall auch leicht umschreiben, um zu testen, ob der andere Ansatz besser ist. Ich frage mich, wie es "richtig" gemacht wird, wenn es 2.000, 20.000 oder 2.000.000 Bücher/Monster/Daten werden. Wofür entscheidet man sich dann? Welche Fragen muss man sich stellen?
Wenn du 20.000 verschiedene Verhaltensweisen in deinem Programm hast, dann hast du vermutlich ein Problem.
Aber um deine Frage zu beantworten: es kommt drauf an.switch-case
kann vollkommen OK sein.
Polymorphie kann OK sein.
Ein Array mit Funktionszeigern kann OK sein.
Ein Verzeichnis voll mit Lua Skripten kann OK sein.
usw.p.S.: wenn es um "Monster" geht, kann man vermutlich das meiste mit nur einem Algorithmus erschalgen, der halt parametrisiert wird.