• 締切済み

グローバル変数のよくない使い方とその改良例

encyの回答

  • ency
  • ベストアンサー率39% (93/238)
回答No.9

ちょっと別の視点から。。。 グローバル変数を使うことが良くないといわれているのは、「その変数が一つしかないこと」が理由だと私は思っています。 つまり、変数が一つしかないことの弊害を考えれば、「なぜグローバル変数がよくないのか」がわかってくるのではないでしょうか。 たとえば、ある機能の状態をグローバル変数を使って管理していた場合、その機能は同時に一つしか動かすことができません。 その後、その機能を複数同時に動かす必要が出てきたとしても、機能の状態は一つのグローバル変数で管理している以上、対応できません。 また、上記のような対応が必要になった場合に、「それじゃあ配列にして管理しよう」となったときに、それまで参照していた箇所すべての変数を配列に置換しなければいけなくなる…といった問題もありますよね。 そしてもちろん、グローバル変数にしてしまうと、その変数をいつだれがどこで更新するかわからないので、不具合発生の要因になりやすく、またその場合の解析も面倒になる…といった問題もあります。 ただし、グローバル変数も使い方によっては非常に便利なものなのは確かだと思います。 もし、どうしてもグローバル変数を使わなければいけない状態になった場合、私は以下のようにしています。 (1) ヘッダファイルを2つ用意する。 (2) そのヘッダファイルの一方にグローバル変数をextern宣言し、もう一方には宣言しない。 (3) グローバル変数を使用しない人にはexten宣言なしのヘッダファイルをインクルードしてもらい、使用する人にはextern宣言ありのヘッダファイルをインクルードさせる。 こうすることで、ファイルをまたいだ状態でファイル内の静的変数相当のことができるようになります。 # っていうか、それなりの規模のプロジェクトで仕事をしていれば、ヘッダファイルを内部公開用と # 外部公開用の2つに分けていると思うので、そんな場合には「内部公開用」のほうに入れておけば # 外部からの不要な参照を回避できます。 # そもそも、それなりの規模のプロジェクトであれば、これくらいの情報隠蔽は当たり前のように # 行われていると思います。 オブジェクト指向言語が使えれば、必要に応じてインスタンス(オブジェクト)を複数生成することもできるし、情報の隠蔽もクラスのフィールド、メソッド単位でできるから、こんな苦労しなくても良いんだけどなぁ。。。 # いや、いろいろな制約から、C しか使えないプロジェクトにいるものでして。。。 このように、実装の仕方でグローバル変数の公開範囲を限定することも可能ですので、「悪いものは何が何でも使うな!」という話ではなく、メリットとデメリットをよく考えて柔軟に対応することも大事だと思います。

関連するQ&A

  • ライブラリ作成時のグローバル変数の対応(C言語)

    C言語を用いてライブラリを作成しています。 ライブラリは機能ごとにファイルを分けています。 今、ライブラリの中でのみ使用するグローバル変数やグローバル関数が必要になりました。 このグローバル変数や関数は複数ファイルで参照するため、static宣言はできません。 しかし、このグローバル変数や関数は公開する必要はありません(ライブラリの中でのみ使用します)。 このようなことをC言語で実現するためにはどうしたらよいのでしょうか? 開発環境は Windows7 VisualC++2010 です。 VisualC++2010を使うなら C++で書けばいいのではないかといわれそうですが、 C言語でプログラミングしたいのです。 以下のようなサイトがあったのですが、これを使うしかないでしょうか? http://0xcc.net/blog/archives/000108.html

  • インスタンス変数とローカル変数のスコープの違い

    Ruby言語を独学で勉強している者です。 現在たのしいRuby第3版という著書を参考にして勉強しています。 現在はクラスの継承、クラス文の定義の仕方を学んでいます。 そこで教えて欲しいのですが、 ローカル変数とはメソッドごとに異なる変数として扱われる。 インスタンス変数は同じインスタンスの中であればメソッドの定義を越えて その値を参照したり変更したりできるとあります。 そもそもインスタンスとは、オブジェクトとおほ同意義と捉えてるのですが この認識に間違いはないでしょうか。 ニュアンス的なものは理解したのですが、もう少しこの二つの変数の定義について 理屈を把握したいので、お手すきなお方がいらっしゃいましたら、具体的な例をあげて ご説明くださいませんか・・・。 この本すごく素人にもわかりやすい丁寧な解説で書いてあって、決して説明不足とは 思わないのですが、プログラマーさんの意見なども参考にしたくて投稿してみました。

    • ベストアンサー
    • Ruby
  • 関数の最初の変数有効期限について

    最近C言語を勉強しているのですが変数の有効範囲について教えてください。 ローカルやグローバル変数があるのが分かって関数内の変数も関数内でのみ有効というのも理解したのですが int a( int b ); という関数の最初に書く括弧の中のbと宣言している変数も関数内に含まれているという事で良いのでしょうか?。

  • 関数と変数と定数と式をまとめて [C言語]

    はじめまして。私はC言語初心者です。 C言語では、関数の引数や変数への代入や配列の添え字などに、変数や定数や、式や関数の値を利用できるじゃないですか。私は今C言語について勉強したことをファイルにまとめていっているのですが、上記のようなことを説明するたびに「関数と変数と定数と式」と書くと長ったらしくなってしまいます。そこで、これらをまとめていう言葉があったら教えて欲しいのです。 回答よろしくお願いします。

  • 変数のスコープはどうするのがベター?

    C言語で組み込みプログラミングしています。 頻繁に呼び出される関数があり、その中でのみ使用する大きめの構造体があり、 この構造体の実体をグローバル変数として生成しておくか、関数が呼び出される度に 生成するかで、どちらが良いのかが知りたいです。 条件として、 変数は1つ実体があればOKです。(なのでグローバルでもローカルでもどちらでも使用上問題なし) 高級言語(Java、C#など)では関数内で生成するようにしてカプセル化を図るのが良いと思いますが、 組み込みでは 1)生成コストがあるのでグローバルで一度生成しておくのが一般的 2)カプセル化できるように関数内で、関数が呼ばれる度に生成するのが一般的 3)関数内でstaticで生成しておくのが、生成コストかからず、一般的 など、こうするのがスタンダード、という方法があればお教え下さい。 ケースバイケースの場合は、どういう場合はどうするのがよいかをお教え下さい。 よろしくお願いします。

  • マルチスレッドと変数

    マルチスレッドのプログラムを組んでいます。 そこで、複数のスレッドからアクセスする変数があるのですが、これの扱いについて解らないことがあります。 ・変数を複数のスレッドから書き換える場合は、予想していた結果と違うことになる。 ここまではいいのですが、 ・変数を複数のスレッドから、参照だけするのは問題ない。 ・変数を複数のスレッドから、参照し、書き換えるのはひとつのスレッドだけならば、問題はない。 (上の"変数"は全て、Lockをかけていない状態です。) という認識をもっているのですが、これは間違いなのでしょうか? 「参照だけならばLockはかけなくてよい」というのをどこかで読んだような覚えがあり、そのまま勝手に最後の推測をしています。 現状ではうまくいっているようなのですが、とても不安です。 もしくは、状況、環境、コーディングによって上の仮定は成立したり、成立しなかったりするのでしょうか?環境はC#ですが、もしどのような言語、環境であっても一般的に、同じような結果になるのなら、それも合わせてご教授お願いします。

  • 変数はグローバルなんですか?

    初心者です。 関数sub xxx{  $abc=10; } 関数sub yyy{  $def=$abc } というように、関数xxxで宣言した変数もPerlでは 関数yyy内で参照できるのでしょうか。つまり、同じ ファイルにあれば関数内で宣言してもグローバル 変数として使用されるのでしょうか。 (my変数は除きます)

    • ベストアンサー
    • Perl
  • 参照型変数へのポインタに関してです。

    参照型変数へのポインタに関してです。 たとえば int _v[10]; int &v = &_v[0]; int *pv; pv = &v;  // 参照型変数のアドレスをポインタに代入 こうすると、pv[n]と、_v[n]は同値になります。(VC++とG++では確認) これ(この使い方)で同値なのは ・c++の言語仕様 ・コンパイラの実装依存 のどちらでしょうか? WEBを漁ると「参照型変数はエイリアス(別名)」とかかれているページがヒットするので、C++の言語仕様かなと思っています。 #もちろん配列に置き換えずに単純な参照型変数として使った場合の、値の同一性は言語仕様でしょうが。

  • 変数・関数 メモリの関係 本の紹介お願いします

    こんにちは。C言語を勉強しています。文法はある程度理解できました。 そこで疑念がわいてきたのですが、プログラムはメモリ上にロードされてCPUがそれを処理すると思いますが、メモリ上では変数や関数はどのように扱われているか? その辺がモヤモヤしていてはっきり勉強したいと思います。どこから勉強していいのかわからず、良い本がありましたらご紹介頂けませんでしょうか?宜しくお願いします。

  • MQL4の変数について質問です。

    タイトルの通りです。 まだ学習を初めて1週間程度の素人です。 今のところ理解したところは、仕組みとしてはC言語に近いようで、 オブジェクトを生成しない、関数を呼び出すタイプのプログラミング言語というところ。 インジケータは標準ライブラリや外部ファイルを読み込んで作成する。 ティックに変化が出たら都度OnCalculate()が呼び出される。 というくらいです。 私自身、C言語やPHP、JAVAなどは大学や自学、仕事で勉強をしたので プログラムの基本的なことはある程度理解できていると思います。 とりあえず最終的にEAの構築までできたらと考えていますが、 まずはMQL4言語というプログラムの挙動について質問させてください。 まず配列について配列変数を定義したときの初期値は何でしょうか? また、初期値を判別する、もしくは初期値か代入値かを判別するような関数があれば教えてください。 特に参考書を買ったりはしていないのでド素人の質問とは思いますがよろしくお願いします。