web-dev-qa-db-ja.com

ifステートメントとswitchケース? JavaScriptゲームで、関数を使用するかどうか

私はJavaScriptでゲームを開発しています。そこでは、変数「コントローラー」に格納されたユーザー入力から始めます。ユーザーのオプションは、ゲームを開始するための開始、またはゲームについて学ぶことから成ります。次のコードを使用しました

if(controller === "start"){
    // Game code sitting here
}
else if(controller === "about"){
    // All about the Game
}
else{
    // Tells the user again to type start to start or about to learn about the game
}

代わりにスイッチケースを使用する必要があることに気づいたとき...

したがって、私の質問は、ifステートメントの代わりにswitchケースを使用する場合と、この場合にどのケースを使用するかです。また、ゲームコードを関数に格納し、コントローラーが「start」と等しい場合に呼び出す必要があるか、またはatmであるifステートメント/スイッチケース内に配置するかを知りたいですか?

8
Ben Watkins

switchステートメントの代わりにifを使用する場合

次の場合は、switchではなくifを使用します。

  1. 式の考えられる複数の条件を比較していて、式自体が自明ではない。
  2. 同じコードを必要とする可能性のある複数の値があります。
  3. 本質的に別の値の実行のすべてを必要とするいくつかの値と、いくつかのステートメントのみがあります。

次の場合は、ifではなくswitchを使用します。

  1. 式の真実性をテストしたいとします。
  2. 肯定的なテストは1つしかありません。
  3. ブランチごとに異なる式を評価する必要があります。

この場合、どちらを使用すればよいですか?

どちらがより快適か。状態エンジンの評価では、switchステートメントを使用すると、シノニムを後から簡単に追加できるため、多少の柔軟性が得られます。しかし、違いは重要ではありません。

ゲームコードを[seperate]関数に保存する必要がありますか、それともatmのifステートメント/ switchケースの中にコードを保存するだけですか。

各ブランチの内部コードを明確に別の関数に移動する必要があります。数千行の関数の真ん中にある場合、機能を簡単に単体テストすることはできません。

11
DougM

セマンティクス、セマンティクス、セマンティクス。

個人的には、このような状況でどちらがわかりやすいかを判断します。

理解の容易さに影響を与えるのは、やはり、私の意見では、おそらくいくつかの要因の組み合わせです。

  1. 包括的-各法的価値を処理する特定の方法はありますか?その場合、スイッチが正常に機能している可能性があります。
  2. 依存性/相互排他-条件は互いに依存していますか?もしそうなら、ifステートメントはより柔軟かもしれません。
  3. 3つ以上のケース-スイッチ/ケースには私にとっていくつかの認識オーバーヘッドがあるため、true/falseのスイッチ/ケースが表示されてイライラします。おそらくif (x) { } else { }の方がスリムだからです。
  4. アクションはどの程度似ていますか?それらは同じドメインに属しますか?あるケースが変数を設定または返すときに、別のケースが状態を変更する関数を実行し、別のケースが情報の一部を出力する場合、ケースはまったく関係がないため、ケースを作成しません。ただし、すべてがメニュー選択をオンにして、次のステップとして別の機能を実行する場合は、すべてのケースで「次のステップ」を選択するため、これは適切なスイッチです。

最初の2つは、包括的かつ相互に排他的であり、物理的なスイッチについて考えることで思い付きます。 5つの状態にできるスイッチがあるとします。実際にスイッチになるためには、常に1つの状態にしかできません。状態を持つことはできず、別の状態と共存することもできません。ソフトウェアでは、これは、すべての入力について、少なくとも1つのcaseステートメントが一致する必要がある(デフォルトを含む)と言うようなものです。

繰り返しますが、これは私の個人的な好みです。これに関する公式のガイドラインがあるかどうかはわかりません。

5
Brandon

ケースはこの操作にうまく適合します。また、シングルトンディクショナリをインスタンス化し、コントローラに実行する必要があるすべての機能をそのディクショナリに入力して、コントローラがアクティブになるたびにディクショナリを単純に処理することもできます。

If/thenを使用すると、caseステートメントや辞書よりも維持が非常に難しいため、問題が発生する可能性があります。

0
World Engineer