
A 回答 (4件)
- 最新から表示
- 回答順に表示

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ランキング
-
access コンボボックス初期表示...
-
VB.NETで DataRow()を利用して...
-
【Excel VBA】指定行以降をクリ...
-
VBAでActiveDirectoryのユーザ...
-
エクセルVBAで範囲内での位置取...
-
i=cells(Rows.Count, 1)とi=cel...
-
VB.NETでコンボボックスの1行目...
-
Excelで指定した日付から過去の...
-
VBSでエクセル内の行数を取得す...
-
配列がとびとびである場合の書き方
-
秒以下は取得できないですか?
-
テキストボックスのvalueとtext...
-
EXCELで変数をペーストしたい
-
Accessのクエリで、replace関数...
-
特定のセルが空白だったら、そ...
-
ListView 項目の選択/選択解除...
-
MACアドレスを取得する方法はあ...
-
ExcelのINDEXとMATCH関数でスピ...
-
like演算子内に変数って使えな...
-
Excel vbaで特定の文字以外が入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【ACCESS】リレーションを組ん...
-
select文の戻り値を変数に格納...
-
SQL文(テーブル項目名が特殊文...
-
access コンボボックス初期表示...
-
DBの読み込み順について
-
Perlで変数内の日本語が文字コ...
-
ACCESSテーブルを RecordSet以...
-
外部キーのリレーションが設定...
-
VBとACCESSを接続したい
-
異なるデータベースでのSELECT ...
-
accessのフォームを使ってテー...
-
SQL文なんですが
-
asp.net MVC
-
C# OleDb SQL JOIN すると例外
-
DataGridViewで編集した内容を...
-
Delphi BDE 複数ユーザによる...
-
ACCESSで伝票をつくる方法
-
VB.NETで DataRow()を利用して...
-
Accessのクエリで、replace関数...
-
テキストボックスのvalueとtext...
おすすめ情報