Come modellare al meglio le impostazioni di un'applicazione?

3

La mia applicazione ha un file di configurazione e una finestra "Impostazioni". Quando l'utente conferma le modifiche in questa finestra, vengono applicate e scritte nel file di configurazione.

Queste impostazioni sono spesso modificate e referenziate nel mio programma. Sto cercando di capire come modellare l'accesso e la manipolazione di queste impostazioni. Da un lato, non posso fare riferimento direttamente agli elementi della GUI, sembra proprio una pessima pratica. D'altra parte non riesco a continuare a leggere e scrivere sul file di configurazione perché non voglio che certe modifiche alle impostazioni vengano mantenute, ad es. il nome utente corrente dell'utente collegato deve essere memorizzato da qualche parte; Non riesco a memorizzarlo nel file di configurazione perché non voglio che l'applicazione "ricordi" l'utente che ha effettuato l'accesso al sistema.

Quindi la soluzione ha un oggetto ConfigObj , contenente tutte le impostazioni del programma, che è accessibile a tutti i moduli del codebase? È una soluzione comune?

Ma c'è un problema che non so come risolvere, dimostrato nel seguente scenario:

  1. Il programma parte, l'oggetto ConfigObj viene inizializzato con il file di configurazione.
  2. L'utente apre la finestra "Impostazioni". I controlli della GUI sono popolati con i valori di ConfigObj .
  3. Uno dei valori nella finestra "Impostazioni" è "Porta COM" e, se l'utente lo modifica e fa clic su "Salva impostazioni", il suo valore verrà scritto su ConfigObj e sul file di configurazione.
  4. L'utente chiude la finestra "Impostazioni" e apre un'altra finestra "Trova porta USB". Questa finestra trova una porta COM disponibile e la assegna a ConfigObj.Port . Questa modifica è piuttosto temporanea e non viene scritta nel file di configurazione, ma ora la porta selezionata a livello globale per l'applicazione è impostata su questo e altre funzioni dipendono da questo valore.
  5. Ora l'utente apre nuovamente la finestra "Impostazioni": il programma dovrebbe visualizzare le impostazioni correnti del programma, cioè cosa c'è in ConfigObj , ma come fa a saperlo invece di compilare dal file di configurazione come nel passaggio 1?

Suppongo di poter confrontare tutti i valori tra il file di configurazione e ConfigObj , ma esiste un modo più corretto? Qual è il modo più pulito per gestire la configurazione a livello di applicazione?

    
posta DBedrenko 18.08.2015 - 16:19
fonte

1 risposta

1

Dato che la tua applicazione ha bisogno di quel tipo di complessità, ecco i miei 5 centesimi (userò il codice Java):

Le impostazioni sono divise in due categorie, a seconda che abbiano o meno effetto immediato quando vengono alterate.

  • dinamico: ha un effetto immediato sul comportamento dell'applicazione
  • statico: non ha un effetto immediato nel comportamento dell'applicazione e ha effetto solo sul riavvio dell'applicazione o su config reload.

L'ambito di modifica di un'impostazione può essere:

  • memoria
  • disco
  • memoria e disco

Penso che l'oggetto Configuration debba implementare questa interfaccia:

import java.util.List;
import java.util.Map;

public interface Configuration {
    // key is the name of a setting
    public void reload(); // reloads from disk without restarting app 
    public String getValue(String key); // gets value of setting identified by key
    public String getOldValue(String key); // gets old value of setting identified by key
    public String setValueToMemory(String key); // alters value of setting identified by 
                                                // key only in memory (will be lost after reload or restart)
    public String setValueToMemoryAndDisk(String key); //alters value of setting identified by key 
                                                       //both in memory and disk (will persist after reload or restart)
    public String isDirty(String key); // indicates whether or not this setting is "dirty", 
                                       // meaning it's value is different from disk.
    public Setting getSetting(String key); // return setting metadata
    public void dump(); // prints all key-value pairs
    public List<Setting> getSettings(); // gets a list of all settings (metadata)
    public Map<String,String> getValues(); // gets a map with key-value pairs 
}

Affinché la finestra di configurazione sia in grado di indicare visivamente se un'impostazione è dinamica o statica, dovrebbe esistere un elenco di oggetti Setting

public interface Setting {
    public String getName();
    public String setName(String name);
    public String getTag();
    public String setTag(String tag);
    public boolean isDynamic();
}
    
risposta data 18.08.2015 - 18:19
fonte

Leggi altre domande sui tag