大域変数(グローバル変数)は、プログラムの開始時から終了時までずっとメモリ上に存在し続け、プログラムを構成するすべての関数やファイルから自由に読み書き(参照と代入)ができるという強力な特性を持った変数です。これは、システム全体で共有すべき設定情報(データベースへの接続情報や、環境設定パラメータなど)を保持するためには非常に便利で手軽な方法です。
しかし、現代のソフトウェア開発においては、「大域変数の使用は極力避けるべき(あるいは禁止するべき)」というのが共通のベストプラクティスとなっています。その最大の理由は、プログラムの「保守性」と「安全性の低下」です。
プログラムが大規模になり、数百、数千の関数が存在するようになると、ある大域変数の値が「いつ、どこで、どの関数によって書き換えられたのか」を追跡することが極めて困難になります。例えば、ある関数Aが計算のために大域変数の値を期待して処理を行っている途中で、全く無関係に見える関数Bが誤ってその大域変数を書き換えてしまった場合、関数Aは原因不明のバグを引き起こします。これを「副作用」と呼びます。開発チームの別の人が書いたコードによって、自分の書いたコードが予期せず壊れてしまうリスクが常に付きまといます。
また、大域変数に依存している関数は、その大域変数が存在しない別のプログラムにコピーして再利用(部品化)することが難しくなります。そのため、データを関数に渡したい場合は、大域変数を使うのではなく、関数の「引数(ひきすう)」として明示的にデータを渡し、処理結果を「戻り値」として受け取るという設計(局所変数と引数を用いた設計)にすることが、バグの少ない堅牢なプログラムを作るための基本原則となっています。