プログラミングにおいて、グローバル変数は(あまり)使わないほうが良いというのが定説ですが、実際、グローバル変数を一切使わない開発に参画した人はいるのでしょうか?
グローバル変数を一切使わない開発をしたことがあるという方は、どの程度の開発規模(人員など)だったかも教えてください。
- 追記
グローバル変数の定義ですが、たとえばC言語では次のように定義します。
1. 同じファイル内に宣言された変数で、同じファイル内ならばその値を参照・代入ができる変数をグローバル変数とする。
C
1// 「file1.c」ファイル 2# include <stdio.h> 3 4int global_val; // これがグローバル変数 5 6void main(void) 7{ 8 ... 9}
2. 外部ファイルに宣言された変数で、externで宣言された変数を外部変数と呼ぶ。外部変数もグローバル変数である。
C
1// 「global_val.h」ファイル 2extern int g_firmware_version;
C
1// 「file1.c」ファイル 2# include <stdio.h> 3# include "global_val.h" 4 5void main(void) 6{ 7 printf("%d", g_firmware_version); // 外部変数にアクセスできる 8}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/03 10:16
2016/08/03 10:18
2016/08/03 10:36
2016/08/03 10:50
2016/08/03 11:58
回答14件
0
ベストアンサー
こんにちは。
「グローバル変数を一切使わない開発をしたことがあるという方」ではないので、直接の回答ではないです。すいません。
クラス内のstatic変数はグローバル変数と同等ですし、シングルトンもある意味グローバル変数と同じです。
「プログラミングにおいて、グローバル変数は(あまり)使わないほうが良い」は、そのような「広い意味」でのグローバル変数をあまり使わない方が良いと言う意味です。これは変数のスコープを無闇に広げると苦労するって経験則ですので。
しかし、そのような広い意味でのグローバル変数を「全く」使わない場合、全ての変数をバラメータ経由で渡すことになります。例えば、エラーログやコンソール出力等、ほぼ全てのクラス・オブジェクトが使いたいようなオブジェクトまで一々バラメータ(コンストラクタのパラメータ含む)で渡すことになります。
そして、それらのグローバル変数にしたいようなオブジェクトをGlobalClassみたいなクラスに纏めて、全ての場所にパラメータで渡すわけです。ナンセンスですね。
もしくは、static変数やシングルトンを使ってこれはグローバル変数ではないと主張して、本来スコープを狭くするべき変数までグローバルにアクセスできるようにしてしまうとかですね。
実は昔、グローバル変数を絶対使わないことにチャレンジしたことあります。そして、GlobalClassを作っていることに気が付いたのでチャレンジを中止しました。
それ以降、安易には使わないよう努力してますが、多数のクラスが裏方的に使う変数はグローバル変数にしてます。(裏方的な変数をパラメータで渡すと見通しも悪くなります。)
変数のスコープは可能な範囲で最小限にすることが望ましいです。しかし、必要であるにも関わらず無闇にスコープを小さくすると、却ってメンテナンス性は劣化します。
要はバランスです。バランスを欠いたプロジェクトは悲惨なのです。
投稿2016/08/03 10:42
総合スコア23272
0
C# での開発なら使うのは不可能です。
C# にはグローバル変数やグローバル メソッドはありません (言語によっては、グローバル変数やグローバル メソッドが存在する場合もあります)。
投稿2016/08/03 09:53
総合スコア28656
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/03 10:19
2016/08/03 10:22
2016/08/03 10:35
2016/08/03 10:35
2016/08/03 10:45
2016/08/03 10:57
2016/08/03 11:00
2016/08/03 11:03
2016/08/03 11:06
2016/08/03 11:20
0
グローバル変数は使っていない…と思いきや、グローバル変数を通り越して「プロセスをまたいで共有される」環境変数をよく使っていることに気づきました。サーバごとに変わる、あるいは安全上git管理したくないような、ソースコードに書けない接続情報などについて、環境変数に置いてアプリからそれを読み取るというのが、Webアプリでもよく行われています。
これでグローバル変数の弊害はないのかといえば、ふつう環境変数の値は読むだけですので、「プログラム内での意図しない書き換え」というのが起きないため、問題はありません(実装としてはプログラム内から書き換えることはできるのですが、頻繁に書き換えるような値を環境変数経由で渡すという設計は、常識的に行わないのでまず問題になりません)。
それ以外でも、ロケールのように「初期設定すればあとは読むだけ」とか、ロガーのように「書き出し専用」というものの場合、ある箇所で使うことが他の箇所に影響を与えることもないので、グローバルに実装して大問題となることはないでしょう(本当にグローバルに作ってしまうと、「テストしづらい」という問題があるかもしれませんが)。
投稿2016/08/03 11:11
総合スコア145121
0
「グローバル変数」は使わなくても普通に開発できるんちゃうかなあ。
グローバルに参照できる define 的な定数ならよく使いますな。
グローバルに使うって意味ではデータベースやファイルもそうなる?
まあ、こじつけですが、この場合は影響を小さくする工夫はしますね。
そういう意味では、グローバル変数を使う場合も(どうしても使うなら)
そういった工夫をするのが一般的じゃないかなあ。
投稿2016/08/03 10:44
総合スコア7458
0
うちは個人ごとで小規模のプロジェクトを運営するので、人によってはグローバル変数を使用します。
やはり言語にもよるのではないでしょうか。
VBのVer6以前であれば、どうしてもグローバルを使うことがあります。
いまは.netやJavaなどのオブジェクト指向の言語が中心なので、
個人的にはグローバルはあまり使わないです。
時々、VB6から抜け出せない人が、グローバルを使いたがります。
投稿2016/08/03 10:31
総合スコア128
0
言語にもよりますが、開発ではグローバル変数は使いません。
php
1$_SERVER 2$_GET 3$_POST
上記のような、言語仕様として存在している(スーパー)グローバル変数は使いますけどね。
PHP:スーパーグローバル
投稿2016/08/03 09:58
退会済みユーザー
総合スコア0
0
This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post.! เว็บตรง100
投稿2023/09/26 09:01
総合スコア24
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Hello I am so delighted I located your blog, I really located you by mistake, while I was watching on google for something else, Anyways I am here now and could just like to say thank for a tremendous post and a all round entertaining website. Please do keep up the great work. dance class near me
投稿2023/09/25 10:38
総合スコア24
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
プロジェクトが実稼働コードでリエントラントまたはスレッドセーフである必要がある場合、これは非常に面倒です。 誰かがあなたの 20,000 行のプロジェクトを将来継承することになった場合、最初からやり直す方がおそらく効率的であるという点までリファクタリングする喜びを想像してみてください。
geometry dash
投稿2023/06/21 08:19
総合スコア2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
システムが最も安定した方法で動作できるように、ルーティング エラーをできるだけ早く修正する必要があります。 mapquest directions
投稿2023/06/21 03:17
総合スコア6
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C/C++ でグローバル変数の使用を避けるべきなのはなぜですか?
グローバル変数はコードのどの部分でも変更できるため、考えられるすべての使用法を覚えたり推論したりすることが困難になります。
グローバル変数にはアクセス制御を持たせることができません。 ...
グローバル変数を使用すると、コードが非常に緊密に結合されます。 getting over it
投稿2023/05/31 08:40
総合スコア2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C#だからグローバル変数使っていないなーと思っていたのですが、
Cのグローバル変数ってファイル単位なのですね。
であれば、同じ問題はクラス変数でもあり得る話です。クラスがあまりに大きくなりすぎるとどのメソッドから書き換えられるか分からなくなります。結果、変数同士の整合性が崩れて問題を起こします。
この場合、私は、クラスが大きすぎたのだと考えます。関連性が強い変数通しを別クラスに定義しなおして、変数への操作を隠蔽するようにしています。
なので、ファイルがあまり大きくなければ問題無いし、適切な場合も多いだろうなと思いました。
投稿2016/08/03 20:38
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。