1

私は現在、同じ変数を変更できるようにする必要がある 2 つのモジュールを呼び出すという問題に直面しています。
というグローバル変数を作成し、global.APP_NAME = {}必要な変数をそこに格納することにしました。

しかし、グローバル変数を使用するのは悪い習慣であると読んでいます。それはなぜです?

私は 1 つの変数のみを作成しています。これはアプリケーションの名前であるため、他の変数と衝突することはありません。

4

2 に答える 2

13

グローバル変数は、コードの追跡とデバッグを非常に困難にするため、ほとんどすべてのプログラミング言語でアンチパターンと見なされます。

  • コードを参照しても、どの関数がグローバル変数を設定または使用しているのかわかりません。すべての変数がローカルであるか、関数に渡される場合、関数の副作用が確実に制限されます。
  • グローバル変数は離れた場所で機能します。グローバルの値をいじると、アプリケーションのまったく別の部分で予期しない影響が生じる可能性があります。それによって引き起こされたエラーをデバッグすると、変数が間違った値に変更された場所を見つけるのに非常に苦労します。
  • グローバル変数は名前空間を共有するため、意図せずに誤って再利用する可能性があります。
  • グローバル変数がどれほど重要かを伝えるのは難しいです。2 つの関数だけで使用されているのか、それともその値があらゆる場所で重要なのかはわかりません。
  • ...その他にも多くの理由...

データを共有する 2 つのモジュールがある場合、そのデータを使用してオブジェクトを作成し、それを必要とする各関数 (および実際に必要な関数のみ) に明示的に渡す必要があります。

于 2013-09-05T11:45:47.710 に答える
2

ほとんどのコメントと他の回答から、なぜグローバルと見なされる悪い慣行があるのか​​ を読むことができます。ただし、node.js アプリは通常、「app.js」、「server.js」などの中心点から実行されます。

その場合、そのファイルの構成オプションとして、ある種の「構成」(APP_NAME.usersが必要だと言いました)を保持できます。したがって、「app.js」には次のものがあります。

var config = {
  myVar: 100
}

一部のモジュールでこの変数にアクセスする必要がある場合は、パラメーターとして渡します。すなわち。グローバルファイルでは、次のように呼び出します。

var module = require('./lib/myModule.js').init(config);

これで、モジュールの init 関数をエクスポートして、config の独自のローカル コピーを設定できるようになりました。例:

var localConfig = null;
exports.init = function(config) {
  // merge the two config objects here
  localConfig.myVar = config.myVar;
}

最後に、プライベート値を使用して、ローカル コードをグローバル オブジェクトに影響を与えることができます。モジュールで次のようなもの:

exports.modifyGlobalConfig = function() {
  global.myVar = myLocalValue;
}

グローバル app.js は、そのメソッドを使用してそのグローバル値を変更します。

于 2013-09-05T12:06:31.710 に答える