7
votes

Comment créer un objet Paramètres global

Voici une tâche simple, simple: lire les paramètres de configuration à partir d'un fichier de configuration, enregistrez les paramètres (par exemple en tant que hachage) dans un objet, accédez à cet objet à partir de divers objets qui doivent accéder aux paramètres de configuration.

J'ai trouvé. Cette implémentation pour la mise en œuvre de la classe ConfigFile et fonctionne. Ma question est la suivante: quelle est la meilleure façon de faire une instance de cette classe disponible à partir de mes autres classes et d'être un fil de sécurité, évitez les fiasco d'ordre d'initialisation statique, etc.

Mon approche actuelle consiste à le construire dans la principale () Utilisation xxx

puis apporter des paramètres une variable globale. Mais je lis aussi que les singletons doivent être utilisés au lieu de variables globales. Comment le singleton peut-il être instancié avec le nom de fichier?

Ceci doit être une tâche aussi courante que je pense qu'il doit y avoir un bon moyen de le faire généralement? J'apprécierais que quelqu'un me pointe dessus.

merci, C


0 commentaires

6 Réponses :



2
votes

Ce que j'ai fait pour ma classe de configuration consiste à créer une classe statique singleton avec un cache de hashtable. Mon fichier de configuration est conçu pour être lu et écrit pour changer les paramètres d'application.

Chaque fois qu'un appel est effectué pour tirer un réglage, j'effectue une recherche sur la haquetable, si ce n'est pas là, j'ai lu le réglage du fichier, verrouillez la haquetable et placez-la dans la haquetable. La hache très rapide pour les recherches.


0 commentaires

0
votes

Je suis d'accord avec Chris, utilisez un singleton. La bonne chose à propos du modèle singleton est que cela n'initialise / rassemble uniquement les données dont vous avez besoin la première fois que vous essayez d'y accéder, à partir de là, il est disponible pour tout le monde intéressé. Si vous allez permettre à la configuration de changer, vous voudrez verrouiller l'écrivain.


0 commentaires

6
votes

Si vous voulez rouler - votre propre, je vous recommanderais d'utiliser le modèle de conception singleton pour votre classe de configuration. Demandez à la classe elle-même stocker un pointeur statique de son propre type et que le constructeur soit privé, il serait donc obligé d'utiliser le getter statique pour obtenir l'instance de la classe.

Donc, donc une maquette (qui peut ne pas compiler , a manquant la fonctionnalité de configuration amusante, mais il doit illustrer le point) xxx

au cas où je ne serais pas clair, le getconfig () regarderait m_configinstance. Si ce n'est pas valide, il en créerait un (a accès au constructeur privé) et le stockerait dans m_configinstance afin que chaque appel ultérieur accéderait à la même chose.

Votre principale () Utilisez SetConfigFileName (), puis toute classe devra simplement appeler config :: getconfig (), puis appelez les opérations à ce sujet. Beaucoup plus propre qu'une variable globale standard.

Blast - Dans le temps que j'ai passé à écrire ceci, d'autres personnes ont suggéré le modèle de conception singleton aussi. Ah bien - espérons que l'explication supplémentaire aide.


0 commentaires

2
votes

En mentionnant le "FIASCO d'ordre d'initialisation statique", je suppose que vous devez disposer d'éléments de configuration disponibles pour initialiser certains objets statiques. Une classe Singleton ConfigFile fonctionnera, mais vous devez modifier la façon dont vous obtenez le nom de fichier au fur et à mesure que les informations nécessaires avant le début principal (). Vous aurez besoin d'un autre singleton pour fournir le nom de fichier ou construire le nom de fichier dans la classe de configuration elle-même.


0 commentaires

0
votes

J'ai utilisé une technique similaire au modèle de conception singleton pour configurer des ressources globales comme celle-ci.

class Config
{
public:
   Config(const string & filename) {
      if (m_configInstance) {
         throw AlreadyInitException;
      }
      // do main init
      m_configInstance = this;
   }

   ~Config() {
      m_configInstance = 0;
   }

   static Config * getConfig() {
      if (!m_configInstance) {
         throw NoConfigException;
      }
      return m_configInstance;
   }

private:
   static Config * m_configInstance;
};

Config * Config * m_configInstance = 0;


0 commentaires