@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- @IT情報マネジメント 会議室 Indexリンク
- IT戦略
- 仕事の改善
- アーキテクチャ
- プロジェクト管理
- ITインフラ
- Webマーケティング
- BPMプロフェッショナル
- 業務アプリ
- - PR -
なぜ「GOTO文」を使っては、いけないのですか?
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-04-25 22:52
エラーのハンドリングをしておかないと、トランザクションを開始していようがファイルをオープンしていようが、エラーが発生した時点で処理がとまっちゃうからです。GOTOの問題とは別ですね。 | ||||||||||||||||
|
投稿日時: 2004-04-25 23:17
こんにちは。
グローバル変数の件と同じですが、gotoそのものが悪いと思わなく、gotoなしでも プログラムは可能で、めったに使うこともないですが、たまに多重ループから一気に抜けたい 場合に便利かなとも思います。たまにJavaでめんどくさいなと思ったことはあります。 ま、そんな複雑な多重ループを書くこともそんなにないですが。 話はそれますが、ちなみに gosub〜return は絶対悪だと思います。 VBでもたまに馬鹿でかいSUBのなかにgosub〜returnを連発しているプログラムを見かけます。 | ||||||||||||||||
|
投稿日時: 2004-04-25 23:59
それは「何故エラーハンドリングが必要か」であって「何故エラーハンドリングの場合は On Error Goto の形で goto を使ってよいのか」ではないですよね。 # VBの言語仕様は知りませんが
そんなときのラベルつきbreak。 ・・・でも私は使わないです。 | ||||||||||||||||
|
投稿日時: 2004-04-26 06:33
VBの言語の仕様の関係です。「goto または 即停止 または エラー無視」。 「エラー無視」でもハンドリングできないことはないですが... [ メッセージ編集済み 編集者: ラフィン 編集日時 2004-04-26 06:35 ] | ||||||||||||||||
|
投稿日時: 2004-04-26 07:28
「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 ] | ||||||||||||||||
|
投稿日時: 2004-04-26 10:26
ご返答ありがとうございます。 私が、るぱんさんの返答をスルーしてしまった理由は、 m.kuさんが述べられている、「使われ方がお決まりの方法」にあります。 多分、皆様も暗黙的に下記の様な構造で考えたのでは無いでしょうか?
これは「1.パターン化されている」、「2.ルーチン外に出る事は無い。」の2つがあり 私は一番大きな点は、「2.ルーチン外に出る事は無い。」としました。 これ実は、Goto も IF Gotoも一緒です。 他の言語でも、ルーチンやメソッドを超えるジャンプ命令は無理では無いでしょうか? 結局、GOTO文は、この「ルーチン外へ飛ぶ事は出来ない」制約により 現在のプログラム構造で使う場所とは限られてくると思います。 話を聞く限り、ループ系処理に集中していますね。 GOTO文が及ぼす、悪例のプログラム構成を「スパゲティ」に例えますが、 これは、ルーチン構成等の処理分割で大半が解決されると考えます。 後は、ルーチン内の問題ですが、ここで「GOTO文」を問題とする場合、 もしかすると、既存のGOTO文の問題とは別物かもしれません。 # ってそこまで答えが出なかった。 | ||||||||||||||||
|
投稿日時: 2004-04-26 12:45
ご返答ありがとうございます。 そっか!エラー処理という観点から考えれば話が早いんですね。 私が知る限りエラー処理手段として 1.呼出元に処理エラーで返す。またはプロセスエラー 2.規定の箇所へジャンプする。 3.処理を続行する。 の3パターンで On Error Goto は 他の通常処理の Gotoとは違い、 エラー処理手段で指定箇所へジャンプする唯一の手段ですので、 使わざるを得ないんですね。(「使わざるを得ない」で字は、良いのかな?) でも、VBは3つのエラーパターンが選べる珍しい言語(と思っている)ですね。 他言語にもエラー手段を選択出来るのはあるのかな? | ||||||||||||||||
|
投稿日時: 2004-04-26 13:18
遅レスごめんなさいですぅ。
はい、私も「BASICは全く無関係です」と書いてはおりません。 |