@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

なぜ「GOTO文」を使っては、いけないのですか?

投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-04-23 12:11
unibon です。こんにちわ。

For や Do/Loop などは、制御構造のためのデザインパターンとかフレームワークに相当するのではないでしょうか。で、それらを使わずにGOTO文を使うのは、パターンやフレームワークの存在を無視することに相当するような感じだと思います。
とくに、使用の有無が混在している状況はとっても良くないのではないでしょうか。制御をGOTO文(とせいぜい IF 〜 GOTO文)だけを使って書くのならまだマシかもしれません。
tak3
ベテラン
会議室デビュー日: 2004/04/15
投稿数: 80
お住まい・勤務地: 菜の花・銀杏
投稿日時: 2004-04-23 12:33
> なぜ、いけないのですか? シリーズ第2段です。
シリーズ化おめでとうございます(?)

えっと、前回のグローバル変数の時も思ったのですが・・・

”○○を使用しては、いけない”となると大抵は”例外がある”とか”使用してもいい”という
ということになると思います。

「○○を”安易に”使用しては、いけない」ということになると、使うときに何を考慮すれば良いのか?という方向に誘導できるのかなと・・・

で、GOTO文を安易に使われると(最近はみかけませんが)

1.制御フローが追いかけづらい
2.ソースを読む気がしない
3.メンテンナンスできない(メンテナンスする気になれない)

という結果が待っているのかと・・・

ラフィンさんのGOTOの使い方は”安易”でなく、”周到”な使い方だと思います。

[ メッセージ編集済み 編集者: tak3 編集日時 2004-04-23 12:38 ]
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-04-23 12:36
え?
「本物のプログラマはGOTOを使うことを恐れない」と言われていますが

# 冗談はともかく、longjmpとかどうなんだ、とか。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2004-04-23 12:56
引用:

NAL-6295さんの書き込み (2004-04-23 12:03) より:
#ついでに言えば、VB6では、上記の使い方を良くしてたけど、
#それ以外で、GOTO文使った事は無いなぁ。


 ですね(笑)
 「痒いところはかかないとしょーがない」レベルです。
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-04-23 12:57
引用:

ラフィンさんの書き込み (2004-04-23 12:04) より:
引用:

たーぞうさんの書き込み (2004-04-23 11:51) より:
gotoは言語仕様にないから(by Java使い)

はともかくとして^^;


 結構重要と思いますよ。

 暇がある人は、昔のCPUの機械語とかの本(情報処理試験って今もアセンブラあるの?あるならそれでもいいかも)をちょこっと見てください。

 コンピューターを動かす命令ってたいしたものはないんです。
 言語やミドルウェア等は便利に橋渡ししてくれるものです。
 GOTO文を使わなくていいように整理されているのが今の開発言語でしょう。


ワシの若いころはのぅ。FORTRAN Wなんてぇ言語があっての。IF文があるにはあったんじゃが、IFの中に書ける文は1つだけだったんじゃ。もちろんELSEなんてもんもなくてのぅ。ループ処理はDO〜CONTINUEだけで、こんな言語仕様ではGOTO文なしではプログラムは作りようがなかったんじゃ。

今の若ェもんは、GOTOを一度も使わんでプログラムを作るそうじゃが、そんなことでなにがプログラマーじゃ。日本を背負って立つプログラマーになりたいなら、今からでも入門し直して、GOTOプログラムの道を極めるのじゃ!ゲホゲホゲホ・・・


#でへへへ間違えました。×FOR ○DO でした。

[ メッセージ編集済み 編集者: たーぞう 編集日時 2004-04-23 14:58 ]
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-04-23 13:00
確か「GOTO文を使ってはいけない」というのが、公然と広まったのはBasicが広まった
ころだったと思います。

古いBasicの場合、行番号を付けてコーディングしないといけなかったんです。
で、大抵は後での追加等を考えて、10番飛ばしで行を発生させていました。

1000 処理
1010 IF 〜 Then 〜
1020 処理
1030 IF 〜 Then GOTO 1010
1040

ここに追加が入り、

1000 処理
1002 A=A+1
1003 B=B+1
1010 IF 〜 Then 〜
1020 処理
1030 IF 〜 Then GOTO 1010
1040

という風に入れるわけですが、この後にも1002と1003の間に追加があるかもしれない、
ということと、どうも見た目にスッキリしないということで、Renumberというコマンド
を発行すると、また10番飛ばしで番号を発生させてました。ですが、Verやバグ(という
か仕様)で、行番号は振りなおしてくれても、Then GOTO の後の行番号はそのままに
なっている場合もあって...

1000 処理
1010 A=A+1
1020 B=B+1
1030 IF 〜 Then 〜
1040 処理
1050 IF 〜 Then GOTO 1010
1060

とこうなってしまったりして、グチャグチャになってしまったりしていたんです。
なので、「GOTO 行番号 は使うな」ということが広まったんでしょう。

新しい言語では、ラベルへのGOTOができたり、GOTOそのものが無かったりするので
こんなことにはならないと思いますが、ルーツ的にはこんなところにあるように思う
のです。
ただ、割り込みや全くプロセスを切り替えなければならない場合、GOTOを使わざる
を得ない事もありますね。(使わないようにもできるけど、構造から全部変えないと
いけないとか...)

※余談ですが、GOTOってなんでGO TO じゃないんでしょうねぇ?
 昔、作ったプログラムソースを印刷して、人にチェックしてもらった際、返された
 ソースにいたるところに赤ペンでGOTO、GOTOって指摘された覚えがあります。
 どこへGOTOすればよいか散々悩んでもわからなかったので、チェックした人に
 「教えてください」って聞きにいったところ、実はそれはこのチェックした人
 (後藤さん)のサインだったのでした。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-04-23 13:07
NAL-6295です。

一概には言えないかもしれませんが・・・

例外を除いた通常処理でGOTO文使わないといけない状況になったら、「リファクタリングしろ。」のサインかもしれません。
不吉な匂いって奴です。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-04-23 13:18
引用:

はにまるさんの書き込み (2004-04-23 11:22) より:
では、教えてください。
なぜ「GOTO文」を使っては、いけないのですか?


使ってよろしいです!
私が許可します。
アイ アム ソリー^^

_________________

スキルアップ/キャリアアップ(JOB@IT)