0

スコープとカプセル化について一般的な質問があります。2つのシナリオを取ります。

シナリオ1:

// a global application level constant
public static const IS_DEMO_MODE:Boolean = false;   

... // somewhere deep in the codebase

private function _myFunction():void
{
    if (IS_DEMO_MODE == true) {
      // If Demo Mode do not allow this function to complete
      return;       
    }
    else {
       // Function behaves normally
       // Code ...
    }

}

シナリオ2:

// a global application level constant
public static const IS_DEMO_MODE:Boolean = false;   

... // somewhere deep in the codebase

 // call the function and pass in the constant
_myFunction(IS_DEMO_MODE);


private function _myFunction(isDemoMode:Boolean):void
{
    if (isDemoMode == true) {
      // If Demo Mode do not allow this function to complete
      return;       
    }
    else {
       // Function behaves normally
       // Code ...
    }

}

機能的に言​​えば、これら2つのコードスニペットはまったく同じことを行います。私はコーディングスタイルのより細かい点を理解しようとしていますが、なぜ一方の方法がもう一方の方法よりも優先されるのでしょうか。カプセル化の観点からは、シナリオ2の方が優れているようです。ただし、シナリオ1は、条件付きのブール値が1つの場所、つまりグローバル定数からのみ取得されるという点で、より確実です。パラメータを正しく受信しているときに間違った値を渡す可能性がある関数呼び出しについて心配する必要はありません。ただし、シナリオ2は、定数の依存関係を削除し、関数をより動的に動作させることができるため、価値があるように思われます。これについて何か考えはありますか?私が見ている他のトレードオフはありますか?

同じ概念と質問がオブジェクトとクラスにも適用されます。ただし、コード例を簡単にするために、関数の観点から例を示しています。

4

2 に答える 2

1

2番目のアプローチでは、グローバルモジュールからの依存関係がなく、別のモジュールでライブにすることができます。_myFunctionそのため、テストと再利用が容易になり、依存関係グラフの制御に役立ちます。これは、大規模なコードベースで深刻な問題になることがよくあります。簡単に回避できる依存関係を挿入すると、依存関係グラフの問題が悪化するだけであり、そのために支払う可能性のある潜在的なメリットはほとんどありません。

実際、この種の利点を得るための優れた依存関係パターンは、モジュール間に(通常は望ましくない、望ましくない)依存関係を作成するオブジェクトを明示的に注入することです。開始については、ここを参照してください。テスト、緩い結合、再利用の狂信者として、私も依存性注入の狂信者になりつつあるので、引数として渡すことが明白な代替手段であるグローバル定数にアクセスすることを夢見ません...;- )。

于 2009-09-11T04:06:08.113 に答える
1

同じコンパイルユニットを両方のバージョンに対してリンクする場合(特にグローバルに固定されたパスの共有ライブラリとして)、または同じプロセスで複数のインスタンスを実行する場合は、2が推奨されます。そうでなければ、ソースからすべてを再構築することが障害にならない状況にある場合は、#1の方が適しています。

いくつかのものは本当にグローバルです。グローバル定数はまったく危険ではありません。

于 2009-09-11T00:59:20.090 に答える