0

多数の環境変数を使用するアプリケーションの場合、環境変数を取得して構造体または一連の環境変数に配置することに関して、ある種の規則または「ベストプラクティス」はありますconstか?明らかに、すべての環境変数のデフォルト値にフォールバックしたいと思います。今のところ、以下を使用することは非常に厄介な方法のようです。

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

環境変数が空の場合にデフォルト値を返すようにラップする関数を作成することもできgetenvますが、それが最善の方法であるかどうかはわかりません。を使用しないこともできますconstが、それも良いことではないようです。

何かご意見は?

4

3 に答える 3

10

どうですか:

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

使用されます:

const std::string some_variable = GetEnvironmentVariableOrDefault("SOME_VARIABLE", "5");
于 2010-10-14T18:21:08.927 に答える
0

ジェームズ・マクネリスは素晴らしい答えを提供しましたが、ここに別の意見があります:

getenv()プログラム開始時の環境変数の値を返すと思います。プログラムの開始後に環境変数が変更された場合getenv()でも、古い値が返されます。これに基づいて、別のアプローチとして、必要なすべての環境変数を属性としてキャプチャするクラスを作成することもできます。このクラスはプログラムの開始時に設定され、(定数修飾された)アクセサーメソッドのみを提供します。このようにして、は環境変数ごとに1回だけgetenv()呼び出されます。マイナス面として、クラスはある程度のスペースを占めます。

スペースを使用しない別のアプローチではgetenv()、環境変数の値が必要な場合は常に呼び出されます。呼び出しに費用がかかるわけではgetenv()ありませんが(実際にはわかりません)、プログラマーは最新の値が返される可能性があるという誤った仮定を持っています。

また、クラスを持つことは、環境変数の使用に依存関係がある場合に抽象化するのに役立つ場合があります。

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

(this is just an example though)

さて、気にしない$OSが必要なだけの関数$GCCは、ただ参照することができますenvClass->get("GCC");

ちょっとした考え。

于 2010-10-14T19:56:22.860 に答える
0

私は通常、(環境または構成ファイルのいずれかから)構成設定をロードするクラスを使用してこれを行います。起動時にその単一のグローバルインスタンスをインスタンス化します。プログラム設定は、構成クラスオブジェクトのメソッドまたはプロパティです。それは単純で、コードを書くとき、あなたが意図したことはかなり明確です:

if ( configuration.ExitOnFailure && IsError() )
   exit();
于 2010-10-14T20:01:04.590 に答える