web-dev-qa-db-fra.com

Quel est le meilleur moyen de stocker un groupe de constantes utilisées par mon programme?

J'ai plusieurs constantes que mon programme utilise ... string, int, double, etc ... Quelle est la meilleure façon de les stocker? Je ne pense pas que je veux un Enum, car les données ne sont pas du même type et je veux définir manuellement chaque valeur. Devrais-je juste les stocker tous dans une classe vide? Ou y a-t-il un meilleur moyen?

92
Matthew

Vous pourriez probablement les avoir dans une classe statique, avec des propriétés statiques en lecture seule.

public static class Routes
{
    public static string SignUp => "signup";
}
124
Daniel A. White

OMI en utilisant une classe pleine de constantes est très bien pour les constantes. S'ils changeront de temps en temps, je vous recommande d'utiliser AppSettings dans votre configuration et la classe ConfigurationManager.

Quand j'ai des "constantes" qui sont réellement extraites d'AppSettings ou similaire, j'ai toujours une classe "constantes" qui encapsule la lecture du gestionnaire de configuration. C'est toujours plus significatif d'avoir Constants.SomeModule.Setting au lieu d’avoir directement recours à ConfigurationManager.AppSettings["SomeModule/Setting"] sur tout lieu qui souhaite utiliser ladite valeur de réglage.

Points bonus pour cette configuration, puisque SomeModule serait probablement une classe imbriquée dans le fichier de constantes, vous pouvez facilement utiliser Dependency Injection pour injecter directement SomeModule dans les classes qui en dépendent. Vous pouvez également même extraire une interface au-dessus de SomeModule, puis créer une dépendance à ISomeModuleConfiguration dans votre code consommateur, ce qui vous permettrait ensuite de découpler la dépendance aux fichiers constants, et même potentiellement faciliter les tests, en particulier si ces paramètres proviennent d'AppSettings et que vous les modifiez à l'aide de transformations de configuration, car ils sont spécifiques à l'environnement.

26
Chris Marisic

Ce que j'aime faire, c'est ce qui suit (mais assurez-vous de lire jusqu'au bout pour utiliser le bon type de constantes ):

internal static class ColumnKeys
{
    internal const string Date = "Date";
    internal const string Value = "Value";
    ...
}

Lisez ceci pour savoir pourquoi const pourrait ne pas être ce que vous voulez. Les types possibles de constantes sont:

  • const champs. Ne pas utiliser dans les assemblages (public ou protected) si la valeur pourrait changer à l'avenir car la valeur sera codée en dur au moment de la compilation dans ces autres assemblées. Si vous modifiez la valeur, l'ancienne valeur sera utilisée par les autres assemblys jusqu'à ce qu'ils soient recompilés.
  • static readonly des champs
  • static propriété sans set
18
Marcel Gosselin

C’est la meilleure façon pour l’OMI. Pas besoin de propriétés, ou en lecture seule:

public static class Constants
{
   public const string SomeConstant = "Some value";
}
11
Philip Wallace

Une classe statique vide est appropriée. Pensez à utiliser plusieurs classes afin de vous retrouver avec de bons groupes de constantes connexes, et non pas un seul fichier Globals.cs géant.

De plus, pour certaines constantes int, considérons la notation:

[Flags]
enum Foo
{
}

Comme cela permet de traiter les valeurs comme des drapeaux .

4
emptyset

Un autre vote pour l'utilisation de web.config ou app.config. Les fichiers de configuration sont un bon emplacement pour les constantes telles que les chaînes de connexion, etc. Je préfère ne pas avoir à regarder la source pour afficher ou modifier ce type de choses. Une classe statique qui lit ces constantes à partir d'un fichier .config peut constituer un bon compromis, car elle permettra à votre application d'accéder à ces ressources comme si elles étaient définies dans le code, tout en vous laissant la possibilité de les avoir dans un format facilement lisible/éditable. espace.

3
3Dave

Oui un static class pour stocker des constantes serait très bien, sauf pour les constantes liées à des types spécifiques.

1
bruno conde

Si ces constantes sont des références de service ou des commutateurs affectant le comportement de l'application, je les configurerais en tant que paramètres utilisateur de l'application. Ainsi, si elles doivent être modifiées, vous n'avez pas besoin de recompiler et vous pouvez toujours les référencer via la classe de propriétés statiques.

Properties.Settings.Default.ServiceRef
0
Aaron

Je suggérerais classe statique avec statique en lecture seule. Veuillez trouver l'extrait de code ci-dessous:

  public static class CachedKeysManager
    {
        public static readonly string DistributorList = "distributorList";
    }
0
KAPIL SHARMA