グローバル変数
出典: フリー百科事典『ウィキペディア(Wikipedia)』
グローバル変数(大域変数、global variable)は、コンピュータプログラミングにおいて全てのスコープからアクセスできる変数のことである。対する語は、ローカル変数である。スコープも参照。
グローバル変数は、通常その非局在性によりはっきりと悪しき慣習と考えられている。すなわち、グローバル変数は潜在的にどこかで変更される可能性があり、またプログラムの一部はそれに依存してしまう恐れがあるからである。グローバル変数はそれゆえ相互依存を生み出す無限の可能性を持っており、相互依存が高めることは複雑性を増大することにつながる。遠隔作用 (Action at a distance) を参照。
しかしグローバル変数が適する状況もある。例えば、様々な関数を通して継続的によく使われる変数を引数として渡すことを避けるために使用できる。また、並列実行するスレッドやシグナルハンドラのように呼び出し側/被呼び出し側の関係を持たないコード同士でセクション間情報を受け渡すためにも広く使われる。
各々のファイルが暗黙の名前空間をもつ言語は、グローバルな名前空間を共用する言語に見られる問題の多くを、適切なカプセル化をすること無しに永遠に除去することができる。(ミューテックスのような)適切なロック無しに、グローバル変数を使用しているコードはスレッドセーフではない。
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)