プロが教えるわが家の防犯対策術!

学生時代にプログラミングを習ったときには、
グローバル変数は悪のものであると習いました。

しかし、プログラマーに就職してみると、
テーブルというなのグローバル変数がいたるところで
使われています。

グローバル変数を使用しないようなソースに
することはできるのでしょうか?

また、テーブルというのは一般的によく使われるもの
なのでしょうか?検索してもそれらしいサイトが
見当たらないですし、Cの参考書を見ても、そのような
ものは出てきません。

A 回答 (4件)

組み込み系などでメモリサイズに制限がある場合に、


共用体と構造体を使ってグローバル変数にデータを入れる。
とかいうことをする場合があります。
# というか、今関わっているものがそういう使い方しています。

グローバルな上に共用体ですので、うっかり書き換えないように注意が必要です。
    • good
    • 0
この回答へのお礼

そのような目的で使用される場合もあるんですね
ご回答ありがとうございます。

お礼日時:2010/01/30 11:16

グローバル変数がよくないと言われるのは、予想外の値が設定されたときに、誰がどこで(どの関数が)その値を設定したのか追いかけるのが大変だからというのが主な理由です。



ですから、まず、「誰も書き込みをしない(参照するだけ)」のグローバル変数は、#define で定義した定数と同じですから、危険性はありません。

普通に言う「テーブル」は、読み込みのみの用途であることが多いので、大丈夫なことが多いですが。

ただ、「誰も書き込みをしないはず」のところに、書き込みされてしまうのが、バグというものですから、const を指定して、「書き込みできないのを保証する」というのは、良い方法です。

グローバル変数の危険性を回避するためには、書き込み時のチェックを行うという方針になります。

テーブル自体を、どこかの関数のローカル変数として定義し、このポインタを「必要とする」関数に対して、引数として渡すことで、見かけ上グローバル変数をなくすことができます。
ただ、これも、このままでは、「引数として渡した関数のどこで(間違って)書き込んだのか」という点では、グローバル変数と危険性は変わりません。
ただし、この場合でも、(少なくとも)引数として渡した関数のどれかが悪さをしているとか、値を書き換える非通用のない関数では、const な引数として渡す(と、その関数では、少なくとも書き換えできない)とか、若干、安全性を増すことができます。

C++の範疇まで広げれば、
・メンバー変数を private にして、
・読み込み、書き込みが必要な場合には、public な関数経由
にすれば、書き込み時に、いろいろなチェックをかけることができますから、安全性を向上させることができます。
    • good
    • 0
この回答へのお礼

グローバル変数の使い方は難しいですね。。
ご回答ありがとうございます。

お礼日時:2010/01/30 11:21

あなたの会社で「テーブル」という語がどういう意味で使われているのか不明ですが、想像して答えると、


ケース1:定数テーブルのようなもの。例えば、{"January","Feburuary","March",...} のようなものであれば、グローバルにすると思います。
ケース2:DBの代用。本来ならばDBを使ってもおかしくないが、他のプロセスと共用しないとか高速化の必要がある等の場合に、配列で代用することがあると思います。この場合もグローバルでしょうね。データベースやファイルというのはグローバルなので。
    • good
    • 0
この回答へのお礼

ケース2と思います。
特にほかのプロセスと共用するとかではなくて、
ひとつのプロセス内の複数の機能で、
そのテーブルを共有するイメージです。

具体的な構造は、構造体を使用した配列です。
構造体は、いくつもネストしていたりします。

お礼日時:2010/01/24 21:44

グローバル変数が良くないのはスコープ(変数を参照更新できる範囲)が広いからです。

スコープが広いと、その変数を修正したいとき、影響が広範囲にわたるため、保守性が低下します。変数のスコープはできる限り小さくした方が保守性が向上します。

>テーブルというなのグローバル変数
テーブルと言うのはおそらく配列のことではないでしょうか?
配列も引数で渡すことでローカル変数で管理することが可能です。配列の場合、一般的にアドレス渡しになると思いますが、const宣言することにより、更新コードを書くとコンパイルエラーにすることも可能です(関数内更新させたくない場合)。

ただ、学校と比べ仕事では、最初からプログラムを書くよりも誰かのプログラムを流用することが多いと思います。そのときに、既にグローバル変数で定義されたいるものをローカル変数に修正することは危険が大きすぎるので控えた方がよいのではないでしょうか?
    • good
    • 0
この回答へのお礼

複数の機能が、テーブルを介して処理をする。
というのはどこのシステムでも一般的な手法なので
しょうか?

>既にグローバル変数で定義されたいるものをローカル変数に修正するこ
>とは危険が大きすぎるので控えた方がよいのではないでしょうか?
プログラムを書き換えることはないです。
もし設計する機会があれば、どのような設計にするのが、
よいだろうと思ったしだいです。

お礼日時:2010/01/24 21:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!