@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

なぜ「グローバル変数」を使っては、いけないのですか?

投稿者投稿内容
はゆる
ぬし
会議室デビュー日: 2004/02/16
投稿数: 1008
お住まい・勤務地: 首都圏をウロウロと
投稿日時: 2004-04-15 17:13
こんにちは〜。

引用:

m.kuさんの書き込み (2004-04-15 16:59) より:

元に戻すということなので元に戻して、

> なぜ「グローバル変数」を使っては、いけないのですか?

個人的には「試しに全部グローバル変数で組んでみたら?」ですね。
ローカル変数禁止にして。
長いプログラムを書くにつれ、使い分けの必要性を実感できると思います。
その後で、グローバル変数について従来から言われていることを読めば
更に理解が深まると思います。

#ただし業務で試すのはご法度。これは勉強なんだから。



あっはっは!
C やら VB やら Java やらをやったあとで、いきなり COBOL をやらされた私には、かなりウケる手法です(激痛)。

 ・ スコープがない
 ・ ”関数” がない
 ・ …

こういう状況でプログラミングすると、新しく出てきた言語のありがたみがよく分かりますね。(^^;
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-15 18:08
 初めて触れたプログラミング言語がシャープの8ビットパソコン MZ-700 の Hu-BASIC
で好きな言語は GNU Common LISP です。別に、全てのソースをグローバル変数で書いても違和感
ありません。これは、嘘やハッタリの類ではありません。インタープリタとコンパイラでそこまで違い
があるのかどうかはわかりません。
しかし、Common LISP に初めて触れたのが NEC-PC9801 の 5inch FD で動く Emacs モドキ
の Gmacs というエディタを備えた Golden Common LISP で、この GC-LISP はガベッジコレ
クションを勝手にやってくれました。物理メモリ 640K のうち、何キロバイトがheapに割り当て
られていたか、知る由もありません。

 しかし、全ての変数がどこからでも参照できる、これらの言語が非合理的存在で、絶滅して
しまったかというと、絶滅しませんねー。PHPも、register_globals = On で、どっからでも
参照できてしまいますね。PHP はむしろ勢力拡大傾向にあるんじゃないかと。

後、話は逸れますが、よっぽど Perl が嫌いなのか、無知なのか、 Perl とオブジェクト指向を
切り離した見方をしようとする人が結構いる様ですが、Perl こそ、真っ先にオブジェクト指向の
考え方を取り入れた言語ではないでしょうか? ま、Java で言う import は package に置き
変わる訳ですが・・・現在のバージョンでは my 付き変数でローカル宣言できるみたいですが、
(とは言うものの、Perl6 での大幅改造後の Perl は全く判りませんが)
一昔前の CGI で使われてるような世代では、ばんばんグローバル変数使ってましたね。

だからと言って、特別な苦労はしませんでした。
がうしぇ
大ベテラン
会議室デビュー日: 2002/02/26
投稿数: 110
お住まい・勤務地: 住:神社の裏山 勤:天神さんの裏手
投稿日時: 2004-04-15 18:18
どこまでグローバル変数を使うかは、人間のプログラム全体を把握する能力次第だと思います。

ある意味、「ネ申」度を測る尺度になるのではないかと......(ウソ度100%
_________________
がうしぇ
人生のデザインパターン....
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-04-16 09:30
引用:

がうしぇさんの書き込み (2004-04-15 18:18) より:
どこまでグローバル変数を使うかは、人間のプログラム全体を把握する能力次第だと思います。

ある意味、「ネ申」度を測る尺度になるのではないかと......(ウソ度100%


なるほど…。でも個人の神度ならまだしも、組織の神度となるともはや絶望的では…
そういう意味では、やはり使わないに越したことはないのではないでしょうか?
がうしぇ
大ベテラン
会議室デビュー日: 2002/02/26
投稿数: 110
お住まい・勤務地: 住:神社の裏山 勤:天神さんの裏手
投稿日時: 2004-04-16 09:45
引用:

Wataさんの書き込み (2004-04-16 09:30) より:

なるほど…。でも個人の神度ならまだしも、組織の神度となるともはや絶望的では…
そういう意味では、やはり使わないに越したことはないのではないでしょうか?


僕も実際は個人で神度を極めたいなら別ですが、チームでまとまったシステムを組むなら
絶対にグローバル変数は使いません。

関係ない話ですが、4004を回路設計した嶋さんが、マスクを描くとき頭の中にマスクを覚えこんでいて
休みの日には頭の中のマスクが消えないように大変苦労したと言うことを言われていたと思います。
まさにネ申!!
_________________
がうしぇ
人生のデザインパターン....
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-16 11:34
体調が戻ってきた、はにまるです。

ちょっと...投稿数にびっくりです。
2つ目の投稿見ると解りますが、当スレッドは3番煎じです。
投稿数が少ないと思い、過去2つのスレッドをマトメを記述し、ボリュームをつけ様と
思いましたが、これだけ投稿数があるので、やめます。(いい加減なヤツ!

1つ目の投稿が説明不足でしたので補足すると

 私が知る限り、開発現場のプログラム記述基準書に「グローバル変数を使うな」と同様の
 台詞は何時も存在しています。
 そして、タイトルの何故「グローバル変数」を使っては行けないのですか?
 安易に「そう言うものだ」と考え記述した人、従う人への問題定義の言葉です。

何故「グローバル変数」を使っては行けないのですか?
と問われた場合、私は考えは、


<初心者に対して>

 大きなプログラムでは変数が膨大になり、変数が何処で使われているか全て把握出来ず
 その結果、思わぬ障害が発生する

 これを回避する為には、沢山ある変数を整理するが、
 単純に整理するのでは無く、使う場所で利用するだけの変数を定義する事により
 変数が整理され、また処理と変数が1体化して理解し易くなる。

 また、変数を処理内部で定義するから、処理に変数を渡す為にI/Oが定義され、
 より解り易いプログラミング構成になる。ただし、処理の構造や言語仕様によっては、
 渡す引数が膨大な数になり逆に見難い事になる場合もあるから要注意。

 つまり、「グローバル変数を使うな」では無く、
 人が管理し易いようにローカル変数を極力利用する様にしましょうと言う事。

# あとは、、、「処理の構造」や「引数の渡し方」云々を関連知識として教えるかな


<中級者に対して>

 全体の制御(特に画面情報の引渡)では、グローバル変数を利用している事が多い。

 これは、画面間で情報を引渡す行為は、制御よりな話になり、
 実際に依存性の排除や再利用性を考慮するには高い技術能力が必要になる為、
 グローバル変数で回避している。

 ただ、画面間の情報をグローバル変数で引渡すのは、画面遷移が単純な場合の時のみ
 有効である事を認識しないといけない。
 グローバル変数は、その利便性の反面、制御が複雑化し易く、考慮の抜け落ちが多発し
 「制御の複雑性」を原因とした意図しない障害を誘発するからだ。

 これを回避するには、画面遷移や画面情報の受け渡しを管理する上位モジュールを構成して
 それを経由する様にすれば、「制御の複雑性」が隠蔽化され綺麗にまとまり、
 意図しない障害が減る。

 また、
 依存性や隠蔽化の問題に関しては、グローバル変数のみならず、グローバル定義の定数、関数も
 同様の問題を起し、考え方によってはモジュール定義も同様になる。
 ただし、完全にこれを排除する事は不可能(と思っている)である為
 VBではソースの再利用をモジュール単位で行う事を考慮して

 依存性の問題は、1対Nのモジュール関係や
 階層型(基本モジュール→共通モジュール→個別モジュール)のモジュール関係構造を用い、
 隠蔽性の問題は、モジュールを1機能群として構成すると良い。
 勿論、依存性や隠蔽化をサブルーチン単位で行える場合は考慮する事。

 つまり、「グローバル変数を使うな」では無く、
 グローバル変数が使われている箇所は、構成レベルが低い事を示す指標と捉え、
 社内、社外から高い要求を受けた場合の改善箇所と考えれば良い。


<上級者に対して>

 グローバル変数の問題は、管理の問題と一緒である。
 複雑で大きな話(問題)も、分解して構造化すれば状態が理解し易くなる。

 この際、制約の無い物(グローバル定義)は極力排除し管理可能な状態にする事により
 全体として解り易すくなるが、これは同時に管理能力が必要とされる。
 (グローバル変数の問題解決には設計能力を必要とされる)

 管理/設計レベルが低い時や、管理/設計能力の重要性を認識させず対策を取らないうちに
 制約(グローバル定義一切不可)だけを設ける行為は問題がある。

 話は変り、グローバル変数で起きている問題は、システム全体でも見うけれる。
 膨大なDBテーブル構成を持つシステムにてテーブルの更新タイミング、
 参照箇所が管理出来ない状態がそれだ、
 これは、グローバル変数の問題解決で用いられた手段を摘要すればかなり緩和される。
 膨大な関数群による問題もしかり。

 つまり、「グローバル変数を使うな」では無く、
 グローバル変数がもたらす問題とその裏にある要因を把握して置かなければ、
 同じ様な問題を別の箇所で引き起こす事になり、汎用的で応用性のある技術/知恵にならない。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-16 11:51
 構造体にも、ユーザー定義型、Turbo Pascal で言う Record 型として、変数が付きますが、
これ、ローカル変数として宣言すると大変な事になります。あくまで、私の経験でしかない訳ですが。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-16 12:31
引用:

コブラさんの書き込み (2004-04-16 11:51) より:
 構造体にも、ユーザー定義型、Turbo Pascal で言う Record 型として、変数が付きますが、
これ、ローカル変数として宣言すると大変な事になります。あくまで、私の経験でしかない訳ですが。


前投稿で偉そうな事を言っていますが、実例で上げた問題(画面遷移の制御や膨大なDB)は、
私の実体験ですし、モジュールは依存しまくりです。(爆

私は、構造体の定義はグローバル、変数化の時にローカル定義の手法が多いです。

スキルアップ/キャリアアップ(JOB@IT)