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

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

投稿者投稿内容
踏蹟
会議室デビュー日: 2003/09/12
投稿数: 10
投稿日時: 2004-04-24 00:35
私ごときアマチュアがこの会議室で発言するのも気が引けますが。

その昔、林晴比古氏が著書「BASICによるプログラミングスタイルブック」(およびその姉妹編「Cによるプログラミングスタイルブック」)で書かれていたことです。

1.GOTO文を使うことを覚えよ
2.GOTO文を使わないことを覚えよ
3.時々GOTO文を使うことを覚えよ

GOTO文というか分岐構文というものを知らなければ、そもそもプログラムを組むことはできない。だからまずGOTO文を使うことを覚えなければならない。

GOTO文の機能を知ったうえで、下手にGOTO文を使えばプログラムの流れが追いにくくなり収拾がつかなくなることから、構造化プログラミングの理論とそのための構文が発明され、GOTO文の機能はそれらの構文によって隠蔽されるようになった、ということを理解すべきである。この段階では裸のGOTO文を使わないプログラムを覚えなければならない。
(「BASICによる〜」では古典的BASICで行展開IF文もどきやSWITCH構文もどきを書く手法を紹介しています。もちろんGOTO文無しでは実現できませんが、決まりきった書き方とすることでスパゲッティプログラム的なGOTO文の使い方とは一線を画しています。)

GOTO文を使わないプログラムを書けるようになった上で、それでもGOTO文を使ったほうが分かりやすいプログラムが書ける場合もある、ということが分かるようになれば一人前である。

というような趣旨でした。

「BASICによる〜」は読んで本当に感動する書籍でした。職場でたまにN88BASICのプログラムをメンテナンスする機会がありますが、あの本で学んだことはしっかり使わせてもらっています。


上記の3か条って、グローバル変数にもそのまま当てはまることですよねえ。
太子
常連さん
会議室デビュー日: 2004/04/22
投稿数: 22
お住まい・勤務地: デスマで登る山の頂上
投稿日時: 2004-04-24 02:40
確かに! Goto エラー以外にはあんまり見ないし使いませんね
N88Basicを使ってたころは別けわからず使ってました

なぜって聞かれると うぅーん 見にくいから・・・?
ヒデ
ベテラン
会議室デビュー日: 2002/12/12
投稿数: 76
お住まい・勤務地: 横浜
投稿日時: 2004-04-24 08:28
別に使ってもいいのでは?

私自身は、あまり使用しませんが、Driver などでは異常から抜けるのに
gotoは良く見かけます。
gotoを使用しないようにすると、かえって構文が複雑になる場合も多く
そこまでして gotoを排除する必要はないでしょう。

昔、某大富豪が学生時代に作ったといわれる M○AS○C のソースを見たことが
ありますが、subroutine のなかで、jmp ret が多用してあり解析に苦労しました。
call ret より1命令 処理が節約できるのでそのためのようでしたが・・・

今でも1チップの世界などでは、見易さよりサイズとか処理速度を
優先する場合があるようです。
Shimazaki Ken
ベテラン
会議室デビュー日: 2002/07/21
投稿数: 70
お住まい・勤務地: 東京
投稿日時: 2004-04-24 09:26
引用:

たーぞうさんの書き込み (2004-04-23 11:51) より:
あらゆる処理は、
 A.順次処理(処理の並び)
 B.分岐処理(if)
 C.繰り返し処理(while ・・・ 型のループ)

の組み合わせによって記述できるので、はにまるさんの提示された1〜6までの言語仕様を満たしていないからといってgotoを使用してよいという説明にはならないと思うのですが、はにまるさんがそのように仰られた意図をご説明いただけますでしょうか。


てかアレですね、 GOTO 的な挙動はプログラミングに必要だという認識は言語設計者にもあって、
それでも「どこへでも飛ばせてしまう」のはやっぱりマズいということで、
Break や Continue や try catch や On Error なんて形で、
「制限付き GOTO 文」を実装させてます。

GOTO 文は有害ですが、百害有って一利なしって程でもない。
その一利をおいしく拾うために、制限を加えて害を及ぼしにくくした GOTO 文が用意されているわけです。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-25 18:40
引用:

るぱんさんの書き込み (2004-04-23 15:45) より:
On Error Gotoはありですよね?(冷汗)


実は、私もルパンさんのこの台詞を一旦、聞き流してしまいました。
VBされている方の大多数は「そうだよね、セーフだよね。」と思ったのでは無いでしょうか?

でも個人的に「ん?」と引っかかり考えて見ると、自分なりの見解が発生したのですが、
そのまま、いつも通りに見解を述べるのも面白く無いので!
意地悪に聞きます。

「そうだよね、セーフだよね。」と思われた方、
なぜ、On Error Goto はセーフなんですか?

はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-25 18:46
引用:

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

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


ちょこっと脱線。

いいですね。例外を「Catch:」にし頭で「Try:」と書くの

私は、PL/SQLも良く使っているのでエラー処理のラベル名を「Exception」にする事が多いです。
サブルーチン毎にこのラベル名を変えている組織もあるのですが、あれは止めて欲しい。

はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-25 19:24
引用:

踏蹟さんの書き込み (2004-04-24 00:35) より:
私ごときアマチュアがこの会議室で発言するのも気が引けますが。


私は、正直「やられた〜」と思いました。

「あたりまえ」と思っても、それを発言する、つまり、
自分の脳の引出しから取り出す行為は、非常に難しいのモノです。
踏蹟さんがこの様に投稿された事で、
皆さんの脳に「GOTO文」=「3か条」が強く結びつき、
1つのまとまった情報として管理出来て今後、瞬時に脳から引き出せる様になります。

引用:

上記の3か条って、グローバル変数にもそのまま当てはまることですよねえ。


個人的には「グローバル変数」のみにとどまらず、「物事を学ぶ際の基本」又は
「物事を学ぶ際に一歩上行く技術」と考えても宜しいかと思います。

皆様も、他に何かあれば基本的だからと思わずに投稿して下さい。
m.ku
大ベテラン
会議室デビュー日: 2002/09/15
投稿数: 184
投稿日時: 2004-04-25 19:28
> 「そうだよね、セーフだよね。」と思われた方、
> なぜ、On Error Goto はセーフなんですか?

別にGOTO自体は悪いとは思ってない(使い方の問題)ですが、
これに関しては「制御の自由度が低いし使われ方がお決まりの方法」なので
プログラムの制御が書き手の支配化から逸脱することが少ないからでしょう。

ただのGOTOだと無節操に使うと、書き手の支配下から逸脱した動作を
簡単に起こしやすくなりますが、これは概ねパターン化してますから。

つまり逆をいえば、ただのGOTOでもパターン化した使い方を決めておき
それを守っているうちはOn Error Goto並みの使い方ができる訳です。
#ん〜内容的に殆ど既出なのがいまいち。

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