Pregunta

Para una aplicación que utiliza una serie de variables de entorno, ¿hay algún tipo de convención o "mejores prácticas" cuando se trata de agarrar las variables de entorno y ponerlas en cualquiera de una estructura o un montón de const de? Obviamente, quiero repliegue a un valor predeterminado para todos y cada variable de entorno. En este momento, usando la siguiente parece ser una manera muy desordenada de hacerlo:

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

También podría escribir una función que envuelve getenv para devolver un valor por defecto si una variable de entorno está vacía, pero no estoy seguro de si eso es aún la mejor manera de hacerlo. También podría acabar con el uso de const, pero eso no parece ser una buena cosa que hacer, tampoco.

¿Alguna idea?

¿Fue útil?

Solución

¿Qué hay de:

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

Se utiliza como:

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

Otros consejos

James McNellis ha proporcionado un gran respuesta , pero aquí es una opinión alternativa:

creo getenv() devuelve el valor de la variable de entorno en el momento en que se inició el programa. Si la variable de entorno se cambia después de que se inició el programa, getenv() todavía devolvería el valor antiguo. Basado en esto, un enfoque alternativo puede ser tener una clase para capturar todas las variables de entorno necesarias como atributos. La clase está poblado en el inicio del programa, y ??proporciona solamente (const cualificado) métodos de acceso. De esta forma el getenv() se llama exactamente una vez para cada variable de entorno. En el lado negativo, la clase toma un poco de espacio.

En el enfoque alternativo, que no utiliza ningún espacio, getenv() es llamada cuando se requiere que el valor de cualquier variable de entorno. No es que la llamada getenv() es caro (en realidad yo no’sé), pero conlleva una falsa suposición de que el programador que se podría devolver el último valor.

También tener una clase puede ser útil para abstraer si hay alguna dependencia en el uso de las variables de entorno de, por ejemplo,

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

(this is just an example though)

Ahora, una función que no se preocupan por $OS pero sólo necesita $GCC, sólo puede referirse a envClass->get("GCC");

Es sólo una idea.

Yo suelo hacer esto con una clase que las cargas de configuración de valores (ya sea desde el medio ambiente o un archivo de configuración). Me crear instancias de una sola instancia global de la misma en el arranque. Los ajustes del programa son un método o propiedad del objeto de clase de configuración. Es muy sencillo y cuando se escribe código que está bastante claro lo que pretende:

if ( configuration.ExitOnFailure && IsError() )
   exit();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top