問題タブ [goto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - GOTOとTHROWの違いは?
最近、多くの人が「後藤」という一言だけを言ったと非難しました。
なぜそんなに厄介な言葉だと思われるのだろうか。
このトピックに関する以前のいくつかの議論を知っていますが、それは私を納得させません-答えのいくつかは、説明しようとさえせずに「悪い」と言っているだけで、PHPやIMOのようなスクリプト言語には関係のない理由をもたらします。
とにかく、私は非常に特別な質問をするつもりです:比較してステートメントをし
ましょう。
私の意見では、どちらも同じことをします。ある条件に基づいてコードの一部の実行を回避することです。
もしそうなら-後藤と同じ欠点がありますか?(もしあれば)?
そうでない場合-それは違いです。 goto
throw
throw
次の2つのコードスニペットのコード構造の基本的な概念の違いを理解できる人は、十分な経験がありますか?
これらのコードスニペットに関しては、「理論上」、「一般的」、「ここに素晴らしいXKCDコミックがあります!」ではありません。
なぜ最初のものは素晴らしいと見なされ、後者は最も致命的な罪であると見なされたのですか?
スパゲッティを作る際にスローがより強力で柔軟であるという事実を私は知っていることに注意してください。それは私にとって主要な違いにはなりません。それは概念ではなく、使用の問題です。
編集
私は多くの人から、最初の例はもっと新しく使うべきだと言われました。
理由:例外は、ビジネスロジックを実装するためではなく、エラーを処理するためにのみ使用する必要があります。
それは賢明に見えます。
したがって、無駄なコードの実行を停止するために残された唯一の方法は、gotoです(while、returnなど、同じ問題ですが実装が難しいいくつかの代替は言うまでもありません)?
c++ - C++ 、この goto ステートメントは保証されていますか?
これはより適切な質問だと思ったので、タイトルを少し変更しました。
リファクタリングしますか (goto の正当な使用のようです) ? 次のコードをどのようにリファクタリングして go to ステートメントを削除しますか?
完全なステートメント
ありがとうございました
ほとんどの好みを見た後、フラグで行くことにしましたが、ヨーク氏のコメントで。
みんなありがとう
perl - Perlの上位スコープで変数をローカライズする方法は?
AUTOLOAD
またはその他のサブルーチン ディスパッチ手法を使用する Perl モジュールを開発しているときに、次のパターンに何度か遭遇しました。
これは正常に機能caller
し、正しいスコープが表示されます。
今私がしたいのは、の実行中にローカルで$_
等しいに設定することです。これは次のようになります。$self
&$code
ラッピングを含むソリューションは、caller
パフォーマンスと依存関係の問題により受け入れられません。したがって、それは2番目のオプションを除外しているようです.
最初に戻ると、 の新しい値が$_
の範囲外に出ないようにする唯一の方法goto
は、変更をローカライズしない (実行可能なオプションではない) か、または のようなものを実装することuplevel_local
ですgoto_with_local
。
PadWalker
、Sub::Uplevel
、Scope::Upper
、およびその他を含むあらゆる種類の順列を試してみましたが、適切なタイミングでクリーンアップし、ラップしないB::Hooks::EndOfScope
堅牢なソリューションを思い付くことができませんでした。$_
caller
この場合に機能するパターンを見つけた人はいますか?
(SO の質問:別のスタック フレームで Perl 変数をローカライズするにはどうすればよいですか?は関連していますが、保持することcaller
は要件ではなく、最終的には別のアプローチを使用するという答えがあったため、この場合、その解決策は役に立ちません)
language-agnostic - なぜ goto を使うのが悪いのですか?
重複の可能性:
GOTO はまだ有害と見なされていますか?
goto ステートメントが含まれている C# コードに出くわしました (C# がサポートされていることさえ知りませんでした)。大学の授業の 1 つで goto ステートメントについて聞いたことをぼんやりと覚えているだけです。教授が絶対に使ってはいけないと言ったのを覚えているようですが、その理由は覚えていません。
このコードを書き直すことを検討する必要がありますか、それとも問題が発生する可能性は低いですか?
c++ - gotoを使用することの何が問題になっていますか?
私はxkcdをめちゃくちゃにしていて、これを見ました(数年前にそれらについての否定的なテキストも読んだ場合):
実際には何が問題になっていますか?では、なぜC ++でもgotoが可能なのですか?
なぜ私はそれらを使用すべきではないのですか?
goto - 一連のプロンプトにgotoを使用しないようにするにはどうすればよいですか?
私は、ユーザーに一連の質問を求めるコンソールベースのアプリケーションを作成しています。例えば:
「開くレコードを入力してください:」
「Xをやりたいですか?」
「Yをしたいですか?」
「続行してもよろしいですか?」
ユーザーがプロンプトで何も入力しない場合は、1レベル上に移動します。これはgotoを使用すると簡単です。私が考えることができる他の唯一の方法は、はるかに醜く見え、2、3以上のプロンプトに対してかなり扱いにくいforループにネストされています。これを行う簡単な方法があるはずですが、私はそれを考えることができません。
c# - C#で「ループの初期化」を処理する他の方法
まず、gotoステートメントは、最新のプログラミング言語の高レベルの構造によってほとんど無関係になり、適切な代替が利用できる場合は使用しないことに同意します。
私は最近、スティーブマコネルのコードコンプリートのオリジナル版を読み直していて、一般的なコーディングの問題についての彼の提案を忘れていました。何年も前に最初に読んだことがありますが、レシピがどれほど役立つかはわかりませんでした。コーディングの問題は次のとおりです。ループを実行する場合、状態を初期化するためにループの一部を実行してから、他のロジックでループを実行し、同じ初期化ロジックで各ループを終了する必要があります。具体的な例は、String.Join(delimiter、array)メソッドの実装です。
みんなが最初に問題に取り組むのはこれだと思います。引数を戻り値に追加するためにappendメソッドが定義されていると仮定します。
注:これに対するわずかな最適化は、elseを削除して、ループの最後に配置することです。割り当ては通常、単一の命令であり、elseと同等であり、基本ブロックの数を1つ減らし、主要部分の基本ブロックサイズを増やします。その結果、各ループで条件を実行して、区切り文字を追加する必要があるかどうかを判断します。
私はまた、この一般的なループの問題に対処するための他の見解を見て使用しました。最初にループの外側で最初の要素コードを実行してから、2番目の要素から最後までループを実行できます。ロジックを変更して、常に要素と区切り文字を追加することもできます。ループが完了したら、最後に追加した区切り文字を削除するだけです。
後者の解決策は、コードを複製しないという理由だけで私が好む解決策になる傾向があります。初期化シーケンスのロジックが変更された場合でも、2か所で修正することを覚えておく必要はありません。ただし、何かを実行してから元に戻すには余分な「作業」が必要であり、少なくとも余分なCPUサイクルが発生し、String.Joinの例のように多くの場合、追加のメモリも必要になります。
私はこの構成を読むことに興奮しました
ここでの利点は、重複したコードがなく、追加の作業がないことです。最初のループの実行の途中でループを開始します。これが初期化です。do while構文を使用して他のループをシミュレートすることに制限されていますが、変換は簡単で、読み取るのは難しくありません。
では、質問です。幸いにも、これを作業中のコードに追加してみましたが、機能しませんでした。C、C ++、Basicでうまく機能しますが、C#では、親スコープではない別の字句スコープ内のラベルにジャンプすることはできません。とてもがっかりしました。だから私は疑問に思っていました、C#でこの非常に一般的なコーディングの問題(私は主に文字列の生成で見ます)に対処するための最良の方法は何ですか?
おそらく要件をより具体的にするために:
- コードを複製しないでください
- 不必要な仕事をしないでください
- 他のコードより2倍または3倍以上遅くならないでください
- 読みやすい
私が述べたレシピでおそらく苦しむかもしれないのは読みやすさだけだと思います。ただし、C#では機能しないので、次善の策は何ですか?
*編集* いくつかの議論のためにパフォーマンス基準を変更しました。ここでは通常、パフォーマンスが制限要因ではないため、より正確な目標は、不合理にならないようにすること、これまでで最速にならないようにすることです。
私が提案する代替の実装が嫌いな理由は、コードを複製して一方の部分を変更する余地を残しているため、または私が一般的に選択する実装では、操作を「元に戻す」必要があり、その操作を元に戻すには余分な思考と時間が必要になるためです。あなたがやったこと。特に文字列操作では、これにより通常、1つのエラーが発生したり、空の配列の説明に失敗したり、発生しなかった何かを元に戻そうとしたりすることができます。
c# - この例では、gotoステートメントはどのように機能しますか?
私はこのコードサンプルを研究しています:
10のようなシーク番号を入力すると、「Not Found」ステートメントが呼び出され、対応するメッセージがコンソールに出力される理由がわかりません。この場合、goto:Foundステートメントが実行されているため、goto:NotFoundステートメントは呼び出されませんが、それでも対応するメッセージがコンソールに出力されます。この場合、プログラムがこの「NotFound」ラベルにジャンプすることはないため、方法がわかりません。
これについて教えてください...
ありがとう
c# - C# goto use - ここで他に何を使用しますか?
goto の使用は、ほとんどの人が避けるように言っていることは知っていますが、単純なコードが必要な場合に便利な場合があることをさまざまな場所で読みました。現在、ユーザーが選択した場合に繰り返す必要がある非常に単純なプログラムがあります。
ここで goto を使用するのは本当に悪いことですか? ループなどを行わずにコードを繰り返す方法は他にありません。これは非常に簡単でクリーンな方法のようです。または、何か不足していますか?
tsql - 複数の GO を持つスクリプト内の SQL GOTO ステートメント
特定の条件が当てはまる場合、エラーなしで SQL スクリプトを終了する必要があります。raiseerror
エラーコード20+とwith log
パラメーターを使用することで解決できる1つの解決策があることを読みました。ただし、その制限は、管理者としてのみ実行でき、データベースへの接続が中止されることです。
また、GOTO を使用してスクリプトの最後にジャンプしようとしましたが、スクリプトの途中に複数の GO があるため、機能しません。別の解決策はありますか?
IF <some condition>
BEGIN
GOTO Finished;
END
GO
Finished:
SELECT 'Done'
ありがとう!