Quand utiliser les fichiers Constants vs Config pour maintenir la configuration

20

Je me bats souvent avec moi-même pour mettre certaines clés dans mon web.config ou dans une classe Constants.cs ou quelque chose comme ça.

Par exemple, si je voulais stocker des clés spécifiques à une application dans tous les cas, je pourrais la stocker et la récupérer dans ma configuration Web via des clés personnalisées ou la consommer en référençant une constante dans ma classe de constantes.

Quand voudriez-vous utiliser des constantes sur des clés de configuration?

Cette question s'applique vraiment à n'importe quelle langue, je pense.

WeDoTDD.com
la source

Réponses:

20

Personnellement, je n'utiliserais que des constantes comme valeurs par défaut, et les laisser être remplacées par des valeurs d'un fichier de configuration.

Si l'application prend des arguments de ligne de commande, ceux-ci remplaceraient à leur tour les paramètres du fichier de configuration.

Un mec programmeur
la source
3

La valeur dans le fichier de configuration est plus difficile à maintenir que la valeur dans la classe des constantes, car le compilateur ne vérifie pas qu'elle existe et est de type correct, l'EDI ne fournit généralement pas d'aide de code pour cela et aussi parce que c'est encore une autre syntaxe à laquelle vous devez basculer pendant la programmation.

Je suggère donc de mettre:

  • Valeurs qui seront les mêmes dans toutes les installations que les constantes dans le code. Il y a certains avantages à les placer dans une classe de constantes (vous pouvez facilement essayer différentes valeurs pour voir comment elles fonctionnent) et à les placer dans le module qui les utilise (vous n'avez pas besoin d'ouvrir encore un autre fichier lorsque vous modifiez ce module et en évitant un fichier que tout le monde éditerait provoquant des conflits dans le contrôle de version).
  • Valeurs qui doivent (peut-être) être modifiées par installation dans le fichier de configuration. Et vous voudrez probablement mettre par défaut dans le code de toute façon, donc si la valeur n'est pas définie dans la configuration, l'application fonctionne toujours (en quelque sorte).
Jan Hudec
la source
que voulez-vous dire par type correct ... clés de configuration ... c'est xml ...
WeDoTDD.com
@CoffeeAddict: Un type correct signifie que si vous avez une option qui nécessite un nombre et que votre fichier de configuration contient une chaîne non numérique, vous ne la trouverez pas avant l'exécution. Et "clé de configuration" est tout ce que vous utilisez pour récupérer la valeur du fichier de configuration, en cas de XML, le chemin de l'élément. Ok, vous pouvez avoir un schéma et une classe correspondante (il existe un xsdoutil pour générer l'un à partir de l'autre) et utiliser la configuration avec XMLSerializer(le moyen le plus judicieux de gérer XML en C # de toute façon), afin que vous puissiez valider à l'avance, mais c'est encore un peu plus travail.
Jan Hudec
Pas d'accord: "La valeur dans le fichier de configuration est plus difficile à maintenir que la valeur dans la classe des constantes" - dépend de la façon dont vous avez codé votre configuration et du nombre de ces éléments configurables que vous avez: Ne vous répétez pas!
Ingénieur
3

La modification des constantes nécessite de reconstruire l'application dans la plupart des cas. Autrement dit, les constantes restent constantes lorsque quelqu'un n'a pas accès au code.

Ainsi, toutes les informations que l'utilisateur final doit fournir (et doivent modifier) ​​doivent être enregistrées dans les fichiers de configuration. La plupart des autres doivent passer sous des constantes. Cependant, il doit y avoir des valeurs par défaut légitimes ou une gestion des exceptions d'erreur si les fichiers de configuration sont cassés.

Les éléments qui ne font pas partie de l'abstraction de l'objet (c'est-à-dire si les constantes qui ne sont pas censées être modifiées par des objets externes (appelants) sont susceptibles d'être cachés et signifient essentiellement qu'elles seraient mieux en tant que constantes privées que les fichiers de configuration.

Lorsqu'il existe de nombreux éléments de configuration qui se rapportent à des objets différents, non liés les uns aux autres, et lorsque tant d'objets doivent extraire (les mêmes ou leurs propres) fichiers de configuration, il est probable que ces éléments auraient dû être constants.

Dipan Mehta
la source
1

Une règle générale simple consiste à créer des constantes lorsque vous savez que vous allez travailler avec un ensemble fixe de valeurs qui, selon vous, peuvent être appliquées à un contexte donné sans avoir besoin de changer; fournir des configurations externes pour tout le reste.

Un bon exemple de constantes serait si toutes les formes avec lesquelles vous travailliez pouvaient être SQUAREou ROUND. Dans la plupart des langues, vous pourrez tirer parti du fait que cette valeur ne change pas au fil du temps, en l'allouant une seule fois et en optimisant la façon dont elle est accessible.

Les configurations externes sont nécessaires lorsque vous devrez récupérer la valeur dynamiquement car vous ne pouvez pas supposer à l'avance la valeur avec laquelle vous allez travailler, mais cela ne signifie pas que vous devez faire un compromis sur les performances: pour les valeurs de configuration que vous attendez d'être présent, une fois fait correctement, vous ne payez que le prix de les récupérer une fois et obtenez toujours tous les avantages.

Filip Dupanović
la source
0

Une constante par définition est un emplacement de mémoire pour une valeur qui ne devrait pas changer (comme PI).

Je suppose que vous vouliez dire «paramètre» et non une constante

En plus de ce qui a été dit, notez que l'exposition de variables à l'entrée utilisateur à partir du fichier de configuration peut endommager l'application.

Lorsque cela est possible, n'exposez pas les valeurs dans le fichier de configuration sans les valider dans le code pour effectuer un contrôle de cohérence. De plus, je suggère que vous ne placiez pas de paramètres de règles métier (tels que le salaire maximum, etc.) dans les fichiers de configuration et que vous n'utilisiez pas non plus de constantes pour ceux-ci. Ces valeurs doivent être stockées dans la base de données avec les définitions de table appropriées afin qu'une certaine sécurité soit appliquée lorsqu'elles sont modifiées et vous pouvez créer automatiquement des versions des valeurs de données (à l'aide de procs stockés ou de journaux db). Bien sûr, cela dépend de la sensibilité de votre application.

Si vous utilisez des fichiers de configuration pour stocker des données, assurez-vous de les versionner.

Aucune chance
la source