web-dev-qa-db-ja.com

GOTOはPHP evil?

私は最近、PHP 5.3がGOTOと呼ばれる新しい言語構成をサポートすることを発見しました。誰もがそれが何をするか知っています。しかし、それはまさに伝統的なGOTOではなく、ジャンプラベル。このGOTOが悪で、悪いコードを暗示しているかどうかを知るのは面白いですか?

70
Tower

アセンブラーでプログラミングしている場合を除き、GOTOは常に飛行機の救命胴衣と同じように扱われる必要があります。それらを利用できるようにするのは良いことですが、使用する必要がある場合は大きなトラブルになります。

142
Konamiman

私は誰もこれを投稿したとは信じられない:)

xkcd - goto

確かに、PHPはコンパイルされません...猛禽類があなたのウェブサイトを訪れるたびにあなたを追いかけるでしょうか?

103
Loris

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

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

そのため、2つのバージョン(GOTOを使用する場合と使用しない場合)を作成し、どちらが理解しやすいかを確認してください。その後、選択は簡単です。

78
Remo.D

これは PHPマニュアルページ の最も重要な部分であり、ここに欠けていると思います:

これは、完全な無制限のgotoではありません。ターゲットラベルは同じファイルとコンテキスト内にある必要があります。つまり、関数またはメソッドから飛び出すことも、1つに飛び込むこともできません。また、あらゆる種類のループやスイッチ構造にジャンプすることもできません。これらから飛び出すこともできますが、一般的な使用法は、マルチレベルブレークの代わりにgotoを使用することです。

私見、これはye olde BASICスタイルのgotosとは大きく異なります。

23
schmunk

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

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

私は実際に矢印コードの例(深くネストされた条件)を歩き、1つのバージョンでは標準的なプラクティス(ガード条項、グループ化条件、関数の引き出し)を使用してリファクタリングし、他のバージョンではgotoベースのバージョンを使用し、実際にgotoベースのリファクタリング。

18
AdamJonR

銃は悪ですか?どちらも善悪に使用できます。 gotoを使用するよりも、gotoを使用しないで優れたコードを記述する方が簡単だったと思います。

10
David Waters

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

7
Mark Rendle

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

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

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

私見、それはコードを生成するために良いことでも悪いことでもありません:良いプログラムはまだ良いでしょう、そして、「ホラープログラム」はもっと悪いでしょう... 「。

5
Arno

GOTOは、構造化されていないコードを作成できるため、通常は悪です。通常のループでは、構造化されているため、追跡しやすい優れた構造化コードを構築できます。

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

お役に立てれば。

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

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

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

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

2
yafrani

CLIモードで作業するためのスクリプトを作成するときにGOTOを使用しました。それは私の命を救います。

1
EThaizone Jo