@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- @IT情報マネジメント 会議室 Indexリンク
- IT戦略
- 仕事の改善
- アーキテクチャ
- プロジェクト管理
- ITインフラ
- Webマーケティング
- BPMプロフェッショナル
- 業務アプリ
- - PR -
なぜ「GOTO文」を使っては、いけないのですか?
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-04-23 11:22
はにまるです。
なぜ、いけないのですか? シリーズ第2段です。 今回は、「GOTO文」 これまた、基本的な話ですので、どなたでも、個人的見解を述べれると思います。 完璧な返答は要りまん。 あなたの答えは、今年技術者になった方の為の返答です。 あなたの答えは、基礎技術を飛ばしてきた方の為の返答です。 あなたの答えは、これから設計者を目指す方への基本的アドバイスです。 あなたの答えは、小難しい技術論に追われ簡単な説明を忘れた方の為の返答です。 【当スレッドでの厳禁事項】 xxx本を読め!xxxHPを見ろは禁止致します。 その言葉に貴方のアイデンティティが無く、議論が出来なくなるからです。 言葉の引用はOKです。 では、教えてください。 なぜ「GOTO文」を使っては、いけないのですか? | ||||
|
投稿日時: 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文」を使うなの言葉より、「構造化プログラミング」の 基本的な御話をした方が宜しいかと思います。 また、最近の言語では、エラーのフロー制御は言語が勝手にやってくれる分、 理解に乏しい人も多いので、そこも説明する必要があると考えます。 # 私は正規の教育で構造化手法を学んだ訳では無いので、 # もしかすると、「構造化」のキーワードに対する説明が間違っているかもしれません。 | ||||
|
投稿日時: 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: こういう感じの場合、私は読みにくいとは思いません。 | ||||
|
投稿日時: 2004-04-23 11:51
gotoは言語仕様にないから(by Java使い)
はともかくとして^^;
あらゆる処理は、 A.順次処理(処理の並び) B.分岐処理(if) C.繰り返し処理(while ・・・ 型のループ) の組み合わせによって記述できるので、はにまるさんの提示された1〜6までの言語仕様を満たしていないからといってgotoを使用してよいという説明にはならないと思うのですが、はにまるさんがそのように仰られた意図をご説明いただけますでしょうか。 | ||||
|
投稿日時: 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 こんなケースの場合、僕はメンテナンスする気は失せます。 というか、これだと無限ループになるし。汗 「オブジェクト指向技術に関する一考察 」なんてのも見つけてみました。 | ||||
|
投稿日時: 2004-04-23 12:01
若い人でもWindowsのバッチファイルを書いた事あるなら goto :label_name の嵐に出会い、制御を追っかけるのに苦労した事はあるのでは。
個人的には、 ・ひとつのサブルーチン中にreturnが複数ある ・ループからのbreak はあまり美しくないと感じます。入口・出口はなるべくひとつにしたいです。 | ||||
|
投稿日時: 2004-04-23 12:03
NAL-6295です。
同意。 これだけだと、アイデン&ティティが無いから禁止投稿かな。 と言う事で・・・ 無秩序な状態であれば、GOTOに関わらず読みにくいけど、 秩序(ルール)があれば、特に使っていけないと言う事は無いのでは? #まぁ、ルール次第だけど。 #ついでに言えば、VB6では、上記の使い方を良くしてたけど、 #それ以外で、GOTO文使った事は無いなぁ。 | ||||
|
投稿日時: 2004-04-23 12:04
結構重要と思いますよ。 暇がある人は、昔のCPUの機械語とかの本(情報処理試験って今もアセンブラあるの?あるならそれでもいいかも)をちょこっと見てください。 コンピューターを動かす命令ってたいしたものはないんです。 言語やミドルウェア等は便利に橋渡ししてくれるものです。 GOTO文を使わなくていいように整理されているのが今の開発言語でしょう。 |