Globale Optionen ohne globale Variablen
-
Hi,
der Titel beschreibt es ja schon ganz gut. Ich will in meinem Programm globale Einstellungen haben, auf die jede Funktion (von wo auch immer) zugreifen kann, ohne dass ich jedesmal einen Pointer auf ein Optionsobjekt mitgeben muss.
Wie geht das am elegantesten?
Dazu gesellt sich eine weitere Frage, falls es möglich ist, eine Art globale Einstellungsklasse zu definieren: Wie ziehe ich so ein Optionsklasse auf?
Ich stelle es mir ziemlich chaotisch vor, wenn ich z.B. 20 private Optionsmember habe, für die ich dann vielleicht auch noch jeweils 20 Set- und Get-Routinen brauche.Oder kann man eine einzige Set-Routine definieren, die sinngemäß folgendes macht (Pseudocode):
Config.SetOption(Optionenname, Optionenwert)?(Mich würde generell interessieren, wie man eine "Setze Variable X auf Y"-Routine macht, da der Variablenname doch kein String ist, den ich da einfach so übergeben kann)
Ich würde mich freuen, wenn mir das jemand etwas näher erklären könnte, da ich bisher fast nur prozedurale Programmierung kenne und mit Objekten noch nicht ganz so warm geworden bin.

mfg angu
PS: Durch die Suchfunktion fand ich einen Thread mit ähnlicher Fragestellung, jedoch wurde ich dort nicht so ganz schlau aus den Erläuterungen und wollte das 3 Jahre alte Thema nicht wieder hochholen. Darum dieser neue Thread.
-
Evtl das Singleton Pattern?
Und zu deinem SetOption: Da wird dir wohl nichts anderes übrig bleiben, als einen String zu verwenden. Du kannst natürlich auch intern Zeiger auf Variablen mit zugehörigem String in eine map werfen, aber das bringt meiner Meinung nach nicht wirklich was.
-
Globale Optionen ohne globale Variablen
Wenn Du die Optionen global haben willst, dann wäre es vermutlich am besten, die Optionen global zu haben.
-
@341159...:
Wie gleiche ich dann den String mit der gewünschten Variable ab,
wenn ich also dann sowas wie SetOption("Variable1",1) an die Funktion übergebe?volkard schrieb:
Globale Optionen ohne globale Variablen
Wenn Du die Optionen global haben willst, dann wäre es vermutlich am besten, die Optionen global zu haben.
Mit "globale Optionen ohne globale Variablen" meinte ich - wie ich auch im ersten Beitrag ausführte-, dass nicht irgendwo vor main oder in einem Header die Einstellungen meines Programms also globale Variablen herumschwirren sollen, sondern das ganze eben strukturiert in einer Art Optionenklasse vorhanden sein sollte.
Und da ich mit C++ Objektorientierung noch kaum Erfahrungen habe, wollte ich eben erst einmal wissen, ob das so funktioniert und wie man das konkret umsetzen könnte. Eben auch, wenn man eine größere Anzahl Optionen behandeln will/muss.
Dementsprechend tut es mir leid, wenn der Beitragstitel irreführt bzw. nicht konkret genug ist. (Denn als solche Kritik fasse ich deine Antwort auf)
Wie gesagt, habt bitte etwas Nachsicht, auch wenn die gestellte Frage sicher für die meisten hier trivial ist.
-
Angura schrieb:
@341159...:
Wie gleiche ich dann den String mit der gewünschten Variable ab,
wenn ich also dann sowas wie SetOption("Variable1",1) an die Funktion übergebe?volkard schrieb:
Globale Optionen ohne globale Variablen
Wenn Du die Optionen global haben willst, dann wäre es vermutlich am besten, die Optionen global zu haben.
Mit "globale Optionen ohne globale Variablen" meinte ich - wie ich auch im ersten Beitrag ausführte-, dass nicht irgendwo vor main oder in einem Header die Einstellungen meines Programms also globale Variablen herumschwirren sollen, sondern das ganze eben strukturiert in einer Art Optionenklasse vorhanden sein sollte.
Und da ich mit C++ Objektorientierung noch kaum Erfahrungen habe, wollte ich eben erst einmal wissen, ob das so funktioniert und wie man das konkret umsetzen könnte. Eben auch, wenn man eine größere Anzahl Optionen behandeln will/muss.
Dementsprechend tut es mir leid, wenn der Beitragstitel irreführt bzw. nicht konkret genug ist. (Denn als solche Kritik fasse ich deine Antwort auf)
Wie gesagt, habt bitte etwas Nachsicht, auch wenn die gestellte Frage sicher für die meisten hier trivial ist.
Sorry, Mi´verständnis.
Ich meine, Du mußt nicht nur deswegen globale Variablen meiden, weil sie so verpönt sind, weil jeder sagt, daß sie schlecht seien.Ja, sie sind schlecht. Aber nicht, weil sie globale Variablen sind, sondern weil sie globale Optionen sind. Weil man sich aus Faulheit spart, die Optionen immer runterzureichen.
Diese Faulheit sei Dir aber gegönnt.
Und dann meine ich, daß man nicht unbedingt nach Techniken suchen muß, die dafür seogen, daß man die globalen Variablen nicht sieht. Zum Beispiel das mit dem Singleton ist oft so benutzt, daß es nur die Tatsache versteckt, daß man globale Variablen hat. Und SetOption ändert auch nichts. Beide aber tendieren dazu, die Geschichte langsam und unflexibel zu machen und sie reden mit gespaltener Zunge. Wenn man globale Daten hat, sind doch globale Variablen genau das Sprachmittel, das offen zeigt, was Sache ist. Die globalen Optionen sind nunmal globale Daten.Aber natürlich in eine struct oder Klasse zusammengefaßt. Nicht 30 einzelne Variablen.
-
@volkard
Wäre ein statischer Konstruktor bei so etwas nicht nützlich? Der Konstruktor würde beim Programmstart die Optionen auslesen, während der Laufzeit sind die Optionen als Membervariablen vorhanden (die man verändern kann) und beim Programmende werden die Optionen vom Destruktor wieder in eine Datei geschrieben.@TE
Das scheint in C++ aber nicht möglich zu sein. Aber dennoch scheint mir die beste Lösung etwas Ähnliches zu sein, nur dass du dann eine globale Instanz der Klasse erstellen musst.
-
cooky451 schrieb:
Wäre ein statischer Konstruktor bei so etwas nicht nützlich? Der Konstruktor würde beim Programmstart die Optionen auslesen, während der Laufzeit sind die Optionen als Membervariablen vorhanden (die man verändern kann) und beim Programmende werden die Optionen vom Destruktor wieder in eine Datei geschrieben.
Genau das kann auch der Konstruktor einer globalen Variable tun. Das Einzige wo ein Singleton da eine Hilfe sein könnte wäre dass sich Probleme mit der Initialisierungsreihenfolge lösen lassen. Dabei muss man aber auch bedenken dass man diese Probleme ohne globale Daten von vornherein schon garnicht hätte...
volkard hat es ja schon schön gesagt: Wenn du keine globalen Variablen willst dann solltest du das Konzept von globalen Optionen überdenken, denn die sind nunmal eben global und daran wird sich auch wenn du sie in eine bunte Verpackung steckst nix ändern...
-
cooky451 schrieb:
@volkard
Wäre ein statischer Konstruktor bei so etwas nicht nützlich? Der Konstruktor würde beim Programmstart die Optionen auslesen, während der Laufzeit sind die Optionen als Membervariablen vorhanden (die man verändern kann) und beim Programmende werden die Optionen vom Destruktor wieder in eine Datei geschrieben.Dann kann aber die main() keine MessageBox mehr zeigen oder es sonstwie behandeln, wenn die Konfigurationsdatei kaputt ist. Komplexen Code führe ich ungern vor der main() aus. Mir würde es reichen, das relativ früh in der main() zu machen.
Willst Du es automagisch haben, wäre das vielleicht ein Grund für den Meyers-Singleton. Es fühlt sich an, als sei die Konfiguration schon immer da, sie speichert sich am Ende von allein ab, und sie wird erst "spät" geladen.
-
http://ideone.com/V0kna
Zuerst dachte ich mir, das wird schön und brauchbar. Aber mittlerweile finde ich es extrem hässlich. Auch, weil hier Zeiger entstehen können, die ins Nichts zeigen.Am besten hältst du dich an den Vorschlag von Volkard und nimmst globale Variablen.
-
Ok, danke für eure Antworten.
Also zusammengefasst: wenn es schon globale Optionen sein sollen, dann sind sie eben global , aber strukturiert in einer Klasse/struct.
Dann dürfen die Membervariablen doch auch public sein, oder? Wenn es eh globale Variablen sind und die Set-Funktion ohnehin nur die gleiche Zuweisung macht?