einstellungen verwalten - wie nur?



  • hallo

    ich programiere schon einige zeit. erst in vb. dann als ich das internet von meinen eltern geschenkt bekam html, js php. nun wo ich ubuntu gnu/linux nutze und "älter" geworden bin wenig c und etwas mehr java.
    nun wo ich ein prog. geschrieben habe was schon etwas umfangreicher geworden ist. kommt die fase, wo es die ersten einstellungsmöglichkeiten (user) bekommen könnte.
    das war und ist mir bis heute immer eine last. weshalb ich mal in die runde fragen wollte:
    Wie geht ich mit user-einstellungen um?
    -wo, wann und wie lest ihr sie ein
    -wo, wann und wie last ihr sie vom user ändern ("live" o. mit neustart)
    -wie und wo verwaltet ihr sie im programm
    -wo, wann und wie speichert ihr sie ab
    würde es toll finden wenn ihr euer vorgehen etwas umschreiben oder kurz andeuten könntet.
    btw mein prog schriebe ich in java.
    wenn geantwortet wird, dickes thx von mir.



  • als ich das internet von meinen eltern geschenkt bekam

    🙄



  • rollauge schrieb:

    als ich das internet von meinen eltern geschenkt bekam

    🙄

    ja ok - internet-zugang...



  • ich schmeiss meine settings meist in die registry - mit moeglichkeit des "bereinigens" - beim ersten start werden alle settings abgefragt mit standardvorgabe - das wird dann gespeichert, und beim programmlauf stets eine live abfrage, dh wenn in den settings was geaendert wurde greift es sofort da es gleich gespeichert wurde

    das ganze hab ich in meine klasse CSettings - sodass ich fuer mein programmlauf nicht viel rumfragen muss wie was eingestellt ist

    die naechste idee die ich verwenden will ist eine xml datei in gemeinsame dateien - da es bei der registry ab und an probleme geben kann wegen schreib/lese rechten



  • In eine eigene Schluessel-Werte Datei. Die wird zu Programmstart in eine Map eingelesen, und die betreffenden Klassen werden dan mit entsprechenden Werten initialisiert (also Neustart ist bei Aenderung erforderlich).
    Liegt schlicht und einfach daran, dass ich zu faul bin, ein Interface zu basteln, mit dem Benutzer ihre Einstellungen aendern koennen. Und in einer einfachen Textdatei kann man halt einfacher rumfrickeln als in der Registry. Ausserdem gibt es meist relativ wenig relevante Einstellungen.
    Andererseits gibts natuerlich auch Einstellungen, die "on the fly" uebernommen werden. Die werden aber i.d.R. gar nirgends abgespeichert, sondern bei Programmstart auf einen Default-Wert gesetzt und bei einer Aenderung wird dies direkt an die betroffene(n) Klasse(n) weitergeleitet.

    Wenn ich das Ganze aber "ordentlich" machen muesste, dann waer das Ganze immer "Live" aenderbar. Anbieten wuerde sich eine Art Observer-Pattern, bei dem sich alle Klassen, die immer informiert werden muessen, wenn sich eine Einstellung aendert, bei einer zentralen "Konfigurationsverwaltung" registrieren muessen und dann informiert werden, wenn sich diese Einstellung aendert. Solang die Programme klein und die Einstellungs-Abhaengigkeiten ueberschaubar bleiben kann man das aber sicher auch einfach hardcodieren ("wenn sich die Einstellungen geaendert haben, rufe x.setVisible(aktuellerWert), y.setColor(aktuellerWert), z.setFoo(aktuellerWert) auf").



  • > -wo, wann und wie lest ihr sie ein
    Eingelesen wird dort wo es gebraucht wird. In Funktionen wo Einstellungen mehrfach gebraucht werden werden die in lokalen Variablen aufgehoben, wenn ein ganzer Dialog eine Einstellung braucht merkt er sie sich als Membervariable. Wird der Dialog zu und wieder aufgemacht wird die Einstellung neu eingelesen (davor nicht).

    > -wo, wann und wie last ihr sie vom user ändern ("live" o. mit neustart)
    In einem Einstellungs-Dialog, ... wie? - naja, über Buttons und Zeugs, was halt angebracht ist. Und ja, wird sofort übernommen, ausgenommen die Spracheinstellung (da ich sonst alle Strings neu laden müsste, und das war mir bis jetzt zu umständlich, obwohl ich mittlerweile eine Möglichkeit wüsste wie man das halbwegs elegant hinbekommt).

    > -wie und wo verwaltet ihr sie im programm
    Beim letzten Projekt als Klassen in einem Namespace, ala so:

    ConfigValues::Language::Get();
    

    Würde ich aber nichtmehr so machen, würde jetzt eher ne Klasse überall mit rumreichen über die zugegriffen wird.

    > -wo, wann und wie speichert ihr sie ab
    In der Registry (HKEY_CURRENT_USER\Software\...), und immer dann wenn sie geändert werden (beim "apply" drücken), also im Einstellungen Dialog.



  • rollauge schrieb:

    als ich das internet von meinen eltern geschenkt bekam

    🙄

    😃



  • Registry ist etwas unproduktiv wenn der OP sagt, dass er gnu/Linux (Ubuntu) verwendet, findet ihr nicht?

    Trotz der Flamewargefahr:

    Ich speichere meine Einstellungen am liebsten in einer XML-Datei, kommt dann nach /usr/share/programmnahme/settings.xml oder so ähnlich.

    Wenns nur einfache Schlüssel-Wert-Paare sind tuts auch eine einfache .ini - Datei.

    Settings sollten IMHO wenn irgendwie möglich Live übernommen werden, wenn dem User im Programm ein Interface daführ zur Verfügung steht (bei einer GUI vll ein dialog, geht aber auch über die Shell wenns ein gutes UI ist).

    Wenn die Einstellungen "von Hand" in die Dateien geschrieben werden müssen, was je nachdem Sinn machen kann (gerade ohne GUI) ist ein Neustart nötig.

    Im Programm beitet sich eine oder mehrere Singletonklassen an, das macht den Zugriff von allen möglichen Punkten einfach. Das einlesen von Dateien kann man dann entweder in den Konstruktor packen oder (vll besser) eine init() - funktion schreiben.



  • Ich benutze eine Config-Datei welche vom Aufbau her Ähnlichkeiten mit einer ini-Datei hat.
    Diese wird automatisch erstellt falls der Benutzer noch keine hat (gespeichert wird sie getrennt für jeden Benutzer).

    Die Standardwerte werden in einer anderen Datei gespeichert in Welcher man angeben kann was für ein Typ der Eintrag haben soll und dazu noch ein beschreibender Kommentar. Daraus wird die Standard-Config-Datei erzeugt (mit Kommentaren die Beschreiben was jeder Eintrag tut). Durch den Typ ist das ganze Typsicher und es wird garantiert, dass die Standardeinträge existieren. Dadurch muss man im Programm selbst nicht immer extra prüfen.
    Zusätzlich kann man in die Config-Datei jederzeit neue Einträge hinzufügen, entweder durch das Ändern der Datei oder innerhalb des Programms. Auch Standardeinträge können geändert werden (allerdings nur der Wert nicht der Typ).

    Ursprünglich wollte ich boost::program_options nehmen, aber das erlaubt keine unregistrierten Einträge was das ganze stark einschränkt.


Anmelden zum Antworten