グローバル変数
出典: フリー百科事典『ウィキペディア(Wikipedia)』
コンピュータプログラミングにおいてグローバル変数(global variable)は全てのスコープからアクセスできる変数のことである。対する語は、ローカル変数である。スコープも参照。
グローバル変数は通常、その非局在性によりはっきりと悪しき慣習と考えられている。すなわち、グローバル変数は潜在的に何かに変更される可能性があり、プログラムの一部はそれに依存してしまう恐れがあるからである。グローバル変数はそれゆえ相互依存を生み出す無限の可能性を持っており、相互依存が高めることが複雑性を増大することにつながる。遠隔作用(Action at a distance)を参照。しかし少数の例では適した使用法がある。例えば、それらは様々な関数を通して継続的によく使われる変数を渡すことを避けるために使うこともできる。
グローバル変数は並列ハンドラとシングルスレッドのような呼び出し側/被呼び出し側の関係をシェアしないコードのセクション間情報を渡すために広くに使われる。
各々のファイルが暗黙の名前空間をもつ言語は、グローバルな名前空間を共用する言語に見られる問題の多くを、適切なカプセル化をすること無しに永遠に除去することができる。 (Mutexのような)適切なロック無しに、グローバル変数を使用しているコードはスレッドセーフではない。
C++におけるグローバル変数の例:
#include <iostream> int global(3); //これはグローバル変数。 void ChangeGlobal() { global = 5; //関数でグローバル変数を参照。 } int main() { cout << global << endl; //もう一つの関数でグローバル変数を参照。 ChangeGlobal(); cout << global << endl; return 0; }
変数はグローバルに存在するものとして、main以外の全ての関数にそれを引数として渡す必要は無かった。フローバル変数はプログラム内で、全ての関数に属する:
3 5
グローバル変数の使用は、ソフトウエアを読み理解することを難しくさせる。プログラムにあるいくらかのコードがあるとき変数の値を変えることができたとき、変数の使用を理解することは、プログラムの大部分の理解を必要とするだろう。
(DLLのような)多くのシステムは他のモジュールにあるグローバル編集の閲覧を直接サポートしないため、それらが分割されたコードを再利用ライブラリにすることは非常に難しい。これらはグローバル変数が他のローカルまたはオブジェクトスコープ変数として代用するには危険な名前を作るためおこる名前問題を導いてしまうことがある。同じ名前のローカル変数はアクセスからグローバル変数を保護でき、さらにコードを理解することを困難にする。グローバル変数のセッティングは理解と予測を難しくする副作用を生み出す。グローバルなどの利用はユニットテストを目的とするコード分割をより難しくする。それゆえ、それらは直接にコードの質の低下を助長する。
[編集] 関連項目
William Wulf and Mary Shaw “Global Variable Considered Harmful” (ACM SIGPLAN Notices, 8, 2, pp. 23-34)
- 変数 (プログラミング)
- 静的変数
- クラス変数