Question

Pour une application qui utilise un certain nombre de variables d'environnement, est-il une sorte d'une convention ou les « meilleures pratiques » en matière de saisir les variables d'environnement et de les mettre soit dans une struct ou un bouquet de ce const? De toute évidence, je veux à une valeur de repli par défaut pour chaque variable d'environnement. En ce moment, en utilisant ce qui suit apparaît comme une manière très désordonnée de le faire:

char* x;
const SOME_VARIABLE;
if (NULL == (x = getenv("SOME_VARIABLE")))
    SOME_VARIABLE = 5; // default value
else
    SOME_VARIABLE = x;

Je pourrais aussi écrire une fonction qui enveloppe getenv pour renvoyer une valeur par défaut si une variable d'environnement est vide, mais je ne suis pas sûr que ce soit, même la meilleure façon de le faire. Je pourrais aussi en finir avec l'utilisation const, mais cela ne semble pas être une bonne chose à faire, que ce soit.

Toutes les pensées?

Était-ce utile?

La solution

Que diriez-vous:

std::string GetEnvironmentVariableOrDefault(const std::string& variable_name, 
                                            const std::string& default_value)
{
    const char* value = getenv(variable_name.c_str());
    return value ? value : default_value;
}

Utilisé comme:

const std::string some_variable = GetEnvironmentVariableOrDefault("SOME_VARIABLE", "5");

Autres conseils

James McNellis a fourni une grande réponse , mais voici une opinion alternative:

Je pense que getenv() renvoie la valeur de la variable d'environnement au moment où le programme a été lancé. Si la variable d'environnement est changée après le démarrage du programme, getenv() retournerait encore la valeur ancienne. Sur cette base, une autre approche peut être d'avoir une classe pour capturer toutes les variables d'environnement requises sous forme d'attributs. La classe est peuplée au début du programme, et ne fournit que (const qualifié) accesseur méthodes. De cette façon, la getenv() est appelée exactement une fois pour chaque variable d'environnement. Du côté négatif, la classe prend un peu d'espace.

Dans l'autre approche, qui n'utilise pas d'espace, getenv() est appelée chaque fois que la valeur d'une variable d'environnement est nécessaire. Ce n'est pas que l'appel getenv() est cher (en fait je ne » sais), mais il porte une fausse hypothèse au programmeur que la dernière valeur peut être renvoyée.

ayant également une classe peut être utile de résumé en cas de dépendance à l'aide des variables d'environement, par exemple,

if $OS = "SunOs" 
then 
    GCC="/bin/gcc" 
else 
    GCC="/usr/bin/gcc" 

(this is just an example though)

Maintenant, une fonction qui ne se soucient pas $OS mais n'a besoin que $GCC, peut simplement se référer à envClass->get("GCC");

Juste une pensée.

Je fais habituellement cela avec une classe de configuration des paramètres charges (soit à partir de l'environnement ou d'un fichier de configuration). J'instancier une seule instance globale de celui-ci au démarrage. Les paramètres du programme sont une méthode ou une propriété de l'objet de classe de configuration. Il est simple et quand vous écrivez du code, il est clair assez ce que vous vouliez:

if ( configuration.ExitOnFailure && IsError() )
   exit();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top