75

私は最近、PHP 5.3 が という新しい言語構造をサポートしていることを知りましたGOTO。誰もがそれが何をするか知っています。ただし、それは正確には従来の ではなく、GOTO単なるジャンプ ラベルです。GOTOこれが悪であり、悪いコードを意味するかどうかを知ることに興味がありますか?

4

11 に答える 11

157

アセンブラでプログラミングしている場合を除いて、GOTOは常に飛行機のライフベストと同じように扱う必要があります。GOTOを利用できるようにしておくのは良いことですが、使用する必要がある場合は、大きな問題が発生します。

于 2009-12-14T10:12:54.203 に答える
104

誰もこれを投稿していないなんて信じられない:)

xkcd-goto

確かに、PHPはコンパイルされていません...たぶん、ラプターはあなたのWebサイトにアクセスするたびにあなたを追いかけますか?

于 2009-12-14T10:30:39.970 に答える
84

使用する制御構造に関係なく、コードの不適切な構造化は悪です。

私は個人的に、プログラムのフローを明確にするgotoを好みます。これは、コード内で間接的に同じ分岐を引き起こす「変数を制御する」およびネストされた「if」です。

したがって、2つのバージョン(GOTOありとなし)を記述して、どちらが理解しやすいかを確認してください。そうすれば、選択は簡単です。

于 2009-12-14T10:10:33.350 に答える
18

私は(現在)少数派ですが、PHPのgotoコンストラクトに課せられた制限が非常に有益なツールになると思います。

http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/

私は実際に矢印コードの例(深くネストされた条件)をウォークスルーし、一方のバージョンでは標準的な方法(ガード句、グループ化条件、関数のプルアウト)を使用してリファクタリングし、もう一方のバージョンではgotoベースのバージョンを使用します。 gotoベースのリファクタリング。

于 2012-02-06T08:36:59.217 に答える
11

銃は悪か?どちらも善にも悪にも使えます。goto を使うよりも、goto を使わないほうが良いコードを書くのは簡単だと思います。

于 2009-12-14T10:06:47.070 に答える
7

特定の状況でコードを読みやすくすることができる言語機能はすべて、良いことです。GOTOは、そのような状況がほとんどなく、その間にある場合でも、そのような言語機能の1つです。貧しいプログラマーが悪い、保守不可能なコードを書くことを可能にする構文を禁止した場合、私たちの仕事は非常に困難になります。

于 2009-12-14T10:16:35.910 に答える
5

ソフトウェア エンジニアとして、私は主に「メインフレーム」と「大企業のサーバー」に取り組んでいます...そして、私たちの日常言語 (つまり、基本コードの 95% に含まれる言語) は Cobol であり、GOTO を広範囲に使用しています。

この使用法は、コードが悪いという意味ではありません。プログラムを書いた時点ではこのツール (GOTO) が正しかったということです。

Kaitsuli さんの質問に答えると、PHP スクリプトを作成する際に便利なツールになると思います。一方、多くのスクリプトは、これまでにほぼ 10 年間、それなしで作成されてきました。さらに、より多くのオブジェクト指向機能を備えた PHP の進化に逆行しています。

私見ですが、コードが生成されることは良いことでも悪いことでもありません: 良いプログラムは依然として良いものであり、「ホラー プログラム」はさらに悪いものになるでしょう... 唯一の疑問は次のとおりです。 "。

于 2009-12-14T10:48:21.230 に答える
3

GOTOは、構造化されていないコードを作成できるため、通常は悪です。通常のループを使用すると、構造化されているため、わかりやすい構造化コードを簡単に作成できます。

非構造化コードがここからそこにジャンプしているとき、GOTOステートメントから来る悪を見つけただけです。ほとんどの場合、それを避ける方が良いです。たぶん、100.000行ごとに1回、GOTO文がA LOTを単純化する場所があります。したがって、コードは悪ではありませんが、確信が持てない場合は、GOTOを避ける必要があります。

お役に立てれば。

編集:まあ、ここに私自身の意見を追加するために、構造化されていないコードを作成することを可能にし、私がそうあるべきだと思うときに悪とは見なされない他の指示があります。

たとえば、関数の途中でのリターンはその最後へのGOTOであるため、それらを避け、各関数の最後で1つのリターンのみを使用します。

Vb.Netのような他の言語(おそらく他の言語も)では、Exit For、Exit While、ブレークなど、コードを構造化しないものを実行できます。これは避けるべきだと思います。

于 2009-12-14T10:10:42.073 に答える
2

場合によっては (つまり、0.01% の場合)、長い長いスクリプトがあり、いくつかのブロックをテストしたい場合などに便利です。ただし、最終的なスクリプトに保持しないでください

于 2013-08-26T16:16:09.697 に答える