@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- @IT情報マネジメント 会議室 Indexリンク
- IT戦略
- 仕事の改善
- アーキテクチャ
- プロジェクト管理
- ITインフラ
- Webマーケティング
- BPMプロフェッショナル
- 業務アプリ
- - PR -
なぜ「GOTO文」を使っては、いけないのですか?
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-04-23 13:26
>Beatle様
確かにGOTO悪者論の黎明とBASIC言語の普及とは時期的に重なっていたと思いますが、しかしその当時はBASICはまだホビーとして使われることが多く、業務プログラムはアセンブリ言語、COBOLあるいはFORTRANで書かれていることが多かったと思います。 GOTO悪者論は、やはり処理の追いにくさが理由の第1位で、単にBASICにおける言語仕様に由来するものではなかったと記憶していますが。(昔のFORTRANも、GOTO 行番号です。) ※ちなみにCOBOLでは GO TO です。多くの言語でGOTOになっているのは、その方が構文解析がシンプルにできる、といった程度の理由ではないでしょうか。 | ||||||||||||||||||||||||
|
投稿日時: 2004-04-23 13:28
プログラムが続行不可能な状態では、GOTO 使って異常終了させるのは有効だと思いますね。
その後処理できる事といえば、メッセージ出力くらいでしょうから。 | ||||||||||||||||||||||||
|
投稿日時: 2004-04-23 13:36
グローバル変数より、早く終わる話と思ったのに...
1時間足らずで、予想が甘い事を痛感させられました。 処理制御の話だけに、「グローバル変数」より話が深いかも...
たーぞうさんの示された内容は、処理制御の最小単位を構成する話で、言語表現する場合は、 その構造をそのまま用いる事は少ないのでは無いでしょうか? 私のGOTO文を使って良いというのは、定義した6パターンの制御の代行としての御話です。 どちらかと言えば、GOTO文が基本で、GOTO文で良くあるパターンを 定義したのが、For文 While文、Break文、Return文と考えています。 実際にGOTO文を使わないと決めた場合の対策を考えると 下記の通りとなります。 1.「指定回数まで繰返制御する」構文が無い場合。 ・Do..Loop文+カウンター変数を用いる。 ・Do..Loopが無い場合、、、無理では.. 2.「指定条件まで繰返制御する」構文が無い場合。 ・無理では.. 3.「指定条件で分岐制御する」構文が無い場合。 ・IF文の多重構成(あれ、GOTO関係ないか) 4.「繰返制御を抜ける」構文が無い場合。 ・繰返を抜ける条件を設定し エラーフラグを用いて、繰返内部の構文を個別に全てIF文で囲む。 ・繰返内部をルーチン化して、Exit ルーチンを代行して使う。 5.「繰返制御の開始位置に戻る」構文が無い場合。 ・エラーフラグを用いて、繰返内部の構文を個別に全てIF文で囲む。 ・繰返内部をルーチン化して、Exit ルーチンを代行して使う。 6.「特定処理を呼出て戻す」構文が無い場合。 ・とにかくコードをコピー&ペースト(そういう問題か?) 私は、GOTO文を使います... | ||||||||||||||||||||||||
|
投稿日時: 2004-04-23 13:56
そういえば、昔は行番号指定でGOTO文記述していたんですよね...
ラベル指定で出来る言語見て感動しました。(ってVBだけど) サブルーチン概念が無い時は、GOSUB文ってのもありましたね。 所で昔のC言語は、アドレス指定で処理をジャンプするんですか? | ||||||||||||||||||||||||
|
投稿日時: 2004-04-23 14:02
私が思うに、一つのプログラム/関数/サブルーチン内で上へ下へ交差するように使う人が居たから嫌われたんだと思います。昔の Basic の「goto 行番号」が見づらいのは間違いないと思いますが?
># 冗談はともかく、longjmpとかどうなんだ、とか これは Goto と同じくくりにしてはいけないような気もしますが。でも、使い方を間違えるととんでもない事になるのは間違いありませんね。 >プログラムが続行不可能な状態では、GOTO 使って異常終了させるのは有効だと思いま >すね。 >その後処理できる事といえば、メッセージ出力くらいでしょうから Basic に限って言えば、こういうパターンは、On error と error の組み合わせて try/catch みたいな形にしても良いかと思います。「Goto なんか使ってる!」とも言われないし | ||||||||||||||||||||||||
|
投稿日時: 2004-04-23 14:07
VBやVBScriptでループ中のbreack,continueを使いたいときに
コメントにゴメンって書いて使った覚えがあるなー。 | ||||||||||||||||||||||||
|
投稿日時: 2004-04-23 14:14
人それぞれですから^^;
i = 0; while(i < 10) { : i = i + 1; } でできます。
実行文1 while(not 指定条件) { 実行文1 } でできます。同じ処理を2箇所に書かなければなりませんが。 #追記 # # flag = true; # while(flag or not 指定条件) { # 実行文 # flag = false; #} # #でもできます^^;
そうですね。
まぁこれはあった方がいいですよね^^;
場合によっては、私もGOTOを使うことがあります。 skulkerさんが書かれたように、プログラムの途中でそのプログラムを抜け出てしまうようなコーディングはなんとなくいや(趣味の領域か?)なので、可能ならばGOTOでプログラムの最後まで飛ばしてしまう、ということは時々やります。 [ メッセージ編集済み 編集者: たーぞう 編集日時 2004-04-23 14:17 ] [ メッセージ編集済み 編集者: たーぞう 編集日時 2004-04-23 14:40 ] | ||||||||||||||||||||||||
|
投稿日時: 2004-04-23 14:28
ですね。 かなり逆説的ですが、Forループ、Whileループ、Doループといった今時の プログラムでは当たり前のループですが、すべてIF文とGOTO文で書けるんですねぇ... ※GOTO文恐るべし... ってこんな何でもかんでもGOTOで書いてしまうような事するから、「使うな!」って なるんでしょうね。 [ メッセージ編集済み 編集者: Beatle 編集日時 2004-04-23 14:30 ] |