Вопрос

Извините, если это сложный вопрос. Я просто не уверен, что упускаю что-то очевидное.

Допустим, некоторые пользовательские данные выдают ошибку, и я хочу ее перехватить и вернуть некоторую обратную связь. Ошибка будет числом от 0 до 8. 0 означает & Quot; No Error & Quot ;. Я хочу дать пользователю очень конкретную обратную связь, если ошибка равна 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. Но чем больше я размышляю, тем меньше я вижу разницу.

Таким образом, реальный вопрос в том, хотите ли вы исключить две возможности конкретной переменной, являются ли AND и OR одинаковыми или одна из них логически / функционально более оптимальна?

Это было полезно?

Решение

логически следующее идентично (извините за мой псевдокод)

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

Что функционально лучше? Они оба оптимальны друг для друга. Оба способа (& Amp; & Amp; и ||) допускают короткое замыкание, если первое выражение истинно (в случае ||) или ложно (в случае & Amp; & Amp;)

Другие советы

Будет гораздо удобнее читать, если вы используете оператор switch:

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}

Прежде всего, я думаю, что я бы порекомендовал использовать другой способ выявления ошибок, чем " magic numbers " ;. Их сложно поддерживать, так как вы легко забываете, что & Quot; 3 & Quot; означало. Похоже, ваш язык PHP, который поддерживает исключения. Я бы рекомендовал использовать их вместо этого, вы можете узнать больше о них здесь: http://dk.php.net/ исключения

Что касается логических операторов, на самом деле нет таких, которые считаются " хорошей практикой " ;. Используйте то, что вы хотите. Если у вас возникли проблемы с определением истинного или ложного выражения, попробуйте составить таблицу истинности: http: // en.wikipedia.org/wiki/Truth_table

Что касается производительности, имейте в виду, что оценка будет ленивой на большинстве языков. Используя OR, если первое условие истинно, оно вернет истину без оценки второго условия. Для AND он вернет false, если первое условие ложно, без оценки второго.

В остальном производительность самих операторов не сильно отличается. Используйте то, что наиболее читабельно для вас.

Лучшим является тот, который помогает вам читать код быстрее. Это единственная настоящая оптимизация, которую вы можете сделать здесь, и, возможно, в миллионах других мест.

Это выглядело бы более простым для чтения:

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

Никто не замечает микросекунд, которые вы можете выиграть.

<Ол>
  • Лично я бы исключил использование этих чисел и использовал бы вместо них константы. Помимо того, что их легче поддерживать, они значительно упрощают кодирование и позволяют обновлять значения завтра, например. если какое-то обстоятельство вынуждает вас изменить число с 3, вам придется в значительной степени просмотреть весь ваш код
  • Как предлагает gkrogers, переключатель выполняя то же самое намного легче читать и поддерживать
  • По производительности я считаю, что они очень похожи (см. пост wvanbergen), однако существуют очевидные различия в поведении. Я думаю, что ваша текущая публикация может не делать то, на что вы надеетесь. В первой строке, если вы $ _error = 3, у вас будет $ no_errors = false. Поскольку вы проверяете два условия, которые оба должны быть выполнены, возможно, они будут более подходящими.

    Иногда я нахожу, что самый простой способ проверить свою логику - это сказать вслух то, что я хочу. Например, & Quot; У нас нет ошибок, если код ошибки не 0 и не 3 & Quot;

    Обычно я нахожу, что в подобной ситуации с несколькими переменными способ написания предложения на английском языке дает мне наиболее интуитивный (и точный) метод определения логических операторов.

    Если вы обнаружите, что после этого процесса код выглядит грязным, то вы можете найти этот ссылка на законы де Моргана полезна

    (A || B) =! (A & amp; & amp; B). Так что на самом деле это не имеет значения

    РЕДАКТИРОВАТЬ: (A || B) =! (A & amp; & amp; B) неправильно. Ткс за комментарий. Правильная форма (! A ||! B) =! (A & Amp; & Amp; B).

    Мои извинения

    Если вы используете:

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

    Это означает, что если $ error! = 0 AND $ error! = 3, что является недопустимой логикой, поскольку $ error не может быть от == до 3 и 0, это может быть 3 ИЛИ 0, но не оба. В приведенном выше примере, если $ error = 0, тогда он будет равен FALSE, потому что это не 3 & Amp; & Amp; 0 вы ищете, чтобы это было либо 3 || 0.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top