質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

14回答

46182閲覧

グローバル変数を一切使わない開発に参画したことがありますか?

takey

総合スコア312

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

2グッド

2クリップ

投稿2016/08/03 09:28

編集2023/09/26 18:01

プログラミングにおいて、グローバル変数は(あまり)使わないほうが良いというのが定説ですが、実際、グローバル変数を一切使わない開発に参画した人はいるのでしょうか?

グローバル変数を一切使わない開発をしたことがあるという方は、どの程度の開発規模(人員など)だったかも教えてください。

  • 追記

グローバル変数の定義ですが、たとえば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}
aaaaaaaa, Mr_Roboto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2016/08/03 09:46

「グローバル変数」の定義を教えて下さい。
takey

2016/08/03 10:16

グローバル変数の定義を追記しました。ご確認ください。
Zuishin

2016/08/03 10:18

そういうことじゃないと思いますよ。
takey

2016/08/03 10:36

どういうことだったんでしょうか...
ozwk

2016/08/03 10:50

C#では字面上ではグローバル変数が存在しないことになっているのですが、public staicなフィールドは似たようなものです。なので、言語固有の名称によらない定義が欲しかったんです
takey

2016/08/03 11:58

>言語固有の名称によらない定義が欲しかったんです すみません、そのあたりは「この言語だけどグローバル変数使わずに開発したよ」という回答を期待していました。質問内容が漠然としすぎですね。 でも、ありがとうございました。
guest

回答14

0

ベストアンサー

こんにちは。

「グローバル変数を一切使わない開発をしたことがあるという方」ではないので、直接の回答ではないです。すいません。

クラス内のstatic変数はグローバル変数と同等ですし、シングルトンもある意味グローバル変数と同じです。
「プログラミングにおいて、グローバル変数は(あまり)使わないほうが良い」は、そのような「広い意味」でのグローバル変数をあまり使わない方が良いと言う意味です。これは変数のスコープを無闇に広げると苦労するって経験則ですので。

しかし、そのような広い意味でのグローバル変数を「全く」使わない場合、全ての変数をバラメータ経由で渡すことになります。例えば、エラーログやコンソール出力等、ほぼ全てのクラス・オブジェクトが使いたいようなオブジェクトまで一々バラメータ(コンストラクタのパラメータ含む)で渡すことになります。
そして、それらのグローバル変数にしたいようなオブジェクトをGlobalClassみたいなクラスに纏めて、全ての場所にパラメータで渡すわけです。ナンセンスですね。

もしくは、static変数やシングルトンを使ってこれはグローバル変数ではないと主張して、本来スコープを狭くするべき変数までグローバルにアクセスできるようにしてしまうとかですね。

実は昔、グローバル変数を絶対使わないことにチャレンジしたことあります。そして、GlobalClassを作っていることに気が付いたのでチャレンジを中止しました。
それ以降、安易には使わないよう努力してますが、多数のクラスが裏方的に使う変数はグローバル変数にしてます。(裏方的な変数をパラメータで渡すと見通しも悪くなります。)

変数のスコープは可能な範囲で最小限にすることが望ましいです。しかし、必要であるにも関わらず無闇にスコープを小さくすると、却ってメンテナンス性は劣化します。
要はバランスです。バランスを欠いたプロジェクトは悲惨なのです。

投稿2016/08/03 10:42

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/08/03 11:03

私も今している開発で、「グローバル変数を使わずにコーディングしよう」とチャレンジしていたのですが、壁にぶちあたってしまったようです。
takey

2016/08/03 12:23

個人的に同じような経験をしている方で、「グローバル変数を使ったほうが便利なときもあるよなあ」という私の考えと同じような考えで、とても共感できました。 「グローバル変数は使うべきではない」という強い主張もなさそうなので、BAとさせていただきます。 ほかの方も、回答ありがとうございました。
guest

0

C# での開発なら使うのは不可能です。

クラスと構造体 (C# プログラミング ガイド)

C# にはグローバル変数やグローバル メソッドはありません (言語によっては、グローバル変数やグローバル メソッドが存在する場合もあります)。

投稿2016/08/03 09:53

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/08/03 10:19

まさに今、C#でプログラミングしているのですが、 static public class GlobalVar{ static public int globalVal; } みたいな感じでグローバル変数を作ってプログラミングしています。こういうやりかたってあまりしないのでしょうか?
Zuishin

2016/08/03 10:22

それはグローバル変数ではありません。字義上もそうですし、なぜグローバル変数を使ってはいけないのか理由を考えるとわかると思います。
takey

2016/08/03 10:35

グローバル変数を使ってはいけない理由は、「変数のスコープが広くなり、いつどこで値が変更されるかがわかりづらくなる」と考えています。 そのようなグローバル変数を使ってはいけない理由は理解できるのですが、実際問題、グローバル変数を使わないとコーディングできないような状況ってありませんか?という意図で質問しました。 たとえばWindowsForms開発のときにWindow間の値の受け渡しができないので、一時的にグローバル変数を使って値の受け渡しをする、みたいなときで使っています。
Zuishin

2016/08/03 10:35

語弊があるので書き直します。 それはグローバル変数ではありませんが、グローバル変数のような使い方が可能です。 もしそのような使い方をするならば、グローバル変数と同じ問題を抱えています。
Zuishin

2016/08/03 10:45

ウィンドウの間でデータを取り交わすなどグローバル変数を使いたくなる場面がしょっちゅうあるとしたら、それはオブジェクトをきちんと設計できていない場合であることがほとんどだと思います。 オブジェクト指向にはそれなりの書き方があります。
takey

2016/08/03 10:57

疑問なのですが、オブジェクト指向プログラミングならば、必ずグローバル変数を使わずに(上記のstatic public classのような使い方もせずに)コーディングできる方法(設計)が存在するということでしょうか?
Zuishin

2016/08/03 11:00

必ずとは言いません。 プロジェクト内のどこでも使える変数があった方が簡単になることもあります。 しかし、グローバル変数ありきで作られたコードは見るに堪えないものが多いこともまた事実です。
Zuishin

2016/08/03 11:03

ここでオブジェクト指向と言ったのは、「きちんと適切なオブジェクトに機能が分割されているか」ということです。グローバル変数を多用するということは、プロジェクト内のオブジェクトの多くがそれに依存していることが考えられます。ということはつまり、機能の分割がうまくいっていない一つの指標になります。
Zuishin

2016/08/03 11:06

機能の分割がうまくいっていないということは、再利用性と保守性が落ちるということです。これは前時代のプログラミングです。 悪いのはグローバル変数ではなく、まずそれありきで設計することです。
takey

2016/08/03 11:20

>プロジェクト内のどこでも使える変数があった方が簡単になることもあります。 まさに私がこの質問をするきっかけになったのがこの一文です。 「世間ではグローバル変数は(あまり)使うなと言われているけれど、実際問題グローバル変数なしでコーディングするのって無理じゃないか?自分のスキルが低いからそう思うだけなのか?ほかのみんなはどうしているんだ?」という疑問をもったので、『グローバル変数を一切使わない開発に参画したことがありますか?』という質問をしました。 Chironianさんも「要はバランスです。」とおっしゃっていました。今のところ、「グローバル変数は必ずしも悪ではない」というのが結論なのかな、といった感じです。
guest

0

グローバル変数は使っていない…と思いきや、グローバル変数を通り越して「プロセスをまたいで共有される」環境変数をよく使っていることに気づきました。サーバごとに変わる、あるいは安全上git管理したくないような、ソースコードに書けない接続情報などについて、環境変数に置いてアプリからそれを読み取るというのが、Webアプリでもよく行われています。

これでグローバル変数の弊害はないのかといえば、ふつう環境変数の値は読むだけですので、「プログラム内での意図しない書き換え」というのが起きないため、問題はありません(実装としてはプログラム内から書き換えることはできるのですが、頻繁に書き換えるような値を環境変数経由で渡すという設計は、常識的に行わないのでまず問題になりません)。

それ以外でも、ロケールのように「初期設定すればあとは読むだけ」とか、ロガーのように「書き出し専用」というものの場合、ある箇所で使うことが他の箇所に影響を与えることもないので、グローバルに実装して大問題となることはないでしょう(本当にグローバルに作ってしまうと、「テストしづらい」という問題があるかもしれませんが)。

投稿2016/08/03 11:11

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/08/03 11:37

環境変数は考慮していませんでした。 たしかに環境変数はグローバル変数よりスコープがはるかに大きいですね。 ただ、おっしゃるとおり基本的に環境変数は読むだけだと思いますし、一度読み込んだらエラーが起きるまで再度読み込みはしないという設計をすると思います。そういう意味では、環境変数というよりは環境定数として扱っていると思います。
guest

0

使いません。
画面間で値を受け渡すというのはそもそも設計が悪いです。
UIに関わらない、データを処理するクラスのインスタンスがあって、
画面はそれを写しているだけです。

投稿2016/08/03 10:54

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/08/03 10:59

>画面間で値を受け渡すというのはそもそも設計が悪いです。 耳に痛いです... きちんとオブジェクト指向を理解していないせいですね。
guest

0

「グローバル変数」は使わなくても普通に開発できるんちゃうかなあ。
グローバルに参照できる define 的な定数ならよく使いますな。

グローバルに使うって意味ではデータベースやファイルもそうなる?
まあ、こじつけですが、この場合は影響を小さくする工夫はしますね。

そういう意味では、グローバル変数を使う場合も(どうしても使うなら)
そういった工夫をするのが一般的じゃないかなあ。

投稿2016/08/03 10:44

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/08/03 10:50

個人的にはデータベースやファイルは個人のコーディングの問題の域ではないので、グローバル変数扱いしたくないところです。 また、#defineに関しても、グローバルに使う定数(仕様で定められている定数)ならば、専用の外部ファイルを作成して、そこにまとめて宣言したほうがいいと思っています。
guest

0

うちは個人ごとで小規模のプロジェクトを運営するので、人によってはグローバル変数を使用します。

やはり言語にもよるのではないでしょうか。
VBのVer6以前であれば、どうしてもグローバルを使うことがあります。
いまは.netやJavaなどのオブジェクト指向の言語が中心なので、
個人的にはグローバルはあまり使わないです。
時々、VB6から抜け出せない人が、グローバルを使いたがります。

投稿2016/08/03 10:31

takaw

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/08/03 10:44

たとえ社内の業務でも、個人での開発ならばグローバル変数を許容しているのですね。 VB6で開発をしていたとき、フォーム間の値の受け渡しがわからなくて、「フォームを開く前にグローバル変数(外部変数)に値を書き込む→フォームを開いたらすぐにグローバル変数を読み込む。それ以外ではこのグローバル変数は使用したらいけない」というルールでコーディングした経験があります。 .NetでのWPF開発では、このようなフォーム間(Window間)の値の受け渡しが可能になっているのでしょうか?
guest

0

言語にもよりますが、開発ではグローバル変数は使いません。

php

1$_SERVER 2$_GET 3$_POST

上記のような、言語仕様として存在している(スーパー)グローバル変数は使いますけどね。
PHP:スーパーグローバル

投稿2016/08/03 09:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2016/08/03 10:22

スーパーグローバルという言葉を初めて聞きました。そういうのもあるんですね…。
guest

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

smaran

総合スコア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

smaran

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

プロジェクトが実稼働コードでリエントラントまたはスレッドセーフである必要がある場合、これは非常に面倒です。 誰かがあなたの 20,000 行のプロジェクトを将来継承することになった場合、最初からやり直す方がおそらく効率的であるという点までリファクタリングする喜びを想像してみてください。
geometry dash

投稿2023/06/21 08:19

zackary42

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

システムが最も安定した方法で動作できるように、ルーティング エラーをできるだけ早く修正する必要があります。 mapquest directions

投稿2023/06/21 03:17

adamusa

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C/C++ でグローバル変数の使用を避けるべきなのはなぜですか?
グローバル変数はコードのどの部分でも変更できるため、考えられるすべての使用法を覚えたり推論したりすることが困難になります。
グローバル変数にはアクセス制御を持たせることができません。 ...
グローバル変数を使用すると、コードが非常に緊密に結合されます。 getting over it

投稿2023/05/31 08:40

agustinalemke

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

はい、グローバル変数を一切使わずに開発を行った経験を持つ人は存在します。実際、グローバル変数を避けることは、ソフトウェア開発のベストプラクティスの一つです。
グローバル変数の使用を避ける主な理由は、以下のようなものです:
名前空間の衝突:グローバル変数はプログラム内のどこからでもアクセスできるため、異なる部分で同じ名前の変数を使用すると、予期しない挙動やバグの原因になります。rankdle

投稿2023/05/30 08:59

victorpatrick

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#だからグローバル変数使っていないなーと思っていたのですが、
Cのグローバル変数ってファイル単位なのですね。

であれば、同じ問題はクラス変数でもあり得る話です。クラスがあまりに大きくなりすぎるとどのメソッドから書き換えられるか分からなくなります。結果、変数同士の整合性が崩れて問題を起こします。

この場合、私は、クラスが大きすぎたのだと考えます。関連性が強い変数通しを別クラスに定義しなおして、変数への操作を隠蔽するようにしています。

なので、ファイルがあまり大きくなければ問題無いし、適切な場合も多いだろうなと思いました。

投稿2016/08/03 20:38

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問