Quando utilizzare Costanti e file di configurazione per mantenere la configurazione


20

Spesso combatto con me stesso sull'opportunità di inserire determinate chiavi nel mio web.config o in una classe Constants.cs o qualcosa del genere.

Ad esempio, se volessi memorizzare chiavi specifiche dell'applicazione per qualunque sia il caso ... Potrei memorizzarlo e prenderlo dalla mia configurazione web tramite chiavi personalizzate o consumarlo facendo riferimento a una costante nella mia classe di costanti.

Quando vorresti usare Costanti sui tasti di configurazione?

Questa domanda si applica davvero a qualsiasi lingua penso.

Risposte:


20

Personalmente userei solo le costanti come valori predefiniti e lascerei che vengano sovrascritte dai valori di un file di configurazione.

Se l'applicazione accetta argomenti da riga di comando, questi a loro volta sovrascriverebbero i parametri del file di configurazione.


3

Il valore nel file di configurazione è più difficile da mantenere rispetto al valore nella classe delle costanti, perché il compilatore non verifica che esista ed è del tipo corretto, l'IDE di solito non fornisce assistenza al codice per esso e anche perché è ancora un'altra sintassi che devi passare a durante la programmazione.

Quindi suggerirei di mettere:

  • Valori che saranno gli stessi in tutte le installazioni delle costanti nel codice. Ci sono alcuni vantaggi nel metterli in una classe di costanti (puoi facilmente provare vari valori per vedere come funzionano) e metterli nel modulo che li utilizza (non devi aprire ancora un altro file quando modifichi quel modulo e evitando un file che tutti avrebbero modificato causando conflitti nel controllo della versione).
  • Valori che (potrebbe) essere necessario modificare per installazione per configurare il file. E probabilmente vorrai mettere comunque il default nel codice, quindi se il valore non è impostato nella configurazione, l'applicazione funziona ancora (in qualche modo).

cosa vuoi dire tipo corretto ... config keys ... è xml ...
WeDoTDD.com

@CoffeeAddict: tipo corretto significa che se hai un'opzione che richiede un numero e il tuo file di configurazione ha una stringa non numerica sul posto, non troverai fino al runtime. E "chiave di configurazione" è qualunque cosa tu usi per recuperare il valore dal file di configurazione, in caso di XML il percorso dell'elemento. Ok, puoi avere uno schema e una classe corrispondente (c'è xsduno strumento per generarne uno dall'altro) e usare la configurazione con XMLSerializer(il modo più sensato per gestire XML in C # comunque), quindi puoi convalidare in anticipo, ma è ancora qualche extra opera.
Jan Hudec,

Non sono d'accordo: "Il valore nel file di configurazione è più difficile da mantenere rispetto al valore nella classe delle costanti" - dipende da come hai codificato la tua configurazione e da quanti di questi elementi configurabili hai: non ripetere te stesso!
Ingegnere,

3

La modifica delle costanti richiede la ricostruzione dell'applicazione nella maggior parte dei casi. In altre parole, le costanti rimangono costanti quando qualcuno non ha accesso al codice.

Pertanto, tutte le informazioni che l'utente finale deve fornire (e devono cambiare) dovrebbero andare nei file di configurazione. La maggior parte degli altri deve andare sotto costanti. Tuttavia, se i file di configurazione sono danneggiati devono esistere impostazioni predefinite legittime o gestione delle eccezioni di errore.

Gli elementi che non fanno parte dell'astrazione dell'oggetto (ovvero se le costanti che non sono pensate per essere modificate da oggetti esterni (chiamanti) sono probabilmente nascoste e sostanzialmente significano che sarebbero meglio come costanti private rispetto ai file di configurazione.

Quando ci sono molti elementi di configurazione che riguardano oggetti diversi, non correlati tra loro, e quando così tanti oggetti devono estrarre (stessi o i propri) file di configurazione, è probabile che queste cose debbano essere costanti.


1

Una semplice regola empirica è quella di creare costanti quando sai che lavorerai con un insieme fisso di valori che sai che possono essere applicati per qualsiasi dato contesto senza bisogno di cambiare; fornire configurazioni esterne per tutto il resto.

Un buon esempio di costanti sarebbe se tutte le forme con cui hai lavorato potessero essere SQUAREo ROUND. Nella maggior parte delle lingue, sarai in grado di sfruttare il fatto che questo valore non cambia nel tempo, allocandolo una sola volta e ottimizzando la modalità di accesso.

Le configurazioni esterne sono necessarie quando è necessario recuperare il valore in modo dinamico perché non è possibile assumere in anticipo il valore con cui si lavorerà, ma ciò non significa che è necessario effettuare un compromesso sulle prestazioni: per i valori di configurazione che ci si aspetta di essere presente, se fatto correttamente, si paga solo il prezzo per recuperarli una volta e ottenere comunque tutti i vantaggi.



0

Una costante per definizione è una posizione di memoria per un valore che non dovrebbe cambiare (come PI).

Suppongo che intendevi "parametro" e non una costante

Oltre a quanto detto, si noti che l'esposizione delle variabili all'input dell'utente dal file di configurazione potrebbe danneggiare l'applicazione.

Se possibile, non esporre i valori nel file di configurazione senza convalidarli nel codice per un controllo di integrità. Inoltre, ti suggerisco di non inserire i parametri delle regole di business (come stipendio massimo, ecc.) Nei file di configurazione e di non utilizzare costanti neanche per quelli. Tali valori devono essere archiviati nel database con le definizioni di tabella appropriate in modo che venga applicata una certa sicurezza quando vengono modificati e si possono creare automaticamente versioni dei valori dei dati (utilizzando i processi memorizzati o i registri db). Naturalmente, questo dipende dalla sensibilità della tua applicazione.

Se usi mai i file di configurazione per archiviare i dati, assicurati di eseguirne la versione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.