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

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

投稿者投稿内容
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-23 11:22
はにまるです。

なぜ、いけないのですか? シリーズ第2段です。

今回は、「GOTO文」

これまた、基本的な話ですので、どなたでも、個人的見解を述べれると思います。
完璧な返答は要りまん。

 あなたの答えは、今年技術者になった方の為の返答です。
 あなたの答えは、基礎技術を飛ばしてきた方の為の返答です。
 あなたの答えは、これから設計者を目指す方への基本的アドバイスです。
 あなたの答えは、小難しい技術論に追われ簡単な説明を忘れた方の為の返答です。


【当スレッドでの厳禁事項】
  xxx本を読め!xxxHPを見ろは禁止致します。
  その言葉に貴方のアイデンティティが無く、議論が出来なくなるからです。
  言葉の引用はOKです。

では、教えてください。
なぜ「GOTO文」を使っては、いけないのですか?
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-23 11:30
前回は、別スレッドである程度、議論させてもらってから
後だし投稿をしたので、自分でも「美味い所だけ頂いたな」と思っています。
と言う事で、今回はまず、私から投稿しておきます。

「GOTO文を使うな」は、過去の遺産になりつつある言語記述制約と考えます。

昔の言語は、現在の言語程、「繰返制御、処理呼出制御、多分希制御、エラー制御」の
構文が十分で無かった為、GOTO文が基本でした。

直線的な処理で記述されたプログラムでは、
処理制御に、Aの場合はxxxに飛べ、Bの場合はxxxに飛べ、という流れになり、
上から下へ一直線に記述された流れに幾つかの支流が発生し、
各支流に出口があったり支流と支流が幾つも合流する等、
アマゾン川の流れの様なプログラムが数多く生産され、
プログラム分析やテストに多大な負担が掛り、品質を悪化させていました。

この複雑な流れを階層型にし、主流(大きな流れ)から支流(小さな流れ)に流れても、
支流の流れが終わったら、主流に戻す形式で、流れを解り易くする構成が基本となりました。
これが、構造化プログラミングで、この構成にする為に構造化に適した構文が考え出され
GOTO文が不要となり、その時の定番的台詞が「GOTO文を使うな」と考えます。

現在では、正常処理の制御で
 1.指定回数まで繰返制御する For文
 2.指定条件まで繰返制御する Do..Loop文(While/Until)
 3.指定条件で分岐制御する  Case文
 4.繰返制御を抜ける     Break文
 5.繰返制御の開始位置に戻る Return文
 6.特定処理を呼出て戻す   Call文
がありますが、

上記1〜5が揃っていない言語では、その代用として「GOTO文」を利用しても、
問題が無いと思います。

若い人は、「GOTO文」自体を使った事が無いと思いますので
「GOTO文」を使うなの言葉より、「構造化プログラミング」の
基本的な御話をした方が宜しいかと思います。

また、最近の言語では、エラーのフロー制御は言語が勝手にやってくれる分、
理解に乏しい人も多いので、そこも説明する必要があると考えます。

# 私は正規の教育で構造化手法を学んだ訳では無いので、
# もしかすると、「構造化」のキーワードに対する説明が間違っているかもしれません。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2004-04-23 11:43
 では、今回は基本から。

 GOTO文は処理の流れを構成する「ジャンプ」に相当します。
 比較対象としてIF文を挙げてみようと思いますが、IF文ははにまるさんは「分岐」と位置付けしましたが、考えようによると「条件付きジャンプ」です。

 GOTO文は行き先をコーダーが指定するジャンプです。
 IF文は論理式がTRUEであれば続行、FALSEであればEndIfの次(指定があればELSE)と言う風にルールが決められたジャンプです。

 例えばルールを決めたGOTO文はどんな感じでしょう?(VBを例とする)

Try:
On Error Goto Catch
(処理)
Goto Finally
Catch:
(例外処理)
Finally:
(最終処理)
On Error Goto 0
End_Try:

 こういう感じの場合、私は読みにくいとは思いません。
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-04-23 11:51
gotoは言語仕様にないから(by Java使い)

はともかくとして^^;
引用:

はにまるさんの書き込み (2004-04-23 11:30) より:
現在では、正常処理の制御で
 1.指定回数まで繰返制御する For文
 2.指定条件まで繰返制御する Do..Loop文(While/Until)
 3.指定条件で分岐制御する  Case文
 4.繰返制御を抜ける     Break文
 5.繰返制御の開始位置に戻る Return文
 6.特定処理を呼出て戻す   Call文
がありますが、

上記1〜5が揃っていない言語では、その代用として「GOTO文」を利用しても、
問題が無いと思います。


あらゆる処理は、
 A.順次処理(処理の並び)
 B.分岐処理(if)
 C.繰り返し処理(while ・・・ 型のループ)

の組み合わせによって記述できるので、はにまるさんの提示された1〜6までの言語仕様を満たしていないからといってgotoを使用してよいという説明にはならないと思うのですが、はにまるさんがそのように仰られた意図をご説明いただけますでしょうか。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-04-23 11:52
るぱんです。

Basicを考えて見ました。
1010 If 〜 Then Goto 飛び先
1020 ElseIf 〜 Then Goto 飛び先
1030 ElseIf 〜 Then Goto 飛び先
1040 Else
1050 End If
と考えた場合、Gotoの飛び先までが
現在でいうプロシージャの内側の場合はすっきりすると思います。

Goto文は上にも戻れる所が問題になると考えます。
Goto文のサブルーチン作ると処理が指数的に伸びてくるんじゃないかな?と。

共通関数でもライブラリでもなんでもない関数を作り出しちゃうことができるんですよね。


他にも
2010
2020 処理1
2030 If 処理1結果 = 特定の値 Then Goto2010
2040 処理2
2050 If 処理2結果 = 特定の値 Then Goto2040
2060 Goto 2010

こんなケースの場合、僕はメンテナンスする気は失せます。
というか、これだと無限ループになるし。汗

オブジェクト指向技術に関する一考察 」なんてのも見つけてみました。
skulker
常連さん
会議室デビュー日: 2003/11/13
投稿数: 41
投稿日時: 2004-04-23 12:01
若い人でもWindowsのバッチファイルを書いた事あるなら goto :label_name の嵐に出会い、制御を追っかけるのに苦労した事はあるのでは。

個人的には、
・ひとつのサブルーチン中にreturnが複数ある
・ループからのbreak
はあまり美しくないと感じます。入口・出口はなるべくひとつにしたいです。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-04-23 12:03
NAL-6295です。
引用:

ラフィンさんの書き込み (2004-04-23 11:43) より:
 例えばルールを決めたGOTO文はどんな感じでしょう?(VBを例とする)

Try:
On Error Goto Catch
(処理)
Goto Finally
Catch:
(例外処理)
Finally:
(最終処理)
On Error Goto 0
End_Try:

 こういう感じの場合、私は読みにくいとは思いません。



同意。
これだけだと、アイデン&ティティが無いから禁止投稿かな。

と言う事で・・・

無秩序な状態であれば、GOTOに関わらず読みにくいけど、
秩序(ルール)があれば、特に使っていけないと言う事は無いのでは?

#まぁ、ルール次第だけど。

#ついでに言えば、VB6では、上記の使い方を良くしてたけど、
#それ以外で、GOTO文使った事は無いなぁ。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2004-04-23 12:04
引用:

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

はともかくとして^^;


 結構重要と思いますよ。

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

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

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