goto文とは?開発現場で嫌われる理由とは

ソフトウェア・開発
goto文をざっくりと
  • プログラムの実行を、指定した場所へ無条件に移動させる命令である
  • 分かりづらく読みにくいコードになる可能性がある
  • 古いプログラミング言語に多く見られる

もっとくわしく知りたい人は続きをどうぞ!

goto文をわかりやすく

goto文とは

goto文とは、プログラムの実行順序を、現在位置からプログラム内の別の場所へ強制的に移すための命令。これは、特定の処理を繰り返したり、ある条件になったときに特定のコードをスキップしたりするために使われる。移動先の場所は、通常、ラベルという名前とコロン:を使ってプログラム中に示される。

昔のプログラミング言語では、ループ処理や条件分岐を実現するために、このgoto文がよく使われていた。しかし、現代のプログラミングでは、より構造化された書き方を推奨する考え方があり、goto文はあまり使われなくなっている。構造化プログラミングは、順次処理、条件分岐、繰り返し処理といった基本的な制御構造を組み合わせることで、より理解しやすく保守しやすいプログラムを作成することを目指す。

以下は、C言語でのgoto文の簡単な使用例。
#include <stdio.h>

int main() {
    int i = 0;

loop_start:
    printf("現在のiの値: %d\n", i);
    i++;
    if (i < 5) {
        goto loop_start;
    }
    printf("ループ終了。\n");
    return 0;
}

この例では、loop_start:というラベルを定義し、gotoloop_start;という命令で、iが5未満の間はラベルの位置に戻って処理を繰り返している。goto文は、指定されたラベルへ無条件に制御を移す働きをする。条件分岐と組み合わせることで、ループのような機能の一部となることができる。

goto文とは わかりやすい例

日常的な例

日常生活で例えるなら、本を読んでいる途中で、「第5章は後回しにして、先に第7章を読んでください」という指示があった場合に、ページを飛ばして7章から読み始めるのに似ている。これは、プログラムがある特定の条件になったときに、一部の処理を飛ばして別の場所から実行を再開するgoto文の動きと似ている。

ITの具体的な例

  • エラー処理:プログラムの実行中に予期しないエラーが発生した場合、エラー処理を行う特定の場所にジャンプして、プログラムを安全に終了させる。例えば、ファイルの読み込みに失敗した場合に、「ファイルを開けませんでした」というメッセージを表示する処理に直接飛ぶ、といった具合。
  • 多重ループからの脱出:深くネストされたループ処理の中で、特定の状態になった場合に、すべてのループから一気に抜け出す。例えば、迷路を探索するプログラムで、出口を見つけたらすぐに探索を終了する、といった状況。
  • 状態遷移の実装:ある状態から別の状態へ移行するような処理を記述する際に、goto文を使って直接次の状態の処理にジャンプする。これは、自動販売機がお金が投入された状態から商品選択の状態へ移るようなイメージ。

goto文を使用する手順

goto文を使うための手順は、大きく分けて以下のようになる。

  • ラベルの定義:プログラムの中で、移動したい場所に目印となるラベルを定義する。ラベルは、通常、英数字で始まる名前の後にコロン:を付けることで定義される。例えば、error_handler:loop_start:のように記述する。
  • goto文の記述:プログラムの別の場所から、定義したラベルへ移動したい箇所で、gotoキーワードに続けてラベルの名前を書く。例えば、gotoerror_handler;gotoloop_start;のように記述する。

プログラムが実行され、goto文に到達すると、プログラムの制御は指定されたラベルの位置に直接移り、そのラベルの次の行から実行が再開される。

重要な注意点として、ほとんどのプログラミング言語では、goto文は同じ関数内でのみ使用できる。つまり、ある関数から別の関数内のラベルへジャンプすることはできない。また、goto文を使いすぎると、プログラムの流れが複雑になり、理解や保守が難しくなるため、使用は慎重に行う必要がある。

goto文についてのよくある質問

Q
goto文はなぜあまり使われないの?
A

goto文を無秩序に使うと、プログラムの実行の流れが複雑になりすぎて、コードが読みにくく、理解や修正が難しくなるから。まるでスパゲッティのように絡み合ったコードになることから、「スパゲッティコード」と呼ばれることもある。現代のプログラミングでは、より構造化された制御構文(例えば、if文やfor文、while文など)を使うことが推奨されている。

Q
goto文を使うメリットはある?
A

特定の状況下では、goto文がコードを簡潔にする場合もある。例えば、深くネストされたループから一気に抜け出したい場合や、複数の場所で発生するエラー処理を一つの場所にまとめたい場合など。ただし、これらのケースでも、より構造的な方法で実現できることが多い。

Q
goto文の代わりに何を使えばいい?
A

ほとんどの場合、if文、for文、while文、break文、continue文、そして関数やメソッドのreturn文など、より構造化された制御構文を使うことができる。これらの構文を使うことで、コードの流れが明確になり、保守性も向上する。

Q
goto文はすべてのプログラミング言語にあるのですか?
A

goto文はすべてのプログラミング言語にあるのですか?goto文は、C言語やC++、BASIC、PHPなど、多くのプログラミング言語に存在する。しかし、JavaやPythonのように、意図的にgoto文を提供していない言語もある。これは、goto文の乱用によるコードの複雑化を防ぐため。

goto文の歴史と構造化プログラミング

goto文は、初期のプログラミング言語から存在する、歴史の長い命令である。FORTRANやBASICといった言語では、プログラムの制御フローを直接的に操作する主要な手段の一つであった。しかし、プログラムが複雑化するにつれて、goto文の多用がコードの可読性や保守性を著しく低下させるという問題が認識されるようになった。

1968年、エドガー・ダイクストラによって発表された論文「GoToStatementConsideredHarmful」(GoTo文は有害とみなされる)は、この問題に警鐘を鳴らし、構造化プログラミングという新しい考え方を提唱するきっかけとなった。構造化プログラミングは、goto文のような無条件分岐に頼るのではなく、順次処理、条件分岐(if文など)、繰り返し処理(for文やwhile文など)といった基本的な制御構造を組み合わせることで、より理解しやすく、保守しやすいプログラムを作成することを目指す。この議論以降、多くのプログラミング言語でgoto文の使用は推奨されなくなり、より構造的な制御構文が主流となっていった

なぜgoto文は「有害」とみなされるのか

goto文が「有害」とみなされる主な理由は、その自由度の高さにある。プログラムの実行位置をどこへでもジャンプさせることができるため、コードの流れが予測しにくくなり、「スパゲッティコード」と呼ばれる、複雑に絡み合った理解困難なコードを生み出しやすい。ダイクストラは、goto文の無制限な使用は、プロセスがどのように進行しているかを把握するための座標を見つけるのを著しく困難にすると指摘した。
このようなコードは、バグの原因を特定するのを困難にし、プログラムの修正や機能追加といった保守作業を非常に難しくする。また、goto文を使うと、プログラムの論理的な構造が不明瞭になり、第三者だけでなく、書いた本人でさえ後から理解するのに苦労することがある

goto文のメリット・デメリット

goto文のメリット

  • 特定の状況下で、深くネストされたループから一気に抜け出す処理を簡潔に記述できる場合がある。break文は最も内側のループからしか抜け出せないため、複数のループを一度に抜け出すにはgoto文が有効な場合がある。
  • 複数の場所で発生するエラー処理を、プログラムの終わりに近い特定の一箇所にまとめることで、コードの見通しを良くすることができる場合がある。エラーが発生した場合に、共通のクリーンアップ処理を行う場所にジャンプする、といった使い方が考えられる。
  • 低レベルプログラミングや、ハードウェア制御など、実行の流れを細かく制御する必要がある場面で有効な場合がある。

goto文のデメリット

  • コードの可読性を著しく低下させ、理解や保守を困難にする。制御の流れが予測しにくくなり、コードを追跡するのが難しくなる。
  • プログラムの構造が不明瞭になり、バグが発生しやすくなる。予期せぬ場所へのジャンプは、プログラムの状態を混乱させる可能性がある。
  • 構造化プログラミングの原則に反する。構造化プログラミングは、より予測可能で理解しやすいコードを目指す。
  • 現代の多くのプログラミング言語では、より安全で構造的な代替手段が提供されている。

goto文の代替となる制御構造

goto文を使わずにプログラムの制御を行うための代替手段は数多く存在する。主なものとしては、以下のような制御構造が挙げられる。

  • 条件分岐:if文、elseif文、else文、switch文などを使って、条件に応じて異なる処理を実行する。繰り返し処理:for文、while文、do-while文などを使って、特定の条件が満たされる間、同じ処理を繰り返す。
  • ループ制御:break文を使ってループから強制的に抜け出す、continue文を使って現在のイテレーションをスキップして次のイテレーションに進む。ラベル付きのbreak文やcontinue文は、ネストされたループからより柔軟に抜け出すことを可能にする。
  • 関数とメソッド:処理を小さなまとまりに分割し、必要に応じて呼び出すことで、コードの構造を整理する。関数を使うことで、goto文を使わずにネストされたループから抜け出すことができる。
  • 例外処理:try-catch構文などを使って、プログラムの実行中に発生する可能性のあるエラーを適切に処理する。

goto文を使用する際の注意点と最善の方法

もしgoto文をどうしても使用する必要がある場合は、以下の点に注意し、可能な限り乱用を避けるべき。

  • 使用は必要最小限に:他の制御構造で実現できる場合は、goto文の使用を避ける。breakcontinuereturnといったより構造的な制御文を優先的に検討する。
  • ジャンプ先は近くに:goto文によるジャンプは、できるだけ近いコードの範囲内にとどめる。遠すぎるジャンプはコードの流れを把握しにくくする。
  • 前方へのジャンプを基本に:後方へのジャンプ(ループを作るような使い方)は、コードを理解しにくくするため避ける。繰り返し処理には、for文やwhile文などの適切な構文を使用する。
  • ラベル名は明確に:ジャンプ先のラベルが何を表しているのかがすぐにわかるような、意味のある名前を付ける。例えば、エラー処理へのジャンプであればerror_cleanup:のように、その目的を示す名前が望ましい。
  • エラー処理や多重ループ脱出など、限定的な用途に:goto文の正当な使用例とされる、エラー処理や深くネストされたループからの脱出といった、限られた状況でのみ使用を検討する。ただし、これらの場合でも、他の方法がないか検討するべき。
  • コードレビューを徹底:goto文を使用したコードは、チームメンバーによるレビューを必ず行い、可読性や保守性に問題がないかを確認する。

goto文まとめ

  • goto文とは、プログラムの実行を特定のラベルへ無条件にジャンプさせる命令である
  • 現代のプログラミングでは、コードの可読性や保守性の観点から、goto文の使用は一般的に推奨されていな
  • プログラミング初心者は、if文、for文、while文といった構造化された制御構文を優先的に学ぶべきである

goto文について理解は深まりましたか?もしこの記事が少しでもお役に立てたなら、ぜひコメントで感想や疑問点を教えてください。あなたの声が、今後の記事作成のヒントになります。

当IT用語辞典の目的は「会話についていく」であり、情報レベルは基礎中の基礎で、どこよりもわかりやすくなるように、例えを入れたりしてますが、逆にわかりにくかったらごめんなさい。さらに正確性、具体性、最新性を求めてる方は、もっとググってください。
YouTubeのチャンネル登録はこちら!!
ポチッと応援よろしくね!!
開発・運営ランキング にほんブログ村 IT技術ブログ IT技術情報へ
記事を書いてる人
デプロイ太郎

IT業界の下層に長くいすぎたのかも知れないおじさんです。プロフィールまで見てくれてるのなら、ブログのブックマークとYouTubeのチャンネル登録とX(旧Twitter)のフォローお願いします。

ネットの裏側を見せるYouTube運営中!!

デプロイ太郎のSNSを見てみる!!
IT用語辞典ソフトウェア・開発
デプロイ太郎のSNSを見てみる!!

コメント

タイトルとURLをコピーしました