トップページ⇒tech
158コメント57KB

グローバル変数を使おう

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
グローバル変数を使った方が楽だよ。きちんと管理できない
バカがいるから使うと面倒になるだけで。
0108デフォルトの名無しさんNGNG
Cのソースで1000行から3000行越えたあたりから、
かーなり管理がウザクなってきて、10000行越えたら
もうヤって感じだな。

学生時代、簡単な実験装置を制御するプログラムを
同期と一緒にいぢった時の話。
グローバル変数じゃないんだけど、数千行に及ぶ関数の中で、
かーなり外側のループでiとかjがフツーの変数として使われてた。
知らずに
for(i=0;i<MAX_HOGE;i++){/*fugahoge*/}
とか追加した為に、エラくタノシイことに...(・∀・)
# いや、見た瞬間、書き直さないと逝けないとは思ったん
# だけど....メンドクさかったんだよぉ
0109デフォルトの名無しさんNGNG
>gotoもそうだけど、使うのは厨房って考えは間違ってるよ。

単に「最後の武器」っていうだけのことだ。だから>>1の
「グローバル変数を使った方が楽だよ」ってのは
あまりにも中途半端な言い方であって、正しくは
「グローバル変数を必要最小限使った方が楽だよ」
とすべきだな。

でもまぁ、(無理せずに)全く無くすることも不可能じゃないがな。
プログラムのデータ構造全体をCompositeパターン的にtree構造に
してしまい、根をmainのローカル変数にすりゃいいんだ。

delのComponent管理がコレに近い。ただし根のApplication変数は
なぜかglobalだが(わら
あとObjectiveCつーかOPENSTEPフレームワークの
NSAutoreleasePoolっていうクラスの仕組みも、それに近い。
0110デフォルトの名無しさんNGNG
>>109
グローバル変数がダメなのではなくて、
管理できないグローバル変数がダメなんだよ。
グローバル変数を効果的に使用して効果をあげているプロジェクトは
幾つもあるし、その使い方は哲学的であることもしばしば。
セオリーを知って、その上に思想を持った自分のセオリーを構築できれば
周囲は説得できるし、武器になると思う。<ごめん、かなり抽象的だね。
0111デフォルトの名無しさんNGNG
>>110
プログラムに哲学や思想を持ち込むなよ
周囲が迷惑する
0112デフォルトの名無しさんNGNG
Del厨が来ると雰囲気が悪くなるね
0113デフォルトの名無しさんNGNG
>>110
現場のプログラマに周知徹底できてこその哲学と思われ
0114デフォルトの名無しさんNGNG
>>111
いや、それは不可避だぞ。どうせ人間のやることだ。
言語仕様みたいに、(作者の)哲学の塊みたいなもんを
俺らは日常的に使わされてるわけだろ(わら

問題はそこじゃない。

>>110
結局は、哲学が「(客観的に見て)間違って」なければ、通るかもだな。
計算機的に間違ってる哲学なら、なんぼ主張しても通らないか、
無理を通して道理引っ込む(=プロジェクトが崩壊)かどっちかだ。

メジャーな言語(という哲学の塊)を使っても大丈夫なのは、
ひとえに、その作者の哲学が間違ってなかったから、だ。
一度、ドキュ会社が作ったドキュ言語を使わされてみろって。
昇天できるぞ。

哲学といっておきながら、人間の思想だけの問題じゃなく、
同時に計算機をきちんと動かすこともできる思想、
でないと駄目ってのが、ここでいう意味の「思想」
って奴の味噌だろう。

そうでない場合は、つまり「独善」だ。
0115デフォルトの名無しさんNGNG
>>111
申し訳ない。
哲学や思想という言葉に拒絶反応を示す人間が居る事を考えるべきだった。
ポリシーという言葉ならOKかな?
グローバル変数は何処からでも参照できる(書き換えできるとは言わない事に
注目して欲しい。)特徴を持ったオブジェクトなんだ。
この素晴らしい機能に着目した事が無いなんて寂し過ぎると思う。
カプセル化、隠蔽は役に立つポリシーだが、自分自身のポリシーを
確立させることもプロとして重要な事だよ。
0116デフォルトの名無しさんNGNG
この擦れみてると凡庸な下っ端はつらいね、死にたいね、シネヨ
まぁ、リビドーを満足させるような状況になるには、そうだねぇ、
あと何年かは耐えないとね。あ、そのころにはあんた、部下から
この擦れのように陰でぶちぶちいわれてんだけどね。
0117デフォルトの名無しさんNGNG
>>115
>哲学や思想という言葉に拒絶反応を示す人間が居る事を考えるべきだった。
>ポリシーという言葉ならOKかな?

おい。それは全く同じだろ(わら

>グローバル変数は何処からでも参照できる(書き換えできるとは言わない事に
>注目して欲しい。)特徴を持ったオブジェクトなんだ。

おい。「変数」なら書き換えも許可だろうがよ(わら

自分自身の言葉の「正確な」意味に、少しは注意してくれ。

ちなみに上記は、単なる揚げ足じゃなくて、体まるごと転倒だぞ。
上記の齟齬によって論旨本体が危うくなってる(のを
俺は蹴っ飛ばした)のだからな。

判るか?
ポリシーという言い換えにもなってない言い換えを
するってのは人様を馬鹿にしてるに過ぎないのだし、
書き換え可能かどうかが結構重要な焦点になるんで
そこを間違えたら一大事、なのだ。

繰り返すが、
>自分自身のポリシー

ポリシーが工学的(てーかそれ以前)に間違っている場合は
プロとして死だぜ。
0118デフォルトの名無しさんNGNG
要するにさ、プログラミングって発想なんよ。アイデアなんよ。
組織がどうたらさ、文句いうなら自営でやれよ。お前はそこまで
独創的にアイデアがあるんだろう?自営が恐いならだまっとけ、
サンシタ。
0119デフォルトの名無しさんNGNG
グローバル変数を批判するのは判りきったことなのに
そんなのを偉そうにいうオヤジつまらん。
あたりまえの常識を盾に説教たれるオヤジはつまらん。

グローバル変数賛成派頑張れ。オヤジをぶっ倒せ。
0120118NGNG
自営つうか、だまってやっとけ。
0121デフォルトの名無しさんNGNG
>>118
>要するにさ、プログラミングって発想なんよ。アイデアなんよ。

発想とかアイデアが必要とされるのは、研究とかごく一部の分野だけ。
0122デフォルトの名無しさんNGNG
el mundo ausente
0123デフォルトの名無しさんNGNG
>>117
おや、ポリシーという言葉もお気に召さないのかい。
と言う事は君はかなり確固たるポリシーを持っている事になる。
ある意味感心だ。
私も安直に使われるグローバル変数に悩まされている者のひとりだ。
そういう意味では君の悩みは私の物でもある。
ただし、美しいルール(ルールではどうだろう?)の下に使われる
グローバル変数は有意義な場合が有る事を判って欲しい。
0124デフォルトの名無しさんNGNG
>>120
おまえさ、通勤途中で「あ、こうすればいいのか」
っておもいつたことないだろう?
それじゃ、プログラミング人生もつらいわな。
転職したら?
0125117NGNG
>>123
>言葉も

おい。俺は>>111じゃないぞ。

>美しいルール(ルールではどうだろう?)の下

たぶん違うはずだ。たしかlawという単語(=法則)が適合するはず。
味噌は、人間様の自由意志で必ずしもなんでも選択可能であるとは限らない、
という点なので。
それを満たさない、つまり人間の考え次第でどうにでもなるものは、
たいてい気分の問題に過ぎない。

>>124
いいこといった!
0126デフォルトの名無しさんNGNG
エレベータには何重にも防護策がとられているが、
うちの会社は優秀な技術者ばかりなので、
エレベータは一度も防護策が必要になるようなトラブルが発生することはない
だから今後の製品には、楽だから防護策を取り入れない

そんな会社の製品を買いますか?
0127 NGNG
わけわからん例えだなぁ。グローバル変数を使うメリットも、
グローバル変数不使用は「防護策」の「ひとつ」である、という事実も、
まったく入ってないじゃん。小学生からやり直せ。
0128デフォルトの名無しさんNGNG
グローバル変数を使うメリットは>>1が書いている通り「楽」だからだろ
そんな手抜きプログラムを喜んで使う会社は無い
0129デフォルトの名無しさんNGNG
>>115
> グローバル変数は何処からでも参照できる(書き換えできるとは言わない事に
> 注目して欲しい。)特徴を持ったオブジェクトなんだ。
書き換え不能のオブジェクトは「定数」という。

>>123
> グローバル変数は有意義な場合が有る事を判って欲しい。
でも大概の場合、「自分だけがそう思っているだけ」である
場合が多いことを判って欲しい。
0130デフォルトの名無しさんNGNG
誰かが書いていたけど、MFCで言う、CWinAppの派生クラスの唯一のインスタンス
が持つ、パブリックなプロパティはどうなんですか?
このクラスに入れれば、管理されたグローバル変数みたいなもんですけど。
0131130NGNG
やっぱりアクセス関数を書くのかな?
0132デフォルトの名無しさんNGNG
関数経由にすればブレークポイントが置けるのでデバッグで「楽」が出来る
>>1が言っているのとは別の意味で「楽」になる
0133デフォルトの名無しさんNGNG
C/C++ではファイル内static変数が使えるけどこれはグローバル変数とみなすの?
これはあったほうが便利だと思うけど。
0134デフォルトの名無しさんNGNG
>>133
駄目だろ。
グローバル否定派は、変数は全部ローカル変数じゃないと許さないんだよ(藁
0135デフォルトの名無しさんNGNG
自分の作り方としては 組込みなんかだと回路の方もやるせいか
フラグ志向というか、状態遷移図的な手法が多くなるな。
当然、グローバル変数のみ的世界。 他人から嫌われています。

パソコンの世界で仕事すると、Delphiを使うせいか殆どこんな書き方はしないんだけど
0136デフォルトの名無しさんNGNG
組み込みはハードの作法に従って好きなようにやってください。
0137デフォルトの名無しさんNGNG
つーか、タッチブレークかけられるならグローバル変数の方が
デバッグしやすかったりするね。
0138デフォルトの名無しさんNGNG
>>134
>グローバル否定派は、変数は全部ローカル変数じゃないと許さないんだよ(藁

おーい。OOPのメンバ変数のことも考慮してくれー(わら
というか、確かに本物のドキュなら考慮しないだろうけどな(わら

>>135
>フラグ志向というか、状態遷移図的な手法が多くなるな。
>当然、グローバル変数のみ的世界。 他人から嫌われています。

去年(今年じゃなく)のObjectDay2000で、組み込みの人も
大ホールで喋ってたぞ。
いわく、組み込み屋の開発手法において、第一の波は状態遷移図、
第二の波はOOP、なのだそうだ。
というか今第二の波に襲われ(教われ?)中、なのだそうだ。
まぁ1年以上前の話だ。今はもっと進んだんだろうな。

状態遷移をOOPで表すといえばStateパターンとか、
それによる挙動の自動変更といえばStrategyパターンとか、
ネタは色々あると思われるぞ。
状態遷移図すなわちグローバル変数、というもんでもない。

というか、1つのプログラムの中に同時に複数の「状態(遷移空間)」を
持ち込もうと思ったら、言語を使うかどうかはさておき手法的には
どうしてもOOP風になるだろう。

>>137
>タッチブレークかけられるならグローバル変数の方が
>デバッグしやすかったりするね。

もしかしてデバッガの話っすか?
それなら、今のグローバル変数とかしか監視できないデバッガを
逝かせるほうが、先決だな。

「Objectデバッガ」とでも呼ぶべきものが欲しい。
まぁVC++でも真似事は出来るんだが。Objectのポインタ値(変数じゃなく値)を
DragDropすれば、使い勝手は悪いが一応1つの(動的に作られた)Objectを
ストーカーできる。
0139デフォルトの名無しさんNGNG
とりあえず。
グローバル大好きな、馬鹿がプロジェクトに紛れ込むと死ぬから
生理的に嫌悪。
(馬鹿じゃなければ良いんだけどね)

(もう、あのデスマーチは思い出したくない。
( 思い出したくなくても、時々夢にまで出てくる。
( 鬱ー
0140デフォルトの名無しさんNGNG
namespace global
{
int var;
char var2;
}

anyfunc(...)
{
using namespace global;

...
}

とか、どう?
0141デフォルトの名無しさんNGNG
>>140
小手先のテクニックはどうでもよいと思われ
0142デフォルトの名無しさんNGNG
グローバル変数がout of rangeにならないようにする工夫ってある?
0143>142NGNG
get/setグローバル関数でラップ
0144デフォルトの名無しさんNGNG
グローバル変数って素敵じゃないですか?
どうしてそんなに毛嫌いするんですか?
みなさんバカですか?
きっとそうなんだろうか。
世の中プログラムの何たるかを知らない奴がおおすぎるよ。
0145デフォルトの名無しさんNGNG
               ◎___
            .  //     /
              . // ソ   /
             // ラ  ./
             // ネ  /
            // /  ./
             // ヨ  /
       ∧空∧/___/
   _______ {´ ◎ `}< ソラネーヨ
  ,ィィ,ィィ\):::::::::(
  しししし(_つ:::::::::ヽ
   ヽ__ノ::::::::::::::|二手
      (;;;;;;;;;;;;;;;;;;;)
      // >>__
    <◎:::> <::::◎ノ
0146デフォルトの名無しさんNGNG
グローバル「定数」ならOK?
0147デフォルトの名無しさんNGNG
>>146
const int a = 100;
みたいなのか?
0148デフォルトの名無しさんNGNG
>>143
なるへそ。
0149デフォルトの名無しさんNGNG
>>148
ヴァカ発見(藁
0150デフォルトの名無しさんNGNG
>>147そうです。
0151147NGNG
>>150
俺は当然のように使うけど、だめなのかな。
0152デフォルトの名無しさんNGNG
>>143
ラッパー経由で書き込むと、このスレで追求してきた
メリットが失われませんか?
0153デフォルトの名無しさんNGNG
グローバル定数は使っていいに決まっている
0154デフォルトの名無しさんNGNG
>>153
使うべきときにのみ使おう。
なるべく使わなくて済むなら使わない。
どうしても使った方が見通しよくなるのであれば使う。
無意味にグローバル変数に 頼る のは好ましくない。
0155後発メンテ隊NGNG
作る方は楽だろーが、後でメンテするとき一つのグロが
100も200も見つかるとバグ要因探しきるのすんげーーー大変なんだよ。
使われ所を特定できるGetSet使っているほがまだ楽ヂャ。

っちゅうかモノ作るときに作り手が楽するためにグローバル使うな。
0156デフォルトの名無しさんNGNG
できるだけprotectedでいきましょう。
アホなオーバーフローすることがなくなります。
0157デフォルトの名無しさんNGNG
オイラはバカなんでグローバル変数を管理しきれる自信がありません。
なので使わないか、使うときでも static にして操作関数を extern
します。天才の皆様は使っていただいて構いませんが、僕とかかわる
ときはバカな僕に合わせてください。

そんとき「合わせられん」って言い訳は聞きませんのでそこんとこヨロシク。
0158デフォルトの名無しさんNGNG
とある下請けソフト会社の尻拭いするためにソースを見てたら、
int i,j,k;
というグローバル変数があった。情けなくてどっと疲れた。
もちろん、i,j,kはいたるところで、for文のループ変数として使われていただけだった・・・
その会社、つぶれたけどな。
■ このスレッドは過去ログ倉庫に格納されています