この質問は、 Goto StillThoughdHarmfulの複製です。これについてさらに話し合いたい場合は、元の質問を使用してください。
なぜGOTOはプログラミングの実践が貧弱なのですか?場合によってはそれを使用するのが理にかなっています。
なぜGOTOはプログラミングの実践が貧弱なのですか?場合によってはそれを使用するのが理にかなっています。
Djkstraは、「GOTOは致命的と見なされる」ではなく、「GOTOは有害であると見なされる」と書いていることに注意してください。それはその場所を持っています。残念ながら、いつ使用するかを判断するのは、他の人のコード、特に何年も前に会社で働いていない人が書いたコードを保守した経験があった後で判断します。したがって、その経験を積むまでは、できるだけ後藤を避けるのが最善です。
基本的に、それは悪いコーディングスタイルを助長します。参照:後藤は有害と考えられる[pdf]
それは急速にスパゲッティコードにつながる可能性があります。
これは、コードを手続き的に設計していないことを意味します。
whileとifを適切に構築すれば、gotoが必要になることはめったにありません。
キーワードはめったにありません。役に立つ場合があります。その意味で、今日の多くの人々は、恐ろしい後藤を避けるために、例外を明示的にスローしてキャッチします。
コードの構造を理解するのが難しい場合があるためです。
これ
y:
// do more stuff
goto x
p:
// do stuff
// then done
goto y;
x:
// do a bunch of stuff
if (...)
goto y;
else
goto p;
done:
よりもはるかに明確ではありません
int main()
{
x();
}
function p()
{
if (...)
{
return;
}
}
function x()
{
if (...)
{
return;
}
else
{
p();
}
}
GOTOは制御フローを短絡させ、それによって設計を損ない、デバッグとメンテナンスの悪夢への扉を開きます。
読みやすさが問題になり、gotoを使用すると、ロジックの流れが意図しない影響を与える可能性があります。
.netコンパイラがgotoを使用するようにいくつかのcase/switchステートメントを変更するのはおかしいと思います。
場合によっては、それは理にかなっています。ただし、ほとんどの場合、forループやwhileループなどの構造化コードを使用する場合に比べて、コードの実行パスを読みにくくする可能性があるため、これを使用すると不適切な方法と見なされます。
gotoまたはラベルを見ると、コードを読んだり、ラベル名を検索したりしなければ、どこに行くのか、どこから来るのかがわかりません。これは、gotoがラベルと同じ画面に収まらない場合は特に注意が必要です。これをforループまたはwhileループまたはifと比較してください。構造(つまりコードのインデント)から実行パスが何であるかを知ることができます。
そうは言っても、特に、多次元配列内の特定の値を掘り下げているネストされたforループからジャンプする場合などに役立つことがあります。ここでgotoを使用すると、正しい値が見つかったときにforループからジャンプできます。