3

より多くのセキュリティを必要とする巨大なプロジェクト(DRYではないものを読んだ場合)でグローバル変数を使用するのは良い習慣ですか?そうでない場合は、その理由を説明してください?よろしくお願いします

4

1 に答える 1

4

グローバル変数が使用される場所に関係なく、それらは一般的に悪いです。

不必要なときにグローバル変数を避けるべき理由

  • 非局所性-個々の要素の範囲が制限されている場合、ソースコードを理解するのが最も簡単です。グローバル変数はプログラムのどの部分でも読み取ったり変更したりできるため、考えられるすべての使用法を覚えたり推論したりするのは困難です。
  • アクセス制御または制約チェックなし-グローバル変数は、プログラムの任意の部分で取得または設定でき、その使用に関するルールは簡単に破られたり、忘れられたりする可能性があります。(言い換えると、get / setアクセサーは一般に直接データアクセスよりも好ましく、これはグローバルデータの場合はさらにそうです。)ひいては、アクセス制御の欠如は、信頼できないコードを実行したい状況でのセキュリティの達成を大きく妨げます。 (サードパーティのプラグインの操作など)。
  • 暗黙的な結合-多くのグローバル変数を持つプログラムは、多くの場合、それらの変数のいくつかの間で緊密な結合を持ち、変数と関数の間で結合します。結合されたアイテムをまとまりのあるユニットにグループ化すると、通常、より良いプログラムにつながります。
  • 並行性の問題-グローバルが複数の実行スレッドによってアクセスできる場合、同期が必要です(そしてあまりにもしばしば無視されます)。モジュールをグローバルと動的にリンクする場合、数十の異なるコンテキストでテストされた2つの独立したモジュールが安全であったとしても、構成されたシステムはスレッドセーフではない可能性があります。
  • 名前空間の汚染-グローバルな名前はどこでも利用できます。ローカルを使用していると思われる場合(スペルミスまたはローカルの宣言を忘れた場合)、またはその逆の場合、無意識のうちにグローバルを使用してしまう可能性があります。また、同じグローバル変数名を持つモジュールをリンクする必要がある場合、運が良ければリンクエラーが発生します。運が悪ければ、リンカは同じ名前のすべての使用を同じオブジェクトとして扱うだけです。
  • メモリ割り当ての問題-一部の環境には、グローバルの割り当てをトリッキーにするメモリ割り当てスキームがあります。これは、「コンストラクター」に割り当て以外の副作用がある言語に特に当てはまります(その場合、2つのグローバルが相互に依存しているという危険な状況を表現できるため)。また、モジュールを動的にリンクする場合、異なるライブラリに独自のグローバルインスタンスがあるかどうか、またはグローバルが共有されているかどうかが不明確になる可能性があります。
  • テストと制限-グローバルを利用するソースは、実行の間に「クリーンな」環境を簡単にセットアップできないため、テストがやや困難です。より一般的には、そのソースに明示的に提供されていないあらゆる種類のグローバルサービス(ファイルやデータベースの読み取りと書き込みなど)を利用するソースは、同じ理由でテストが困難です。通信システムの場合、システムの不変条件をテストするには、システムの複数の「コピー」を同時に実行する必要があります。これは、テストの一部として共有するために提供されていない共有サービス(グローバルメモリを含む)の使用によって大幅に妨げられます。 。
于 2012-09-11T10:54:50.633 に答える