P
Original erstellt von RHBaum:
Also ich hab mit dem kompletten Design so ... gewisse Anlaufschwierigkeiten ... zumindest finde ich es etwas ungewoehnlich !
Ja, ungewöhnlich finde ich es auch! Aber der Increment-Operator verwendet doch auch einen nicht ausgewerteten int-Parameter zur Pre- und Post-Inkrement unterscheidung! Ich finde das ist vergleichbar.
Also zum prinzipiellen Problem .... du willst die Daten aus einer ini-Datei,aus /etc/myconfig auslesen, und bestimmte Eintraege (DB,host,uid,pass)
haben. Und fuer dein Programm kommt nu noch ne weitere Datei hinzu, wo du auch paaar bestimmte EIntraege(head,body_head ...) draus brauchst.
Meine erste Frage, warum die statischen komponenten ? hat das nen besonderen Hintergrund ?
Soooo "bestimmt" sind die Einträge nicht! Jede Klasse die was an Einstellungen braucht bekommt im INI-File ihre Section und der entsprechende Entwickler kann da an Infos ablegen was er will. Keiner muss sich über die Eindeutigkeit seines Parameternamens Gedanken machen weil der Parameter in SEINER Section steht. In der Klasse holt man sich einfach via
Config mysettings("mysectionname");
seinen Teil der Konfiguration und hat Zugriff auf seine Einstellungen.
I/O-Operationen sind EXTREM teuer! Das ganze INI-File wird einmal via mmap geholt, verarbeitet und steht dann in jeder Instanz zur verfühgung! Evtl. kann man den Instanzen Zeiger auf die Daten verpassen und je nach Bedarf auf unterschiedliche Daten verweisen. Der Parser könnte die Map erzeugen und einhängen, man bräuchte eine weitere Map für den Use-Counter und der Destruktor kann die Daten bei use-count==0 löschen, ähhh ne es kann ja sein das die Daten später nochmal gebraucht werden... ich kann die Daten-Map nieeee löschen
2. Frage ... die Ini Dateien haben den selben aufbau ? Ich denk mal ja ....
Sonst währe es alles Quark, nee?
Strukturell wuerd ich so vorgehen!
1. eine klasse, das Zeielnweisse aus dateien lesen kann (dein Ini-file ist ne Zeilen-orientierte Text-Datei). Heisser Kanditat: ifstream
Realisiert mit mmap. Da Konstrukte der Form
a=aaaaaaa\<Zeilenumbruch>
auchNochAaaaaaaaaaa\<Zeilenumbruch>
aaaaaaaa
möglich sein sollen (a<<EOF kommt auch noch ;)) ist die Datei zwar Zeilen-orientiert aber die Daten nicht!
2. ne Klasse, die die Infos in strukturierter Form aus folgen von Zeilen interpretieren kann ... mit 1. als membervariable oder 1. als Basisklasse
3. ne klasse, die Infos in der gewuenschten Form im Speicher halten kann, in deinem Fall ne Art Dictionary in der Form Key:Value (beides strings, oder du arbeitest mit internen IDs fuer deine Special-Strings(uid,host,pass)). Hier kann man ganz gut Maps zu verwenden .... Vielleicht noch ne Unterteilung in die einzelnen sections .... als Submaps realisiert ...
map<string, map<string, string>
4. ne Klasse, die die Faehigkeiten aller deiner vorherigen klassen kombiniert und fast das tut was du willst ... mit 2. und 3. als member ... mit ner parse( const char * astr_filename) Funktion, die DIr alle erkannten EIntraege aus der ini Datei rausliest und in den Container schreibt .... und mit ner get_property(const char * astr_key, const char * astr_section) Funktion, die nach gewuenschten einstellungen in dem Container suchen kann ....
DIe Parse Funktion vielleicht so ausgelegt, das man sie mehrmals aufrufen kann, und das sie die gefunden eintraege dem Container einfach hinzufuegt ....
Ne entsprechende Behandlungsroutine natuerlich, falls eintraege doppelt vorkommen ....
Ja, und die Klasse nenne ich dann Config... so habe ich es ja...
5. die Spezialklasse, als Ableitung von 4. die dann genau deine Speziellen Wuensche parametriesiert enthaelt .... also ini datei 1 und ini datei 2 fest verdrahtet, die das Parsen auf den Dateien schon beim konstruieren vornimmt ... und Memberfunktionen hat, die nach festverdrahteten Strings in den Property container suchen ... ala int get_uid(char ** ap_Value) ... oder so ....
Nachtigall ich hoehr dir trappsen... Habe bisher eher C Programmiert und mir fehlt die Objekt denke ein wenig.
Als ich geschrieben habe (erstes Posting 2.) Vererbung drückt ein "ist ein"-Verhältniss aus, Bjarne sagt bescheiss nie deinen Compiler und die beiden Klassen haben nichts miteinander zu tun hätte ja mal einer sagen können "Ja, aber wenn sie beide die gleiche Funktion erfüllen, habe sie w*****einlich die gleiche Basisklasse!". Also Basisklasse IniFile, Subklasse
Config:public IniFile
, weil die Konfiguration "ist ein" IniFile, und Subklasse
Snippets:public IniFile
, weil die Snippets auch ein IniFile sind. Ja das passt... schön!
So wuerde ich zumindest vorgehen ....
Ja, ich glaube ich jetzt auch
P.S. mer die /etc/myconfig parsen will, will meist auch etwas mit mysql anfangen ....
Ja neee, der Name ist nur spontan gewählt für "meine Konfiguration" halt. Mysql benutzen wir zwar auch, hat aber nichts mit dem Konfigfile zu tun...
Ciao ...
Yepp, und danke nochmal für den Schupps, den Rempler, das Tracktor-Pushing in die richtige Richtung. Manchmal braucht man halt so einen Wink mit dem Zaunpfahl, Dachpfetten, ...