Frage

Für eine Anwendung, die eine Reihe von Umgebungsvariablen verwendet, ist es eine Art einer Konvention oder „best practice“, wenn es darum geht, Umgebungsvariablen zu greifen und setzen sie entweder in einer Struktur oder ein Bündel von const ist? Natürlich, ich will für jede einzelne Umgebungsvariable auf einen Standardwert zu Rückfall. Im Augenblick scheint die folgende Verwendung wie eine sehr unordentlich Art und Weise tun:

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

Ich könnte auch eine Funktion schreiben, dass Wraps getenv einen Standardwert zurück, wenn eine Umgebungsvariable leer ist, aber ich bin nicht sicher, ob das auch der beste Weg, es zu tun. Ich könnte auch mit der Verwendung von const abschaffen, aber das scheint nicht wie eine gute Sache zu tun, auch nicht.

Alle Gedanken?

War es hilfreich?

Lösung

Wie wäre:

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;
}

Wird als:

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

Andere Tipps

James McNellis eine große Antwort , aber hier ist eine alternative Meinung:

Ich denke, getenv() gibt den Wert der Umgebungsvariablen zu dem Zeitpunkt das Programm gestartet wurde. Wenn die Umgebungsvariable geändert wird, nachdem das Programm gestartet wird, würde getenv() noch den alten Wert zurück. Auf dieser Basis kann ein alternativer Ansatz sein, um eine Klasse zu haben, alle erforderlichen Umgebungsvariablen als Attribut zu erfassen. Die Klasse wird zu Beginn des Programms gefüllt und bietet nur (const qualifiziert) Accessormethoden. Auf diese Weise die getenv() genannt wird genau einmal für jede Umgebungsvariable. Auf der negativen Seite, nimmt die Klasse etwas Platz nach oben.

In dem alternativen Ansatz, der keinen Raum nicht verwendet, getenv() wird aufgerufen, wenn der Wert einer Umgebungsvariable erforderlich ist. Es ist nicht, dass der getenv() Anruf teuer ist (eigentlich kann ich nicht‘wissen), aber es trägt eine falsche Annahme für den Programmierer, dass der letzte Wert zurückgegeben werden könnte.

Auch eine Klasse mit abstrahieren kann nützlich sein, wenn es eine Abhängigkeit ist die environement Variablen in Verwendung, z.B.

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

(this is just an example though)

Nun wird eine Funktion, die über $OS nicht kümmern, sondern braucht nur $GCC kann beziehen sich nur auf envClass->get("GCC");

Nur so ein Gedanke.

Ich tue dies in der Regel mit einer Klasse, die Lasten Einstellungen Konfiguration (entweder aus der Umgebung oder einer Konfigurationsdatei). Ich instanziiert eine einzige globale Instanz davon beim Start. Die Programmeinstellungen sind eine Methode oder Eigenschaft des Konfigurationsklassenobjekt. Es ist einfach und wenn Sie Code schreiben, es ist ziemlich klar, was Sie bestimmt:

if ( configuration.ExitOnFailure && IsError() )
   exit();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top