Логические операторы: И лучше, чем ИЛИ? - PullRequest
0 голосов
/ 19 января 2009

Извините, если это вопрос 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;

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

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

Ответы [ 10 ]

20 голосов
/ 19 января 2009

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

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}
4 голосов
/ 19 января 2009

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

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

2 голосов
/ 19 января 2009

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

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

1 голос
/ 19 января 2009
  1. Лично я бы исключил использование этих чисел и использовал бы вместо них константы. Помимо того, что их легче поддерживать, они значительно упрощают кодирование и позволяют обновлять значения завтра, например. если какое-то обстоятельство вынуждает вас изменить число с 3, вы должны в значительной степени просмотреть весь свой код
  2. Как предполагает gkrogers, переключатель выполняя то же самое намного легче читать и поддерживать
1 голос
/ 19 января 2009

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

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

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

1 голос
/ 19 января 2009

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

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

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

1 голос
/ 19 января 2009

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

0 голосов
/ 19 января 2009

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

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

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

0 голосов
/ 19 января 2009

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

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

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

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

0 голосов
/ 19 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...