問題タブ [switch-statement]

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.

0 投票する
5 に答える
7251 参照

php - Switch ステートメントと isset

数か月前から私のウェブサイトは通知エラーでいっぱいだったので、今コードを修正しようとしています. PHPの更新があったと思います。私はphpがあまり得意ではないので:

isset を追加すると、これは機能しません。

関数内で isset を使用できませんか? よくわからないので、詳しい方にお聞きします。

乾杯

0 投票する
15 に答える
40139 参照

c++ - なぜIf/ElseIfではなくSwitch/ Caseなのか?

この質問は主にC/C ++を対象としていますが、他の言語も関連していると思います。

if /elseifの代わりにswitch/caseがまだ使用されている理由がわかりません。私にはgotoを使用するのとよく似ており、同じ種類の厄介なコードになりますが、if / else ifを使用すると、はるかに整理された方法で同じ結果を得ることができます。

それでも、私はこれらのブロックをかなり頻繁に見かけます。それらを見つける一般的な場所はメッセージループ(WndProc ...)の近くですが、これらは最も重い大混乱を引き起こす場所の1つです。変数は、適切でない場合でもブロック全体で共有されます(その中で初期化されます)。休憩を落とさないように特に注意する必要があります...

個人的には使わないのですが、何か足りないのかな?

それらはif/elseよりも効率的ですか?彼らは伝統によって引き継がれていますか?

0 投票する
9 に答える
40018 参照

c# - 可能なすべての組み合わせを宣言せずに (Flags 属性を使用して) Enum をオンにしますか?

flags 属性が設定されている (より正確にはビット操作に使用される) 列挙型をオンにするにはどうすればよいですか?

宣言された値に一致するスイッチですべてのケースをヒットできるようにしたい。

問題は、次の列挙型がある場合

このようなスイッチを使いたい

「theCheckType」が両方の CheckType.Form に設定されている場合 | CheckType.TempData 両方のケースにヒットさせたい。明らかに、ブレークのために私の例では両方にヒットしませんが、CheckType.Form が CheckType.Form | と等しくないため、それ以外にも失敗します。CheckType.TempData

私が見ることができる唯一の解決策は、列挙値の可能なすべての組み合わせのケースを作成することですか?

何かのようなもの

しかし、それは実際にはあまり望まれていません (すぐに非常に大きくなるからです)。

現在、代わりにお互いの直後に 3 つの If 条件があります

何かのようなもの

しかし、それはまた、20個の値を持つ列挙型がある場合、スイッチを使用するときのように必要な「ケース」/にのみ「ジャンプ」するのではなく、毎回20個のIf条件を通過する必要があることも意味します。

この問題を解決するための魔法の解決策はありますか?

宣言された値をループしてからスイッチを使用する可能性を考えましたが、宣言された各値に対してのみスイッチをヒットしますが、それがどのように機能するかはわかりません。多くの場合と比較して)?

宣言されたすべての列挙値をループする簡単な方法はありますか?

ToString() を使用して "," で分割し、配列をループしてすべての文字列を解析することしか考えられません。


アップデート:

十分な説明ができていないことがわかりました。私の例は単純です(私のシナリオを単純化しようとしました)。

Asp.net MVC の ActionMethodSelectorAttribute に使用して、URL/ルートを解決するときにメソッドを使用できるかどうかを判断します。

メソッドでこのようなことを宣言することでそれを行います

これは、Form または TempData がメソッドを使用できるように指定されたキーを持っているかどうかを確認する必要があることを意味します。

呼び出すメソッド (前の例では doSomething()、doSomethingElse()、および doWhatever()) は、実際には戻り値として bool を持ち、パラメーター (使用できるインターフェイスを共有しない異なるコレクション) で呼び出されます。使用 - 以下のリンクにあるサンプル コードを参照してください)。

うまくいけば、私が何をしているのかをよりよく理解するために、私が実際に行っていることの簡単な例をペーストビンに貼り付けました - ここで見つけることができますhttp://pastebin.com/m478cc2b8

0 投票する
6 に答える
1333 参照

c# - 長いswitch/enum宣言内でリージョンを使用しますか?

私は最近、C#コードで途方もなく長いswitchステートメントとenum宣言を定義する必要があることに気づきました(はい、必要です)が、論理的なサブセクションにそれらを分割するための最良の方法は人々がどのように感じているのか疑問に思います。私の状況では、列挙値とケース(列挙値に基づく)の両方にかなり明確なグループ化がありますが、これをコードに反映する方法が少しわかりません。

私のコードでは、それぞれ10から30の列挙値/ケースのおよそ5つのグループがあることに注意してください。

私が想像できる3つの漠然とした賢明なオプションは次のとおりです。

  1. 宣言内のケース/列挙値のすべての論理グループの周りにブロックを定義#regionします(オプションで空白行で区切ります)。
  2. 各グループに名前を付けてコメントします。各グループ名のコメントの前に空白行を付けます。
  3. 何もしません-スイッチ/列挙型をケース/値の巨大なリストとして残すだけです。

どっちがいい?列挙型とスイッチを別々に扱いますか?(これは私には少し奇妙に思えます。)今、私はこの質問に対する正しい/間違った答えがあるとは言いませんが、それでも私は意見の一般的なコンセンサスが何であるかを聞くことに非常に興味があります。

注1: 50/100以上の値の非常に長い列挙型宣言が発生する可能性があるこの状況は、残念ながら(スイッチでも同様に)避けられません。これは、レクサー(トークン)を作成しようとしているためです。いくつかの理由で最も合理的なアプローチ。

注2:一般的なコード(主にクラスの構造化)でリージョンを使用するかどうかについては、すでにいくつかの重複する質問が存在することを十分に認識していますが、ここでの質問ははるかに具体的であり、まだ対処されていないと思います。

0 投票する
7 に答える
6900 参照

java - Java での列挙値表現の Switch ステートメント

私は他の言語で列挙型を使用することに非常に精通していますが、特定の用途で Java を使用するのに苦労しています。

Enums に関する Sun のドキュメントには、次のように大胆に記載されています。

「Javaプログラミング言語の列挙型は、他の言語の対応するものよりもはるかに強力です.

まあ、それは素晴らしいことですが、switch ステートメントでの比較のために、列挙型のそれぞれに一定のデータ型表現が必要です。状況は次のとおりです。特定の空間、または迷路グラフの「スロット」を表すノードを構築しています。これらのノードは、迷路を表す 2D 整数配列から構築できる必要があります。これが、現在問題がある場所である MazeNode クラスについて私が得たものです (switch ステートメントが吠える):

注: case ステートメントの動的項目が原因で、このコードが機能しないことはわかっています。それは私が求めているものを説明するためにあります。

そのため、コードは switch ステートメントで「case 式は定数式でなければなりません」と文句を言います。技術的には動的であるため、コンパイラに問題が発生する理由はわかりますが、これを解決するためにどのようなアプローチをとればよいかわかりません。より良い方法はありますか?

肝心なのは、Enum に、プログラム内の整数の 2D 配列と比較するための対応する整数値が必要であるということです。

0 投票する
2 に答える
284 参照

javascript - IRC サーバー コードを処理するために switch ステートメントを使用するのはばかげているでしょうか?

かなりの数の IRC サーバー コードがあります。

私はAdobe AIR用の小さなIRCクライアントに取り組んでいます、最初はこれらのうちのいくつかだけをサポートすることから始めましたが、switch ステートメントは悪い考えではないように思えました。でも、どんどんサポートしていくうちにswitch文が長くなって、ちょっと制御不能な感じがします。1 つの問題は、再利用できるように、低レベルの IRC 処理コードを独自のファイルに保持していたことです。すべてを 1 つのファイルにまとめたいと思います。もう 1 つの問題は、現在、switch ステートメントのコード ブロックがこの IRC クラスの一部であると見なされており、このステートメントが頻繁に使用されていることです。今変更を加えると大変な作業になり、リグレッションが発生します。唯一の問題は、長い switch ステートメントに対する私の嫌悪感です。それ以外の場合は、それが機能し、読みやすいことはわかっていますが、保守が実際に難しくなるわけではありません。しかし、それは非常に長いswitchステートメントです。また、switch ステートメントを含む関数も明らかに長いです。://

スイッチの代わりに私が時々行うことの 1 つは、スイッチが評価する値にちなんで名付けられた関数を定義することです。スイッチの代わりに:

メソッドがスコープ内に存在するかどうかを確認して実行します。

しかし、この場合も、リグレッションのリスクが高いと感じており、長い switch ステートメントを避けるためだけに努力する価値があるかどうかはわかりません。

0 投票する
3 に答える
1038 参照

ruby - Rubyは条件に基づいて関数を実行する賢い方法です

ちょっとした楽しいプロジェクトとして、RubyでBeatnikインタープリターを実装しています。Beatnikのことを聞いたことがない場合は、ソースコード内の単語の「スクラブルスコア」によって操作が指定される難解プログラミング言語です。

とにかく、実装では、異なるスクラブルスコアに対して異なる操作を行う必要があります。これは特に実装するものではありません。明らかな方法の1つは、ifステートメントです。

別の方法は、caseステートメントを使用することです。

しかし、これら2つの方法のどちらも、特にエレガントだとは思いません。これを実装する別の方法を提案できますか?

0 投票する
13 に答える
2982 参照

c# - いつswitchステートメントを削除する必要がありますか?

私が取り組んでいるコードベースでswitchステートメントに出くわしました。switchステートメントはコードの臭いと見なされるため、それをより良いものに置き換える方法を見つけようとしています。ただし、 switchステートメントの置き換えに関するstackoverflowに関するいくつかの投稿を読んだので、この特定のswitchステートメントを置き換える効果的な方法を考えることができないようです。

この特定のswitchステートメントが問題ないかどうか、およびswitchステートメントが適切であると見なされる特定の状況があるかどうか疑問に思いました。

私の場合、私が苦労しているコード(自然に少し難読化されている)は次のようになります。

誰かがこのスイッチを排除する方法を提案できますか?それとも、これはスイッチの適切な使用法ですか?もしそうなら、switchステートメントの他の適切な使用法はありますか?どこが適切かを知りたいので、状況によっては匂いと見なされるという理由だけで、出くわしたすべてのswitchステートメントを削除しようとして時間を無駄にしないでください。

更新:Michaelの提案で、このロジックの重複を少し検索したところ、誰かが別のクラスでロジックを作成して、switchステートメント全体を効果的に冗長にしていることがわかりました。したがって、この特定のコードのコンテキストでは、switchステートメントは不要でした。ただし、私の質問は、コード内のswitchステートメントの適切性と、それらが見つかったときに常にそれらを置き換えようとする必要があるかどうかについてです。この場合、このswitchステートメントが適切であるという答えを受け入れる傾向があります。

0 投票する
6 に答える
2470 参照

c# - C#のCaseステートメントブロックレベル宣言スペース

caseステートメント内のブロックがブロックレベルの宣言スペースと見なされないという理由がありますか?

試したときにエラーが発生し続けます(変数はすでに宣言されています)

しかし、私はすることができます

C#でフォールスルーステートメントが許可されている場合、それは理にかなっていますが、そうではありません。また、caseステートメントで変数を宣言し、そのブロックの外で使用できるシナリオは考えられません。

0 投票する
2 に答える
387 参照

php - CakePHP から Ruby on Rails に切り替えるためのヒントはありますか?

私はPHPから切り替えたいと思っていました。CakePHP と Ruby on Rails の類似のクラスや主な違いを強調したい人はいますか?

ありがとうございました!