![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
A 回答 (4件)
- 最新から表示
- 回答順に表示
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?e8efa67)
No.3
- 回答日時:
グローバル変数がよくないと言われるのは、予想外の値が設定されたときに、誰がどこで(どの関数が)その値を設定したのか追いかけるのが大変だからというのが主な理由です。
ですから、まず、「誰も書き込みをしない(参照するだけ)」のグローバル変数は、#define で定義した定数と同じですから、危険性はありません。
普通に言う「テーブル」は、読み込みのみの用途であることが多いので、大丈夫なことが多いですが。
ただ、「誰も書き込みをしないはず」のところに、書き込みされてしまうのが、バグというものですから、const を指定して、「書き込みできないのを保証する」というのは、良い方法です。
グローバル変数の危険性を回避するためには、書き込み時のチェックを行うという方針になります。
テーブル自体を、どこかの関数のローカル変数として定義し、このポインタを「必要とする」関数に対して、引数として渡すことで、見かけ上グローバル変数をなくすことができます。
ただ、これも、このままでは、「引数として渡した関数のどこで(間違って)書き込んだのか」という点では、グローバル変数と危険性は変わりません。
ただし、この場合でも、(少なくとも)引数として渡した関数のどれかが悪さをしているとか、値を書き換える非通用のない関数では、const な引数として渡す(と、その関数では、少なくとも書き換えできない)とか、若干、安全性を増すことができます。
C++の範疇まで広げれば、
・メンバー変数を private にして、
・読み込み、書き込みが必要な場合には、public な関数経由
にすれば、書き込み時に、いろいろなチェックをかけることができますから、安全性を向上させることができます。
No.2
- 回答日時:
あなたの会社で「テーブル」という語がどういう意味で使われているのか不明ですが、想像して答えると、
ケース1:定数テーブルのようなもの。例えば、{"January","Feburuary","March",...} のようなものであれば、グローバルにすると思います。
ケース2:DBの代用。本来ならばDBを使ってもおかしくないが、他のプロセスと共用しないとか高速化の必要がある等の場合に、配列で代用することがあると思います。この場合もグローバルでしょうね。データベースやファイルというのはグローバルなので。
ケース2と思います。
特にほかのプロセスと共用するとかではなくて、
ひとつのプロセス内の複数の機能で、
そのテーブルを共有するイメージです。
具体的な構造は、構造体を使用した配列です。
構造体は、いくつもネストしていたりします。
No.1
- 回答日時:
グローバル変数が良くないのはスコープ(変数を参照更新できる範囲)が広いからです。
スコープが広いと、その変数を修正したいとき、影響が広範囲にわたるため、保守性が低下します。変数のスコープはできる限り小さくした方が保守性が向上します。>テーブルというなのグローバル変数
テーブルと言うのはおそらく配列のことではないでしょうか?
配列も引数で渡すことでローカル変数で管理することが可能です。配列の場合、一般的にアドレス渡しになると思いますが、const宣言することにより、更新コードを書くとコンパイルエラーにすることも可能です(関数内更新させたくない場合)。
ただ、学校と比べ仕事では、最初からプログラムを書くよりも誰かのプログラムを流用することが多いと思います。そのときに、既にグローバル変数で定義されたいるものをローカル変数に修正することは危険が大きすぎるので控えた方がよいのではないでしょうか?
複数の機能が、テーブルを介して処理をする。
というのはどこのシステムでも一般的な手法なので
しょうか?
>既にグローバル変数で定義されたいるものをローカル変数に修正するこ
>とは危険が大きすぎるので控えた方がよいのではないでしょうか?
プログラムを書き換えることはないです。
もし設計する機会があれば、どのような設計にするのが、
よいだろうと思ったしだいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文(テーブル項目名が特殊文...
-
select文の戻り値を変数に格納...
-
DBの読み込み順について
-
Windows formアプリで データグ...
-
VBA 配列に格納した値の平均の...
-
VBAでセルをクリックする回...
-
Excelのセルの色指定をVBAから...
-
テキストボックスのvalueとtext...
-
表にフィルターをかけ、絞った...
-
特定のセルが空白だったら、そ...
-
特定行の色を変えたい(FlexGrid)
-
ExcelVBAを使って、値...
-
VB.NETで DataRow()を利用して...
-
【Excel VBA】指定行以降をクリ...
-
Accessのクエリで、replace関数...
-
Spreadの選択行の取得について
-
i=cells(Rows.Count, 1)とi=cel...
-
ASP C# データベースから1行取得
-
Excelで指定した日付から過去の...
-
UNICODE文字が含まれているかの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL文(テーブル項目名が特殊文...
-
select文の戻り値を変数に格納...
-
【ACCESS】リレーションを組ん...
-
access コンボボックス初期表示...
-
外部キーのリレーションが設定...
-
DBの読み込み順について
-
VBとACCESSを接続したい
-
ACCESSテーブルを RecordSet以...
-
accessのフォームを使ってテー...
-
HTML&CSS Javascriptによる動...
-
DataGridViewで編集した内容を...
-
ASP.NET:複数結合テーブルのデ...
-
データベースのレコードをform1...
-
テーブルというグローバル変数
-
select文の検索結果と文字列を...
-
ASP(VBScript)で自動連番
-
Windows formアプリで データグ...
-
異なるデータベースでのSELECT ...
-
Perlで変数内の日本語が文字コ...
-
フラッシュの画像を合わせるパ...
おすすめ情報