グローバル変数を使ってはいけない理由
グローバル変数とは
コンピュータのプログラムにおける変数の一。
プログラム全体にわたって定義され、プログラムの全ての部分(ブロック)に対し有効なもの。大域変数。 大規模開発ではもの凄く嫌われている。
グローバル変数は、不便な点も多いが、どうしてもグローバル変数でないとできない処理があったり、互換性の確保のため、仕様として残されていることが多い。
グローバル変数のメリット
いつでもどこからでも変更・参照できる。
メモリ常駐。(生成、消去の処理のオーバーヘッドがない)
グローバル変数のデメリット
管理していないとソースに秩序が無くなる。
修正の影響範囲がつかみ難くなる傾向が強く、保守時に作業効率が落ちる。
全ソースコードを総当りでチェックする必要が発生する。
グローバル変数を利用しているソースが、宣言しているソースに依存し再利用性を損なう。
親処理、子処理で同じグローバル変数を使って障害が発生する。
スレッドセーフでない。
グローバル変数のデメリットを緩和させる手段
グローバル変数だと一目瞭然の名前を付ける。
宣言する場所を明確にする。
流用させない 。
変数定義書を作る。
グローバル変数を構造体やクラスにまとめる。
「1対N」や「階層型」のモジュール関係構造を用いる。
最初にある程度洗い出しておいて「この変数はこう使ってください」と通知する。
グローバル変数の管理者を決め、グローバル変数を勝手に作くらせない。
グローバル変数を使う時、気をつけること
保守時に既存システムでグローバル変数を使っている箇所。
プログラム構成自体が確りしておらず、グローバル変数を使わない手段を用いるとサブルーチンの引数が多くなる時。
定数。
極端に階層が深いロジックの中で最初の階層でセットして一番深い階層で使う場合。
500行ぐらいの、サンプルプログラムを提供するとき。
外部連携、割り込み、トレース、メッセージ等で共通的に使用したり全体通知が必要な時。
実行環境が様々に変わったりするような場合。
一度設定された後は、ほぼ変更されない、参照専用の値で利用する場合。
どうしても逃げ道がない場合だけ利用する。
グローバル変数以外の手段を用いる際に必要とする設計能力に満たない時。
グローバル変数から一歩前進させる技術
グローバル変数そのものは隠蔽して読み取り専用のアクセサで情報を提供。
モジュール変数にしてモジュール名.変数名の形式で利用。
値の引渡を管理するモジュールを作成し、依存関係を無くす。
グローバル変数を使っては駄目な箇所
変数への設定の可能性があるもの
後々の変更要求に影響が出そうなもの
メモリ(実行、スタック等)使用量を小さくしなければならない時。
別のプロジェクトでも細かい単位(関数やクラス)で使い回しを考える時。
その他
便利だから人間は使いやすくなるわけで、 意図的にハードルを高くして 「二度と使うかぁ!」って気分にさせる。
「グローバル変数を使うな」では無く、グローバル変数が使われている箇所は、 構成レベルが低い事を示す指標と捉え、社内、社外から 高い要求を受けた場合の改善箇所と考える。
グローバル変数がもたらす問題とその裏にある要因を把握して置かなければ、 同じ様な問題を別の箇所で引き起こす事になり、汎用的で応用性のある技術/知恵にならない。
一個や二個は必ずグローバル宣言してると思う
独立性をより強めたいというのは、個別処理ではなく、共通部品で求められる。共通部品でも、共通部品同士の依存性は許されている所が多い。開発する処理に求められる、個々の性質というのを踏まえた上で考える必要がある。 構造的に美しいソースは一般的にモジュール独立性が高いもので モジュール独立性とは、モジュール強度とモジュール結合度からなる。 グローバル変数を多用するとモジュール結合度が強くなり、 モジュール同士が絡み合って複雑になる。
単純にグローバル変数=絶対悪といっているひとが、無理やりなつくりで、独立性の乏しいソースを書いているのを今まで良く見かけた。 結局何が本質的な問題なのかが抜けている。
入社直後の勉強がてらVBを担当してもらうケースが多く、敷居をあげると 共通部品の中まで追おうとする気持ちにブレーキをかける危険性があるため、開発初心者が最初に勉強する事を考え、言語仕様のベストを追求しない。
グローバル変数があるから読みにくい、追いかけにくいということはまず無く それがある場合には、グローバル変数の決め方が悪い。 ローカル変数しか使わないプログラムと言うのは普通はないはずです。 置き場所の問題というよりも、スコープの問題に行き着く。 試しに全部グローバル変数で組ませれば良い、それで解る。
グローバル変数を使うかは、人間のプログラム全体を把握する能力次第
「グローバル変数は使うな」が言える人はおそらくグローバル変数を上手に使える人。 周りの無秩序な使い方にうんざりしている人。
注意を払うべきスコープが少なければ少ないほど 人間はミスを犯しにくいし、影響も少ない。 だからスコープの大きいグローバル変数をむやみに使ってはいけない。
グローバル変数はスコープが広い為、書き換え可能な範囲が広くなる、 その役割に必要な最低限のスコープ設定が良い ユーザの権限設定同じ様に、なんでもかんでもAdministratorだったら大変。 グローバル変数のスコープが適切であれば、登場させればよい。