0

これがcomp-sci 101の質問である場合は申し訳ありません。明らかな何かが欠けているかどうかはわかりません。

たとえば、一部のユーザー入力でエラーがスローされた場合、それをキャッチしてフィードバックを返したいとします。エラーは 0 ~ 8 の数値になります。0 は「エラーなし」を意味します。エラーが 3 の場合は、ユーザーに非常に具体的なフィードバックを提供したいと考えています (数字は許可されていません)。他の 7 つの可能性については、スクリプトを終了してエラーをエコーし​​たいだけです。

私はこれを解決していて、これで行くことにしました:

$no_errors ($_error != 0 || $_error != 3) ? FALSE : TRUE;
if (!$no_errors)
echo $error_msg['$_error'];
$error_3 ($no_errors && $_error == 3) ? TRUE : FALSE;
if ($error_3)
   bunch of stuff happens;
else
   bunch of other stuff;

とにかく、最初の行の OR 演算子に気付き、AND 演算子を使用する方が安全であると考えていました。しかし、考えれば考えるほど、違いが見えなくなります。

したがって、本当の問題は、特定の変数の 2 つの可能性を排除したい場合、AND と OR は同一であるか、論理的/機能的に最適な方であるかということです。

4

10 に答える 10

21

switch ステートメントを使用すると、はるかに読みやすくなります。

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}
于 2009-01-19T11:37:53.970 に答える
5

まず、「マジック ナンバー」を使用する以外に、エラーを特定する別の方法を使用することをお勧めします。「3」の意味を簡単に忘れてしまうため、維持するのが困難です。あなたの言語は、例外をサポートしている PHP のようです。代わりにそれらを使用することをお勧めします。詳細については、http: //dk.php.net/exceptionsを参照してください。

論理演算子に関しては、「良い習慣」と見なされるものは実際にはありません。あなたが望むものを使用してください。式が true/false であるか判断できない場合は、真理値表を作成してみてください: http://en.wikipedia.org/wiki/Truth_table

于 2009-01-19T11:37:21.553 に答える
2

パフォーマンスに関しては、ほとんどの言語で評価が遅延することに注意してください。OR を使用して、最初の条件が true の場合、2 番目の条件を評価せずに true を返します。AND の場合、最初の条件が false の場合、2 番目の条件を評価せずに false を返します。

それ以外の場合、オペレーター自体のパフォーマンスは実際には違いはありません。最も読みやすいものを使用してください。

于 2009-01-19T11:33:29.110 に答える
1
  1. 個人的には、これらの数値の使用をやめて、代わりに定数を使用します。メンテナンスが容易であるだけでなく、コーディング自体がはるかに簡単になり、明日値を更新することができます。
  2. gkrogers によって提案されているように、同じことを達成している間の切り替えは、読みやすく、維持するのがはるかに簡単です
于 2009-01-19T12:39:57.260 に答える
1

最適なのは、コードをより速く読むのに役立つものです。これは、ここで、おそらく他の何百万もの場所で実行できる唯一の真の最適化です。

于 2009-01-19T11:36:19.433 に答える
1

これは読みやすくなります:

  if($_error==3)
      do stuff;
    else if($_error>0)
      do some other stuff
    else
      do normal stuff

あなたが勝つかもしれないマイクロ秒に誰も気づきません。

于 2009-01-19T11:36:32.567 に答える
1

論理的には、以下は同一です(私の疑似コードを許してください)

(! expression_one || ! expression_two) /** this is the same as the one below **/
! (expression_one && expression_two)

機能的にはどちらがより最適ですか? どちらもお互いに最適です。最初の式が true (|| の場合) または false (&& の場合) の場合、両方の方法 (&& と ||) でショート サーキットが許可されます。

于 2009-01-19T11:38:36.590 に答える
0

使用する場合:

$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;

これは、$error != 0 AND $error != 3 が無効なロジックであることを意味します。これは、$error を 3 と 0 に == することはできないため、3 OR 0 にすることはできますが、両方にすることはできません。
上記の例では、$error = 0 の場合、3 && 0 ではないため、FALSE と評価されます。0.

于 2009-01-19T12:33:49.363 に答える
0

(A || B) = !(A && B)。だから本当に変わらない

編集: (A || B) = !(A && B) は間違っています。コメントありがとうございます。正しい形式は (!A || !B) = !(A && B) です。

謝罪いたします

于 2009-01-19T11:35:20.667 に答える
0

パフォーマンスに関しては、それらは非常に似ていると思いますが (wvanbergen の投稿を参照)、動作には明らかな違いがあります。あなたの現在の投稿は、あなたが望んでいることをしていない可能性があると思います. 最初の行で $_error = 3 の場合、$no_errors = false になります。両方を満たす必要がある 2 つの条件を確認しているため、おそらく and の方が適切です。

自分の論理を確認する最も簡単な方法は、自分が言いたいことを実際に声に出して言うことだと思うことがあります。たとえば、「エラー コードが0でも 3 でもない場合、エラーはありませ

このような変数が少ない状況では、英語で文を書く方法が、論理演算子を決定するための最も直感的 (かつ正確) な方法であることが一般的にわかります。

このプロセスの後でコードが乱雑に見える場合は、De Morgan の法則に関するこのリンクが役立つことがあります。

于 2009-01-19T11:46:49.427 に答える