さて、これは本当に悪魔の擁護者の質問です。
グローバル変数はいつ大丈夫ですか、もしそうでなければ、代替として何を使用しますか?
この質問に対する興味深いサイドケース、パブリック静的クラスフィールドはグローバルとどう違うのですか?
さて、これは本当に悪魔の擁護者の質問です。
グローバル変数はいつ大丈夫ですか、もしそうでなければ、代替として何を使用しますか?
この質問に対する興味深いサイドケース、パブリック静的クラスフィールドはグローバルとどう違うのですか?
回答:
私の知る限り、パブリック静的フィールドは、名前空間を詰まらせないことを除いてどこからでも呼び出すことができることを考えると、基本的にグローバルです。
コードで個人的に「グローバル」変数を使用するのは、不変のパブリックスタティックフィールドの形式のみです。この場合、プログラムの他の部分によって値がめちゃくちゃになるのを心配する必要はありません。もちろん、各クラスで同じ永続的な値を持つ12個の変数を持つよりもはるかに優れています。
個人的に、私はランタイム構成にグローバルを使用します-アプリケーションの起動時に構成プロパティがロードされ、まれに(そして1箇所からのみ)変更される場合、使用する必要があるすべてのメソッドにそれを渡すのはひどくエラーが発生しやすいですある時点でそれ。メソッドシグネチャや呼び出しサイトを混乱させたり、隠したりしないため、使用する必要のある場所からスコープ内に持ち込むことができるものを使用することをお勧めします。
CONFIG_
またはCFG_
接頭辞付きの単純なグローバル変数のいずれか。
リアルタイム/組み込みシステムを除き、実際には定数値にのみグローバルを使用する必要があります。それらなしでは問題を解決できないと感じるなら、おそらく何か間違ったことをしているのでしょう。
また、Singletonパターンを調べてください。グローバルアクセスポイントが必要な場合に、このような状況でグローバルに適したソリューションを提供できます。
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
は、「この特定のループ」が現れる1つのファイル/クラス/セクションにのみ関連します。
グローバル変数の問題は、コード内のあらゆる場所でそれらを認識する必要があることです。ただし、特定のグローバルについて知る必要があると判断した後は、それを多用することでそれ以上の損失はほとんどありません。したがって、私の意見では、グローバル変数はごくわずかである必要がありますが、ごく少数のグローバル変数を最大限に活用する必要があります。
このように感じる別の例として、Rubyでのミックスインの使用を見てください。
名前空間がすべてです。
世界の誰もが同じ姓を持っているとちょっと想像してみてください。なんて混乱。
(インドでは、シーク教徒は同じ姓を持っています:シン-見てください)
ショートバージョン:プログラムについて推論するのが簡単になるとき。通常、ケースは、広く使用されている何らかのグローバルステートまたは静的リソースです。
ロングバージョン:トム・ホーティンは「遠くで不気味なアクションで」と言いました...それはまさにグローバルの問題です-それが使用されている場所と方法を知る必要があります、またはあなたはいくつかの本当に奇妙で追跡するのが難しいことがありますバグ。ローカルとは、プログラマーがプログラムについて推論するために理解する必要があるものの範囲を縮小する戦略にほかなりません。
それらが使用されている場所を知ることの問題のもう1つの側面は、重複したグローバルになる可能性があることです。その場合、ほとんどのプログラムはvar2を保持するために使用されている間にvar1を取得して設定するため、物事は本当に奇妙になる可能性があります同じ情報。特に、複数の人が同じコードで作業している場合。IDEは、使用法を見つけてグローバルのコストを削減するのに役立ちますが、重複に対しては何も行いません。
グローバルが多ければ多いほど、それらで起こっていることを追跡するのが難しくなります。それらは数が少なく、はるかに少ないはずです。
グローバルとシングルトンの2つの落とし穴は、テスト容易性と展開可能性です。
テストについては、不十分に計画されたグローバルおよびシングルトンのライフタイムに対処するためだけに、過度に複雑なテストハーネスを見てきました。そのようなオブジェクトには、明確で単純な起動および破棄ルールがあることを確認してください。
デプロイ可能性に関しては、考慮すべき2つのケースがあります。まず、グローバルオブジェクトはどのように存続しますか?静的または動的ライブラリにありますか?そのグローバルオブジェクトがプラグインに再利用される場合、追加のコピーを取得しますか?次に、そのグローバルオブジェクトが並列アプリケーションにドロップされるとどうなりますか?スレッドセーフですか?
全体として、これらの理由は、グローバルとシングルトンが例外的にのみ使用されることを意味すると考えています。