Pergunta

Desculpe se isso é um comp-sci 101 questão. Eu sou apenas certeza se eu estou faltando algo óbvio.

Então, digamos que alguma entrada do usuário gera um erro, e eu quero pegá-lo e retornar algum feedback. O erro será um número, 0 - 8. 0 significa "sem erro". Eu quero dar ao usuário um feedback muito específico, se o erro é de 3 (Sem números permitidos, digamos). Para os outros 7 possibilidades, eu só quero terminar o roteiro e ecoar o erro.

Eu estava trabalhando isso e decidiu ir com isto:

$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;

De qualquer forma, eu estava em seguida, percebendo o operador OU na primeira linha e estava pensando que poderia ser melhor / mais seguro para o usuário um operador AND. Mas quanto mais eu contemplar, menos eu vejo a diferença.

Portanto, a verdadeira questão é, se você quiser eliminar duas possibilidades de uma variável específica, são AND e OR idênticos, ou é um logicamente / funcionalmente mais ideal?

Foi útil?

Solução

logicamente o seguinte são idênticos (desculpem o meu código pseudo)

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

Funcionalmente qual é o mais ideal? Ambos são como ideal como um ao outro. Ambas as formas (&& e ||) provoque um curto-circuito se a primeira expressão é verdadeiro (no caso ||) ou falsa (no && caso)

Outras dicas

Será muito mais legível se você usar uma instrução switch:

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

Em primeiro lugar, eu acho que eu recomendo usar uma outra maneira de identificar erros do que usando "números mágicos". Eles são difíceis de manter, como você esquecer facilmente o que "3" significava. Parece que a sua linguagem é PHP, que tem suporte para exceções. Eu recomendo usá-los em vez disso, você pode ler mais sobre eles aqui: http://dk.php.net/ exceções

Quanto aos operadores lógicos, não há realmente qualquer que são consideradas "boas práticas". Use o que você quer. Se você tem dificuldade para descobrir quando a sua expressão é verdadeiro / falso, tente fazer uma tabela verdade: http: // en.wikipedia.org/wiki/Truth_table

Em termos de performance, tenha em mente que a avaliação vai ser preguiçoso na maioria dos idiomas. Usando OR, se a primeira condição for verdadeira, ele irá retornar verdadeiro sem avaliar a segunda condição. Para E, ele retornará false se as primeiras condições é falsa, sem avaliar o segundo.

Caso contrário, o desempenho dos próprios operadores não é realmente diferente. Use o que é mais legível para você.

O melhor é aquele que ajuda você código de leitura mais rápida. É a única verdadeira otimização que você pode fazer aqui, e, possivelmente, em milhões de outros lugares.

Este seria mais simples para ler:

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

Ninguém percebe as microssegundos que você pode ganhar.

  1. Pessoalmente eu gostaria de eliminar o uso desses números e constantes usar no lugar. Além de ser mais fácil de manter, eles fazem a própria muito mais fácil de codificação e permite que você atualize os valores amanhã por exemplo se alguma circunstância foreces que você mude o número de 3, você tem que olhar muito bonita através todo o seu código
  2. Como sugerido por gkrogers, um interruptor enquanto faz a mesma coisa é muito mais fácil de ler e manter

Em termos de desempenho Eu acredito que eles são muito semelhantes (ver post por wvanbergen), no entanto, existem diferenças óbvias no comportamento. Eu acho que a sua postagem atual não pode estar fazendo o que você está esperando. Na primeira linha se você $ _error = 3, então você terá $ no_errors = false. Como você está verificando para duas condições que ambos precisam ser satisfeitas talvez uma e seria mais apropriado.

Às vezes eu encontrar a maneira mais fácil de verificar a minha lógica é realmente dizer o que eu quero em voz alta. Por exemplo, "Não temos erros se o código de erro é não 0 e não 3"

Eu geralmente descobrir que, em situação como esta, com apenas algumas variáveis, a maneira que eu iria escrever a frase em Inglês me proporciona o método mais intuitiva (e precisa) para determinar os operadores lógicos.

Se você achar que a aparência código confuso após este processo, então você pode encontrar este link em leis de de Morgan útil

(A || B) =! (A && B). Então, ele realmente não faz diferença

EDIT: (A || B) = (A && B) está errado. Tks para o comentário. A forma correcta é (! A ||! B) =! (A && B).

As minhas desculpas

Se você usar:

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

Isto significa que se $ error! = 0 e $ error! = 3, que é a lógica inválida porque $ erro não pode ser == a 3 e 0 pode ser 3 ou 0, mas não ambos.
No exemplo acima, se $ erro = 0, então seria avaliar como FALSE, porque não é 3 && 0 que você está procurando-o para ser 3 || 0.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top