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

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

投稿者投稿内容
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-04-16 19:37
ども、ほむらです。

グローバル変数はreadonlyでなら頻度高いかも。。。
基本的にはグローバル変数って言うのはクラスで言うところのpublic変数のような物なので
なくても何とかなることが多いです。

だからといってグローバル変数の利点は消えるわけではないでよね。
利点を生かすためなのならば使っても良いと思います。
でも、最近の環境はかなり恵まれてきているので
利点が必要になることは少ないのではないでしょうか。

便利とか。手抜きのために使うのはNGというに同意しますけど。。。
メモリ常駐、どこでもアクセスは魅力的です^^;;;;
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-04-16 21:01
一個や二個は必ずグローバル宣言してると勝手に思ってますが、どうなんでしょう。
「何が何でもローカル変数」で実装すると、引数の数がアホほど要ったり、unix で errno
が使えなくなったり、Perl で $_ $ARGV $PROGRAM_NAME が使えなくなる・・・(local宣言
もできますが、localにした試しが無い)、グローバル変数の内容が変わるのと、
ローカルのポインタ変数の番地が破壊される深刻度はそんなに大差無い、とか。

 むしろ、最近はローカル変数を気安く使ってスタックオーバーランの墓穴を掘らないように
意識をもっていくようになってます。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2004-04-16 22:07
 んじゃ、私もローカル変数で気になる点を。

 当然ですが、ローカル変数主体だと定義箇所が増えます。
 それ自体は問題でなく、多人数で開発すると以下の問題?が発生します。

 ・同じ意味合いのものが人によって違うネーミングがされることがある。
 ・同じネーミングのものが人によって違う意味合いで用いられることがある。
 ・やたらコピペで流用され、不要な定義が残る。

 結構かゆい(笑)
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-19 11:44
引用:

ラフィンさんの書き込み (2004-04-16 18:41) より:

 "先に完全制限"は何となく、はにまるさんには向いていないのでは?(想像)
 どちらかというと、雰囲気の良いチーム作りの方が向いているような(さらに想像)

 信頼して仕事を任せられる後輩をお持ちのようですので、そういう人に管理の一部を任せるなどしてなるべく多くの人で運営しているイメージを作った方がいいんじゃないですか?(これも想像)


正解です!
ただ、派遣なので実際の「後輩」はいませんが、開発プロジェクトの発足時には
何時も、「この人は優秀だな〜」と思える年下のパートナーさんが恵まれ、
その人を勝手に「後輩」に見たて、自分の持つ知識(考え)を引継いでいます。

今は、「後輩役」がいないから寂しいよ〜! (だから@ITに入浸り)

tak3
ベテラン
会議室デビュー日: 2004/04/15
投稿数: 80
お住まい・勤務地: 菜の花・銀杏
投稿日時: 2004-04-19 12:32
いままでのやりとりで既出で読み取れてなかったら、ごめんなさい。

グローバル変数は基本的に使うときに注意しろ!だと思うのですが・・・
「グローバル変数をつかうべき時、使ったほうが良い時は、いつですか?」
c9katayama
常連さん
会議室デビュー日: 2003/02/04
投稿数: 38
投稿日時: 2004-04-19 14:55
注意を払うべきスコープが少なければ少ないほど
人間はミスを犯しにくいし、影響も少ないと思います。
だからスコープの大きいグローバル変数をむやみに使っては
いけない、という事だけだと思います。
プロジェクトメンバーみんながグローバル変数のスコープまで
注意を払い続けて作業でき、かつグローバル変数の方が
プログラムを作りやすいのなら、ガンガン使うべきだと思います。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-20 13:09
引用:

tak3さんの書き込み (2004-04-19 12:32) より:
グローバル変数は基本的に使うときに注意しろ!だと思うのですが・・・
「グローバル変数をつかうべき時、使ったほうが良い時は、いつですか?」


痛い所を突きますね
ストレートで答えを出すならば、個人技術、組織技術に見合った所で使うです。

「グローバル変数を使うな!」を公約数で翻訳すれば、
「サブルーチン内でしか利用しない変数はローカル変数で定義しろ。」になると思います。
これは、初心者でも可能ですし、費用対効果も抜群ですね。

一歩踏み出し、「データの発生元と利用元が別の支流である場合」または、
「全体的に関係する変数の場合」等で、ローカル変数にするか?否か?は、
システムのアーキテクチャーにより判断が異なります。

当スレッドで、「物によりけり」的な発言になる理由は、ここにあります。

ようは、
「システムのアーキテクチャーをどうするか?」の奥先の一つに
「グローバル宣言をどうするか?」の話があると考えます。

プロジェクト内で考えた場合は、グローバル宣言は許されても、
組織技術の資産として考えた場合、グローバル宣言が許され無い事は十分にあります。

これから先の話は、「アーキテクチャー」自体の話になるので、ここで御終いにしますが、
ただ、「アーキテクチャー」を考える際にグローバル変数が持つメリット、デメリットは
基礎知識の一つになると思います。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-21 17:07
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
◆ 3つのスレッドを跨っての現時点のマトメだよ〜ん。
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

言葉じりとか勝手に変えています。
原本で「思う」と記述されている事が多いのですが、
すっきりしないので勝手に断言文にしちゃった! ><b

もしかすると原文が解らないかも!(だって、誤字脱字王だもの!)
では!では!マトメ文、はじめ! ><b

[グローバル変数が駄目な理由/問題点]

  ・管理していないとソースに秩序正が無くなる。
  ・修正の影響範囲がつかみ難くなる傾向が強く、保守時に作業効率が落ちる。
  ・全ソースコードを総当りでチェックする必要が発生する。
  ・グローバル変数を利用しているソースが、宣言しているソースに依存し再利用性を損なう。
  ・親処理、子処理で同じグローバル変数を使って障害が発生する。

[グローバル変数が良い理由]

  ・いつでもどこからでも変更・参照できる。
  ・メモリ常駐。

[グローバル変数のデメリットを緩和させる手段]

  ・グローバル変数だと一目瞭然の名前を付ける。
  ・宣言する場所を明確にする。
  ・流用させない 。
  ・変数定義書を作る。
  ・グローバル変数を構造体にまとめる。
  ・「1対N」や「階層型」のモジュール関係構造を用いる。
  ・最初にある程度洗い出しておいて「この変数はこう使ってください」と通知する。
  ・グローバル変数の管理者を決め、グローバル変数を勝手に作くらせない。

[グローバル変数を使う時]

  ・保守時に既存システムでグローバル変数を使っている箇所。
  ・プログラム構成自体が確りしておらず、グローバル変数を使わない手段を用いると。
   サブルーチンの引数が多くなる時。
  ・定数。
  ・極端に階層が深いロジックの中で最初の階層でセットして一番深い階層で使う場合。
  ・500行ぐらいの、サンプルプログラムを提供するとき。
  ・外部連携、割り込み、トレース、メッセージ等で共通的に使用したり全体通知が必要な時。
  ・実行環境が様々に変わったりするような場合。
  ・一度設定された後は、ほぼ変更されない、参照専用の値で利用する場合。
  ・どうしても逃げ道がない場合だけ利用する。
  ・グローバル変数以外の手段を用いる際に必要とする設計能力に満たない時。
  ・利点と弊害さえ理解出来ている時

[グローバル変数から一歩前進させる技術]
  ・グローバル変数そのものは隠蔽して読み取り専用のアクセサで情報を提供。
  ・モジュール変数にしてモジュール名.変数名の形式で利用。
  ・値の引渡を管理するモジュールを作成し、依存関係を無くす。

[グローバル変数を使っては駄目な箇所]
  ・変数への設定の可能性があるもの
  ・後々の変更要求に影響が出そうなもの
  ・メモリ(実行、スタック等)使用量を小さくしなければならない時。
  ・別のプロジェクトでも細かい単位(関数やクラス)で使い回しを考える時。

[その他]

  ・便利だから人間は使いやすくなるわけで、 意図的にハードルを高くして
   「二度と使うかぁ!」って気分にさせる。

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

  ・グローバル変数がもたらす問題とその裏にある要因を把握して置かなければ、
   同じ様な問題を別の箇所で引き起こす事になり、汎用的で応用性のある技術/知恵にならない。

  ・一個や二個は必ずグローバル宣言してると思う

  ・独立性をより強めたいというのは、個別処理ではなく、共通部品で求められる
   共通部品でも、共通部品同士の依存性は許されている所が多い
   開発する処理に求められる、個々の性質というのを踏まえた上で考える必要がある。

  ・構造的に美しいソースは一般的にモジュール独立性が高いもので
   モジュール独立性とは、モジュール強度とモジュール結合度からなる。
   グローバル変数を多用するとモジュール結合度が強くなり、
   モジュール同士が絡み合って複雑になる。

  ・単純にグローバル変数=絶対悪といっているひとが、無理やりなつくりで、
   独立性の乏しいソースを書いているのを今まで良く見かけた。
   結局何が本質的な問題なのかが抜けている。

  ・入社直後の勉強がてらVBを担当してもらうケースが多く、敷居をあげると
   共通部品の中まで追おうとする気持ちにブレーキをかける危険性があるため、開発初心者が
   最初に勉強する事を考え、言語仕様のベストを追求しない。

  ・グローバル変数があるから読みにくい、追いかけにくいということはまず無く
   それがある場合には、グローバル変数の決め方が悪い。

  ・ローカル変数しか使わないプログラムと言うのは普通はないはずです。
   置き場所の問題というよりも、スコープの問題に行き着く。

  ・試しに全部グローバル変数で組ませれば良い、それで解る。

  ・グローバル変数を使うかは、人間のプログラム全体を把握する能力次第

  ・「グローバル変数は使うな」が言える人はおそらくグローバル変数を上手に使える人。
   周りの無秩序な使い方にうんざりしている人。

  ・注意を払うべきスコープが少なければ少ないほど 人間はミスを犯しにくいし、影響も少ない
   だからスコープの大きいグローバル変数をむやみに使ってはいけない。

  ・グローバル変数はスコープが広い為、書き換え可能な範囲が広くなる、
   その役割に必要な最低限のスコープ設定が良い
   ユーザの権限設定同じ様に、なんでもかんでもAdministratorだったら大変。
   グローバル変数のスコープが適切であれば、登場させればよい。


いや〜、つ、疲れた。
しかしマトメる時って、やっぱり自分贔屓になりますね..

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