グローバル変数
(DLLのような)多くのシステムは他のモジュールにあるグローバル変数の参照を直接サポートしないため、グローバル変数が多用されているコードを分割して再利用ライブラリにすることは非常に困難である。また、グローバル変数が他のローカルまたはオブジェクトスコープ変数として代用するには危険な名前を作るために起こる名前問題を導いてしまうことがある。グローバル変数と同じ名前のローカル変数は、一般にそのローカル変数のスコープにおいてグローバル変数を隠匿する。そのため、さらにコードの理解を困難にする。グローバル変数への値の書き込みは理解と予測を難しくする副作用を生み出す。グローバル変数の利用はユニットテストを目的とするコード分割をより難しくする。それゆえ、それらは直接にコードの質の低下を助長する。
C言語およびC++の規格では、グローバル変数はプログラム開始処理以前に初期化されることが規定されているが、各々の初期化順序は規定されていない。したがって、グローバル変数の初期化順序に依存するようなコードを書いてしまうと、期待と異なる動作を引き起こすことにつながる。同様にC++の静的メンバー変数も、初期化順序は規定されていない。
JavaやC#のような後発のオブジェクト指向言語はグローバル変数を持たないが、クラスの静的フィールド(クラス変数)がグローバル変数に相当する。静的フィールドは一度だけ呼び出される静的イニシャライザまたは静的コンストラクタにより初期化処理を制御することができるが、グローバル変数と同じく非局在的な性質を内包しているため、多用するとコード品質の低下を招く。特に、再代入可能な静的フィールドを外部に公開することは避けるべきとされている。