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

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

投稿者投稿内容
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2004-04-25 22:52
引用:

はにまるさんの書き込み (2004-04-25 18:40) より:

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



 エラーのハンドリングをしておかないと、トランザクションを開始していようがファイルをオープンしていようが、エラーが発生した時点で処理がとまっちゃうからです。GOTOの問題とは別ですね。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2004-04-25 23:17
こんにちは。

グローバル変数の件と同じですが、gotoそのものが悪いと思わなく、gotoなしでも
プログラムは可能で、めったに使うこともないですが、たまに多重ループから一気に抜けたい
場合に便利かなとも思います。たまにJavaでめんどくさいなと思ったことはあります。
ま、そんな複雑な多重ループを書くこともそんなにないですが。

話はそれますが、ちなみに gosub〜return は絶対悪だと思います。
VBでもたまに馬鹿でかいSUBのなかにgosub〜returnを連発しているプログラムを見かけます。
skulker
常連さん
会議室デビュー日: 2003/11/13
投稿数: 41
投稿日時: 2004-04-25 23:59
引用:

引用:

なぜ、On Error Goto はセーフなんですか?


 エラーのハンドリングをしておかないと、トランザクションを開始していようがファイルをオープンしていようが、エラーが発生した時点で処理がとまっちゃうからです。GOTOの問題とは別ですね。


それは「何故エラーハンドリングが必要か」であって「何故エラーハンドリングの場合は On Error Goto の形で goto を使ってよいのか」ではないですよね。
# VBの言語仕様は知りませんが

引用:

たまに多重ループから一気に抜けたい場合に便利かなとも思います。たまにJavaでめんどくさいなと思ったことはあります。


そんなときのラベルつきbreak。
・・・でも私は使わないです。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2004-04-26 06:33
引用:

skulkerさんの書き込み (2004-04-25 23:59) より:
引用:

引用:

なぜ、On Error Goto はセーフなんですか?


 エラーのハンドリングをしておかないと、トランザクションを開始していようがファイルをオープンしていようが、エラーが発生した時点で処理がとまっちゃうからです。GOTOの問題とは別ですね。


それは「何故エラーハンドリングが必要か」であって「何故エラーハンドリングの場合は On Error Goto の形で goto を使ってよいのか」ではないですよね。
# VBの言語仕様は知りませんが


 VBの言語の仕様の関係です。「goto または 即停止 または エラー無視」。
 「エラー無視」でもハンドリングできないことはないですが...

[ メッセージ編集済み 編集者: ラフィン 編集日時 2004-04-26 06:35 ]
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2004-04-26 07:28
引用:

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

skulkerさんの書き込み (2004-04-25 23:59) より:
引用:

引用:

なぜ、On Error Goto はセーフなんですか?


 エラーのハンドリングをしておかないと、トランザクションを開始していようがファイルをオープンしていようが、エラーが発生した時点で処理がとまっちゃうからです。GOTOの問題とは別ですね。


それは「何故エラーハンドリングが必要か」であって「何故エラーハンドリングの場合は On Error Goto の形で goto を使ってよいのか」ではないですよね。
# VBの言語仕様は知りませんが


 VBの言語の仕様の関係です。「即停止 または goto または エラー無視」。
 「エラー無視」でもハンドリングできないことはないですが...



 「On Error ○○」を一切書かない場合、エラーが発生した時にVBが(コーディングしていない)メッセージを出力して処理停止します。例えばOLEでEXCELファイルを開いた状態でそれが発生すると、その後でEXCELやOLEの後処理を記述していてもそこは処理されません。(VBの仕様)
 機能的にそれで問題がない場合、gotoを使う必要はありません。

 「On Error Renume Next」(エラーを無視)を記述した場合、エラーで処理が止まるのではなく無視されます。エラー自体はErrオブジェクトで把握している状態なので、ステートメント毎に直後でErr.Numberプロパティを確認することでエラーは把握できます。
 まめにOn Error Gotoなしで制御する方がよい人はgotoを使う必要はありません。

 On Error Gotoを使わないと結局処理が煩雑になりやすいので「セーフ」かなあ?
 
「編集」するつもりが「引用」してしまったので編集

[ メッセージ編集済み 編集者: ラフィン 編集日時 2004-04-26 07:30 ]
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-26 10:26
引用:

m.kuさんの書き込み (2004-04-25 19:28) より:
> 「そうだよね、セーフだよね。」と思われた方、
> なぜ、On Error Goto はセーフなんですか?

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

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


ご返答ありがとうございます。

私が、るぱんさんの返答をスルーしてしまった理由は、
m.kuさんが述べられている、「使われ方がお決まりの方法」にあります。
多分、皆様も暗黙的に下記の様な構造で考えたのでは無いでしょうか?
コード:

ルーチン開始
  On Error Goto エラー処理:

    (ルーチン処理)

    Exit ルーチン

  エラー処理:
    (ルーチン内のエラー処理)
ルーチン終了



これは「1.パターン化されている」、「2.ルーチン外に出る事は無い。」の2つがあり
私は一番大きな点は、「2.ルーチン外に出る事は無い。」としました。

これ実は、Goto も IF Gotoも一緒です。
他の言語でも、ルーチンやメソッドを超えるジャンプ命令は無理では無いでしょうか?

結局、GOTO文は、この「ルーチン外へ飛ぶ事は出来ない」制約により
現在のプログラム構造で使う場所とは限られてくると思います。
話を聞く限り、ループ系処理に集中していますね。

GOTO文が及ぼす、悪例のプログラム構成を「スパゲティ」に例えますが、
これは、ルーチン構成等の処理分割で大半が解決されると考えます。

後は、ルーチン内の問題ですが、ここで「GOTO文」を問題とする場合、
もしかすると、既存のGOTO文の問題とは別物かもしれません。
# ってそこまで答えが出なかった。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-04-26 12:45
引用:

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

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


 エラーのハンドリングをしておかないと、トランザクションを開始していようがファイルをオープンしていようが、エラーが発生した時点で処理がとまっちゃうからです。GOTOの問題とは別ですね。


ご返答ありがとうございます。
そっか!エラー処理という観点から考えれば話が早いんですね。

私が知る限りエラー処理手段として
  1.呼出元に処理エラーで返す。またはプロセスエラー
  2.規定の箇所へジャンプする。
  3.処理を続行する。
の3パターンで On Error Goto は 他の通常処理の Gotoとは違い、
エラー処理手段で指定箇所へジャンプする唯一の手段ですので、
使わざるを得ないんですね。(「使わざるを得ない」で字は、良いのかな?)

でも、VBは3つのエラーパターンが選べる珍しい言語(と思っている)ですね。
他言語にもエラー手段を選択出来るのはあるのかな?
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-04-26 13:18
遅レスごめんなさいですぅ。

引用:

ぽんすさんの書き込み (2004-04-23 20:38) より:
引用:

たーぞうさんの書き込み (2004-04-23 13:26) より:
確かにGOTO悪者論の黎明とBASIC言語の普及とは時期的に重なっていたと思いますが、しかしその当時はBASICはまだホビーとして使われることが多く、業務プログラムはアセンブリ言語、COBOLあるいはFORTRANで書かれていることが多かったと思います。


えーと、「GOTOは有害だ」と言ったのも「BASICなんかやってると脳に回復
不可能なダメージを受けてしまう」と言ったのもどちらもDijkstra先生で、
# 私の脳ミソがDijkstra先生の主張の正しさを裏付けている
それらは「構造化プログラミングしましょう」という主張の一環なわけで。
主敵はFORTRANあたりであるにしても、BASICもやっぱりGOTO問題に含まれて
いるんじゃあないかなあ、と思うです。


はい、私も「BASICは全く無関係です」と書いてはおりません。

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