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で質問しましょう!
似たような質問が見つかりました
- FTTH・光回線 グローバルIPアドレスの変更について 1 2022/04/23 05:32
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- VPN 接続のたびにIPが変わるVPNサービスが知りたい 2 2022/06/27 02:34
- Wi-Fi・無線LAN ネットワークに関する質問です。現在、有線ルーターと無線ルーターを使用しております。 4 2023/07/13 23:04
- Access(アクセス) AccessVBAで任意の複数リンクテーブルをAccessVBAを動かす際に削除したいと考えておりま 1 2022/11/17 15:45
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(プログラミング・Web制作) プログラミングって本来数学的な計算をする為のものではないのですか? 学校で配られたFortran90 11 2022/08/25 22:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【ACCESS】リレーションを組ん...
-
ACCESSテーブルを RecordSet以...
-
Windows formアプリで データグ...
-
SQL文(テーブル項目名が特殊文...
-
select文の戻り値を変数に格納...
-
ASPとAccessとの接続について
-
テーブルというグローバル変数
-
DataGridViewで編集した内容を...
-
DBの読み込み順について
-
VBとACCESSを接続したい
-
Perlで変数内の日本語が文字コ...
-
外部キーのリレーションが設定...
-
金額の割り振り方について(A...
-
【Excel VBA】指定行以降をクリ...
-
ExcelVBAを使って、値...
-
count(*)で取得した値をJAVAの...
-
特定のセルが空白だったら、そ...
-
VBAでActiveDirectoryのユーザ...
-
i=cells(Rows.Count, 1)とi=cel...
-
”戻り値”が変化したときに、マ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL文(テーブル項目名が特殊文...
-
select文の戻り値を変数に格納...
-
【ACCESS】リレーションを組ん...
-
ACCESSテーブルを RecordSet以...
-
VBとACCESSを接続したい
-
テーブルというグローバル変数
-
DBの読み込み順について
-
access コンボボックス初期表示...
-
accessのフォームを使ってテー...
-
DataGridViewで編集した内容を...
-
外部キーのリレーションが設定...
-
HTML&CSS Javascriptによる動...
-
ASP(VBScript)で自動連番
-
Perlで変数内の日本語が文字コ...
-
EF(コードファースト)のコン...
-
ASP.NET:複数結合テーブルのデ...
-
フラッシュの画像を合わせるパ...
-
テーブルへのデータ投入について。
-
教えてアクセス2007!「在...
-
ExcelVBAを使って、値...
おすすめ情報