タグ付けされた質問 「switch-statement」

3
スイッチのデフォルトケースでブレーク
私はbreak、最後のケースの後に含めるかどうかについて、しばしば困惑していますdefault。 switch (type) { case 'product': // Do behavior break; default: // Do default behavior break; // Is it considered to be needed? } break唯一の目的は、コードが残りのswitchケースを実行しないようにすることです。 break一貫性のために最後を持っているのがより論理的であると考えられbreakますか、機能的な使用をまったく適用しないためにそれをスキップしますか?私の意見では、両方とも異なる方法で論理的です。 これは、.phpファイルをで終わることとある程度比較できます?>。私は?>ほとんど空白スペースを出力するリスクのために終わることはありませんが、ファイルを終了することは論理的なことだと主張することができます。

17
巨大な「switch」ステートメントの代わりにオブジェクト指向アプローチを使用するのはなぜですか?
私は.Net、C#ショップで働いており、より多くのオブジェクト指向のアプローチではなく、多くの「ケース」を使用してコードで巨大なSwitchステートメントを使用することを主張し続ける同僚がいます。彼の主張は一貫して、Switchステートメントが「cpuジャンプテーブル」にコンパイルされ、したがって最速のオプションであるという事実に戻っています(他のことでは、速度については気にしないとチームに言われますが)。 正直なところ、これに反対する議論はありません...彼が何について話しているのかわからないからです。 彼は正しいですか? 彼はただお尻を話しているだけですか? ここで学ぼうとしています。

12
「goto」ブードゥー教を避ける?
switchいくつかのケースを処理する構造があります。switch動作enumを組み合わせた値によって重複したコードの問題を提起しています: // All possible combinations of One - Eight. public enum ExampleEnum { One, Two, TwoOne, Three, ThreeOne, ThreeTwo, ThreeOneTwo, Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree, FourTwoThree, FourOneTwoThree // ETC. } 現在、switch構造は各値を個別に処理します。 // All possible combinations of One - Eight. switch (enumValue) { case One: DrawOne; break; case Two: DrawTwo; …

8
スイッチケースの使用中にデフォルトのケースを追加する必要がありますか?
最近のコードレビュー中に、ブロック内で何もすることがなくても、ブロックが使用されるdefaultすべてのファイルにケースを入れるように頼まれswitchましたdefault。つまり、defaultケースを入れて、何も書いてはいけないということです。 これは正しいことですか?それはどのような目的に役立つでしょうか?

10
switch文またはlong if…elseチェーンを使用する必要がありますか?
多くの場合、switchステートメントについて聞いたとき、長いif ... elseチェーンを置き換える方法として先送りされています。しかし、switchステートメントを使用する場合、if ... else以外の場合に書くよりも多くのコードを書いているようです。また、すべての呼び出しのすべての変数を同じスコープに保持するなど、他の問題もあります。 ここに私が通常書くフローを表すいくつかのコードがあります(diamのおかげで) String comment; // The generated insult. int which = (int)(Math.random() * 3); // Result is 0, 1, or 2. if (which == 0) { comment = "You look so much better than usual."; } else if (which == 1) { comment = "Your work …

8
Clang / LLVMが、列挙されたすべてのケースが含まれるswitchステートメントでデフォルトを使用することについて警告するのはなぜですか?
次のenumおよびswitchステートメントを検討してください。 typedef enum { MaskValueUno, MaskValueDos } testingMask; void myFunction(testingMask theMask) { switch (theMask) { case MaskValueUno: {}// deal with it case MaskValueDos: {}// deal with it default: {} //deal with an unexpected or uninitialized value } }; 私はObjective-Cプログラマですが、より多くの読者のために純粋なCでこれを書いています。 -Weverythingを使用したClang / LLVM 4.1では、デフォルトの行で警告が表示されます。 すべての列挙値をカバーするスイッチのデフォルトラベル 今、私はこれがなぜあるのかを見ることができます:完全な世界では、引数に入力する値theMaskは列挙型のみであるため、デフォルトは必要ありません。しかし、ハックがやって来て、初期化されていないintを美しい関数に投げ込んだらどうなるでしょうか?私の機能はライブラリのドロップとして提供され、そこに何が入るかを制御することはできません。を使用することdefaultは、これを処理する非常に適切な方法です。 なぜLLVMの神は、この振る舞いを地獄のデバイスにふさわしくないと考えているのでしょうか?引数をチェックするifステートメントをこれに先行させる必要がありますか?

6
Switchステートメントのリファクタリングと、Switchステートメントの実際の使用はありますか?
私はこの記事を読んでいて、プロジェクトにswitchステートメントがまったくないように、すべてのswitchステートメントをディクショナリーまたはファクトリーに置き換えることで削除するのかと疑問に思っていました。 何かが足りませんでした。 問題は、switchステートメントを実際に使用するか、辞書やファクトリーメソッドに置き換えるか(ファクトリーメソッドを使用する場合は、オブジェクトを作成するためにswitchステートメントを最小限使用することです)工場を使用して...しかしそれはそれについてです)。

5
関数呼び出しの複数の引数と単一の配列
パラメーターのセットを受け取り、SQLクエリの条件としてそれらに適用する関数があります。ただし、条件自体を含む単一の引数配列を優先しましたが: function searchQuery($params = array()) { foreach($params as $param => $value) { switch ($param) { case 'name': $query->where('name', $value); break; case 'phone': $query->join('phone'); $query->where('phone', $value); break; } } } 私の同僚は、代わりにすべての引数を明示的にリストすることを好みました。 function searchQuery($name = '', $phone = '') { if ($name) { $query->where('name', $value); } if ($phone) { $query->join('phone'); $query->where('phone', $value); …

6
関数とswitchステートメントのマップ
私はリクエストを処理するプロジェクトに取り組んでおり、リクエストにはコマンドとパラメーターの2つのコンポーネントがあります。各コマンドのハンドラーは非常にシンプルです(<10行、多くの場合<5)。少なくとも20のコマンドがあり、50を超える可能性があります。 私はいくつかの解決策を考え出しました: コマンド上の1つの大きなスイッチ/ if-else 機能へのコマンドのマップ 静的クラス/シングルトンへのコマンドのマップ 各コマンドは少しエラーチェックを行い、抽象化できるビットは、各コマンドに定義されているパラメーターの数をチェックすることだけです。 この問題の最善の解決策は何ですか?また、その理由は何ですか?また、私が見逃したかもしれないデザインパターンにもオープンです。 それぞれについて、次の賛否両論のリストを作成しました。 スイッチ 長所 すべてのコマンドを1つの関数に保持します。シンプルなので、これは視覚的なルックアップテーブルになります 1か所でしか使用されない大量の小さな関数/クラスでソースを乱雑にする必要はありません。 短所 とても長い プログラムでコマンドを追加するのが難しい(デフォルトのケースを使用してチェーンする必要がある) マップコマンド->関数 長所 小さい一口サイズのチャンク プログラムでコマンドを追加/削除できる 短所 インラインで行う場合、スイッチと視覚的に同じ インラインで行われない場合、多くの機能が1か所でのみ使用されます マップコマンド->静的クラス/シングルトン 長所 ポリモーフィズムを使用して単純なエラーチェックを処理できます(3行だけですが、それでも) マップと同様のメリット->機能ソリューション 短所 多くの非常に小さなクラスがプロジェクトを混乱させます 実装がすべて同じ場所にあるわけではないため、実装をスキャンするのは簡単ではありません 追加のメモ: 私はGoでこれを書いていますが、ソリューションは言語固有のものではないと思います。他の言語でも非常に似たようなことをする必要があるかもしれないので、私はより一般的な解決策を探しています。 コマンドは文字列ですが、便利であれば、これを簡単に数値にマップできます。関数のシグネチャは次のようなものです。 Reply Command(List<String> params) Goにはトップレベルの機能があり、私が検討している他のプラットフォームにもトップレベルの機能があるため、2番目と3番目のオプションの違いがあります。

8
Java 7で文字列をオンに切り替えることの利点は何ですか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 6年前に移行され ました。 Javaでプログラミングを始めたとき、switchステートメントが文字列を受け取らないという事実にイライラしました。その後、列挙型を使用すると、型の安全性(リファクタリングが容易になる)と他の開発者にとってわかりやすい値を渡すのではなく、列挙型を使用するメリットを実感しました。 SE7では、Enumではなく、文字列を入力として使用するスイッチを使用することにした状況を考えるのに苦労しています。文字列全体を切り替えることで実装されている場合(たとえば、部分一致または正規表現の一致ではなく)、コードが変更される理由が少なくなるようには見えません。 また、IDEツールとコーディングの読み取り/書き込み比率により、文字列値を渡すよりも余分なEnumを自動生成する方がはるかに幸せです。 彼らはプログラマーとしてどのような利益をもたらしますか?ボイラープレートが少ない? この機能のために言語が泣き叫ぶような気はしません。たぶん私は見落としているユースケースがあります。

2
なぜ言語はswitchステートメントで明示的なフォールスルーを使用しないのですか?
私は読んでいたなぜ私たちはで使用する必要breakがありswitchますか?、そして、明示的なフォールスルーのサポート(AFAIK)がないのに、一部の言語(PHPやJavaScriptなど)で暗黙的なフォールスルーが許可されている理由を疑問に思いました。 continue完全に適切であるように、新しいキーワードを作成する必要があり、著者が事件を解決することを意図していたかどうかのあいまいさの問題を解決するようなものではありません。 現在サポートされている形式は次のとおりです。 switch (s) { case 1: ... break; case 2: ... //ambiguous, was break forgotten? case 3: ... break; default: ... break; } 一方、次のように書くのは理にかなっています。 switch (s) { case 1: ... break; case 2: ... continue; //unambiguous, the author was explicit case 3: ... break; default: ... break; } …


4
モデルとビューを扱うときの切り替えとポリモーフィズム
私の問題に対するより良い解決策を見つけることができません。要素のリストを表示するView Controllerがあります。これらの要素は、B、C、Dなどのインスタンスになり、Aから継承できるモデルです。したがって、そのView Controllerでは、各項目はアプリケーションの異なる画面に移動し、ユーザーがそれらのいずれかを選択するとデータを渡す必要があります。私の頭に浮かぶ2つの選択肢は次のとおりです(構文を無視してください、それは特定の言語ではありません) 1)スイッチ(私はそれが悪いことを知っています) //inside the view controller void onClickItem(int index) { A a = items.get(index); switch(a.type) { case b: B b = (B)a; go to screen X; x.v1 = b.v1; // fill X with b data x.v2 = b.v2; case c: go to screen Y; etc... } } 2)多型 …

7
オブジェクト指向のオブジェクト指向言語での実装?
カーレースをシミュレートするJavaコードをいくつか見てきました。これには基本的なステートマシンの実装が含まれています。これは、古典的なコンピューターサイエンスステートマシンではなく、複数の状態を持つことができ、一連の計算に基づいて状態を切り替えることができるオブジェクトにすぎません。 問題だけを説明するために、Carの状態の定数(OFF、IDLE、DRIVE、REVERSEなど)を定義するネストされたenumクラスを持つCarクラスを取得しました。この同じCarクラス内には、更新機能があります。これは基本的に、現在の車の状態を切り替え、計算を行い、車の状態を変更する大きなswitchステートメントで構成されています。 私が見る限り、Cars状態は独自のクラス内でのみ使用されます。 私の質問は、これが上記の性質のステートマシンの実装を処理する最良の方法ですか?それは最も明白な解決策のように聞こえますが、過去には「switchステートメントが悪い」といつも聞いていました。 ここで見られる主な問題は、状態を追加すると(必要に応じて)switchステートメントが非常に大きくなり、コードが扱いにくくなり、保守が難しくなる可能性があることです。 この問題のより良い解決策は何ですか?

6
switchステートメントでswitchを減らす方法は?
データベースから2人に基づいて挨拶文を作成する方法を作成しています。 4つのパラメーターがあります。2つの名前(name1およびname2)および2つの性別(genderおよびgender2)です。 性別の組み合わせごとに、ある種の異なる出力があります。 たとえば、性別1がM(男性)で、性別2もであるM場合、出力は次のようになります。 Dear Sir name1 and Sir name2, 現時点では、私のスイッチは次のようになります。 switch(gender1){ case 'M': switch(gender2){ case 'M': printf("Dear Sir %s and Sir %s", name1, name2); break; case 'W': printf("Dear Sir %s and Madame %s", name1, name2); break; case 'R': ... } break; case 'W': switch(gender2){ case 'M': printf("Dear Madame %s …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.