Um comentário sobre esta pergunta: Verificando se um método retorna false: atribua resultado à variável temporária ou coloque a invocação do método diretamente em condicional? diz que você deve usar em !boolean
vez de boolean == false
testar condições. Por quê? Para mim boolean == false
é muito mais natural em inglês e é mais explícito. Peço desculpas se isso é apenas uma questão de estilo, mas eu queria saber se havia algum outro motivo para essa preferência de !boolean
?
60
boolean == true
: não faz sentido. Expressões dentro deif
instruções são exatamente isso: expressões. Se algo já é avaliado para uma expressão booleana, por que você adicionaria uma verificação para forçá-lo a avaliar?!boolean_variable
é assim que a maioria dos programadores C faz, eu concordo.boolean != true
?Respostas:
Quando vejo uma frase como
if (!lateForMeeting())
, li isso como "Se não chegar atrasado para a reunião" , o que é bastante simples de entender, em vez deif (lateForMeeting() == false)
ler como "Se o fato de estar atrasado para a reunião for falso " .Eles têm o mesmo significado, mas o primeiro está mais próximo de como a sentença equivalente em inglês seria construída.
fonte
if not late_for_meeting
:) #unless late_for_meeting
done()
. Negativos duplos são ruins.Escrever
== false
e== true
é redundante. Também pode ser levado a extremos arbitrários. Se você começar a escreverEntão porque não
Ou porque não
A moral dessa história é que, se
condition
for uma expressão booleana, você não precisará adicionar== false
;!
é para isso que serve o operador ;)fonte
== false
NÃO é redundante, apenas mais detalhado que!
. OTOH,== true
é redundante.(exp1 != exp2)
vs((exp1 == exp2) == false)
. É certo que esses são cenários planejados, mas você quase nunca deve escrever comparações explícitas como verdadeiras ou falsas. Assim como você deve usar o operador!=
, também deve usar!
.!
.bool_expression == bool_literal
,== ...
é redundante. Se você está testando se é verdadeiro ou falso, é irrelevante. É apenas uma mudança na ordem dos blocos consequentes / alternativos. Os exemplos de Andrés ilustram esse ponto perfeitamente. A maioria dos compiladores modernos otimiza a redundância, mas ainda é redundante.Em C e em algumas linguagens similares, comparar expressões booleanas para igualdade
false
outrue
é um hábito perigoso.Em C, qualquer expressão escalar (numérica ou ponteiro) pode ser usada em um contexto booleano, por exemplo, como condição de uma
if
instrução. A regra Cif (cond)
é equivalente aif (cond != 0)
- ou seja, zero é falso e qualquer valor diferente de zero é verdadeiro. Second
é do tipo ponteiro,0
é tratado como uma constante de ponteiro nulo;if (ptr)
meiosif (ptr != NULL)
.Isso significa que
e
não significa a mesma coisa . O primeiro é verdadeiro se
cond
for diferente de zero; o segundo é verdadeiro apenas se for igual atrue
, que em C (se você tiver#include <stdbool.h>
) é simplesmente1
.Por exemplo, a
isdigit()
função declarada em<ctype.h>
retorna umint
valor,0
se o argumento for um dígito, diferente de zero se não for. Pode retornar42
para indicar que a condição é verdadeira. A comparação42 == true
falhará.Acontece que esse
0
é o único valor considerado falso, portanto, a comparação da igualdadefalse
funcionará;if (!cond)
eif (cond == false)
faça a mesma coisa. Mas se você quiser tirar proveito disso, lembre-se de que comparar comfalse
está ok e comparar comtrue
não. Pior ainda, a comparação comtrue
o trabalho na maioria das vezes (por exemplo, os operadores de igualdade e relacionais sempre produzem um0
ou outro1
). Isso significa que qualquer bug que você introduz usando isso ainda pode ser difícil de localizar. (Não se preocupe, eles aparecerão assim que você demonstrar o código para um cliente importante.)C ++ possui regras ligeiramente diferentes; por exemplo, seu
bool
tipo é um pouco mais integrado ao idioma eif (cond)
convertecond
em textobool
. Mas o efeito é (principalmente) o mesmo.Algumas outras linguagens têm o que se poderia chamar de booleanos mais bem comportados, de modo que
cond == true
econd == false
(ou seja qual for a sintaxe) seja seguro. Mesmo assim, todas as línguas que eu vi tem umnot
ou!
operador; está lá, então você pode usá-lo. Usar, emcond == false
vez de!cond
ounot cond
não, na minha opinião, melhora a legibilidade. (É verdade que o!
personagem pode ser difícil de ver de relance; às vezes adiciono um espaço após o!
para evitar isso.)E muitas vezes você pode evitar o problema e melhorar a clareza reorganizando o código levemente. Por exemplo, em vez de:
você pode escrever:
Isso nem sempre é melhor, mas não custa procurar oportunidades onde está.
Resumo: Em C e C ++, as comparações de igualdade
true
efalse
são perigosas, excessivamente verbais e de estilo pobre. Em muitos outros idiomas, essas comparações podem não ser perigosas, mas ainda são excessivamente verbosas e de estilo pobre.fonte
== true
não é seguro. Parece melhor assim.(==True) . f
para esclarecer que queremos a-> Bool
instanciação da função polimórfica de retornof
. Isso é mais claronot . not . f
e menos estranho que(f :: a -> Bool)
.pred(x)==pred(y)
para uma função de retorno de boolpred
. A alternativa seria apred(x)? pred(y) : !pred(y)
que você concorda que é dificilmente aceitável.pred(x)
epred(y)
usar o mesmo valor para denotar a verdade, o que é uma suposição segura em alguns idiomas, mas não em outros. Em C, por exemplo, você pode escrever!!pred(x) == !!pred(y)
.Os dois são funcionalmente idênticos, então qual deles usar é uma questão de gosto.
A principal razão que eu uso
== false
é que eu acho que!
é fácil demais ignorar, ao olhar para o código.Tendo sido severamente mordido por isso, criei o hábito de deixar bem claro ao testar se é falso.
Se o operador tivesse sido nomeado
not
como em Pascal, não acho que isso se tornaria um problema.fonte
== false
vez de,!
pelo mesmo motivo (para destacá-lo). No entanto, não havia necessidade de usar== true
, portanto, qualquer valor diferente de zero ainda funcionava como deveria.!
seja provavelmente o erro mais problemático desse tipo, a IMO não deve criar o hábito de escrever,==false
mas escrever melhores testes de unidade.Se
condition == false
é realmente "muito mais natural em inglês" para você, devo assumir que você não é um falante nativo. Caso contrário, não posso explicar isso, porque ninguém fala assim:Compare isso com
Dito isto, concordo que o
!
caractere único e delgado é facilmente esquecido no código. Por esse motivo, prefiro a palavra-chavenot
quando suportada pelo idioma. O C ++, por exemplo , permite isso, embora muitos programadores não estejam cientes disso.Para idiomas que exigem
!
, coloquei um espaço entre operador e operando. Isso torna muito mais difícil ignorar a negação:Observe que todo programador deve traduzir isso automaticamente , sem pensar duas vezes, em "não condicionar" em sua cabeça. Adquirir esse tipo de fluência na leitura de idiomas de código está entre os primeiros passos para se tornar um bom programador.
fonte
Quando vejo
var == false
, sempre me pergunto sevar
é booleano ou de um tipo lógico com mais de dois valores (com, por exemplo, amaybe
e anundefined
e astrue
efalse
, ou algo como os nove valores da IEEE 1164 ).fonte
porque às vezes você pode escrever
boolean = false
(com os erros óbvios) efalse == boolean
não parece natural (não importa quão boa seja a prática)fonte
if( INVALID_HANDLE_VALUE == hFile )
para evitar coisas assim. Dessa forma, se você escorregar e usar um sinal de igual em vez de dois, receberá um erro do compilador. Obviamente, isso só funciona quando a expressão esquerda é uma constante, mas me salvou mais dores de cabeça do que posso contar.hFile==INVALID_HANDLE_VALUE
.if (!boolean_variable)
traduz paraif the condition is not true
.if (boolean == false)
traduz paraif the condition not false is true
. Porque essa é a lógica inversa, é mais difícil de entender.fonte
isVisible
seria um exemplo melhor. Entãoif (!isVisible)
significaria se não estiver visível - o que é mais simples de entenderif (isVisible==false)
, que é uma lógica inversa. Espero que esteja mais claro agora. Ou entendi mal o seu comentário?Em compiladores (muito) mais antigos, acredito que eles quebrariam (booleano == false) em duas atribuições de registro e um código de comparação em linguagem de máquina. O primeiro exemplo seria dividido em uma atribuição e um operador NOT. Em termos de desempenho, a operação de comparação levaria vários ciclos de clock, dependendo do tamanho do registro sendo comparado, comparado a um invertido bit a bit (1 clock) e seria mais lenta de executar.
Dito isto, acredito que os compiladores mais recentes acabam com isso, então deve ser bom seguir com eles.
fonte
No trabalho, muitas vezes estou lidando com booleanos, que podem ser nulos; portanto, codificarei esse caso como
porque eu pessoalmente sinto que a simetria facilita a leitura. Especialmente se houver outros booleanos sendo testados também.
Eu realmente não me importo de um jeito ou de outro.
fonte
value == true
não houver motivo para verificar se não é nulo. Se avalue == null
instrução nunca deve acionar a instrução if em primeiro lugar, issoif (value)
deve ser suficiente.if (value)
lança uma exceção. Eu apreciaria se as pessoas que votaram negativamente deram uma razão.value == true
seria suficiente.Quando você está testando a condição verdadeira, faz sentido fazer exatamente isso
if (condition)
, especialmente quando você aplica a convenção de nomear variáveis booleanas começando com 'is':if (isOpen)
é perfeitamente claro e o uso!= false
seria redundante.Para um C / C ++ / Java / etc. programador, o significado do '!' O operador é completamente assimilado, a tal ponto que automaticamente "não" temos em nossas mentes quando o vemos. Então, ter
if (!isOpen)
é tão claro quantoif (_NOT_ isOpen)
para mim. Mas você não está familiarizado o suficiente, com o C / C ++ você pode criar uma macro#define _NOT_ !
. Mas confie em mim, depois de alguns anos isso é completamente desnecessário.Além disso, é sempre preferível testar valores booleanos sem compará-los com literais. Por exemplo, é perigoso testar
if (x == true)
porque um valor booleano é considerado verdadeiro se não for zero, e o literal verdadeiro possui apenas um valor específico; portanto, x pode ser 'verdadeiro' (ou seja, diferente de zero) e ainda assim a comparação é avaliada como falsa (porque contém 2 e o literal verdadeiro é, digamos, 1.) É claro que isso não se aplica a uma comparação com false, mas se você não o usa ao testar para true, por que usá-lo ao testar para false?fonte
Tamanho importa ;)
Em expressões mistas, é mais fácil ler:
E especial para o ruby, um exemplo em que há uma grande diferença:
nulo não é falso, mas também não é verdadeiro.
fonte
Baseado na minha experiência e nas respostas da minha pergunta à qual você se vinculou.
Algumas pessoas preferem usar if (condição), pelo motivo que é mais curto para escrever. e para mim, na verdade, faz sentido, por exemplo (! isValidated ()) eu li isso como Não validado. mas, para mim, tudo é baseado em preferências pessoais e depende da estrutura lógica do método isValidated (), se retornar verdadeiro ou falso
fonte
Se você nomeou sua variável corretamente,
!boolean
é mais natural. Ele lê comonot boolean
para quem é programador suficiente para ler código mentalmente.fonte
Para algumas pessoas, quanto mais cedo um significado for expresso, melhor.
Para as pessoas que têm "se! ..." se compara mais rapidamente com "se ...", então precisam ler toda a condição (que pode ser bem longa, por exemplo (thisThing = thatThing ou algo = a outra coisa) OR ( thinga = thingb e thinga = thingd), etc.) apenas para encontrar o == false no final.
Tendo o! (Na verdade, prefiro não quando o idioma o permite) logo de cara o inglês não é 'não' para essa condição.
Esse problema também leva em consideração o uso
until
em idiomas que o suportam, por exemplo, faça 'coisas comuns' até que tudo termine. Como outros dizem, a expressão da linguagem natural é o objetivo. Eu gosto do exemplo "o sol está brilhando" acima.fonte
Outro motivo é que, se você estiver trabalhando em uma base de código que usa vários idiomas, se houver uma maneira idiomática de fazer algo seguro em todos os idiomas, é uma boa idéia fazê-lo dessa maneira em qualquer lugar, para que você forme um bom hábito e são menos propensos a tropeçar.
Não consigo pensar em nenhum lugar que
if (!variable)
(ou equivalente,if not variable
dependendo da sua linguagem) não seja seguro, enquanto, por exemplo,if self.is_ready() == False: ...
não é seguro em python seself.is_ready()
retornarNone
, agora ou no futuro, o que seria uma coisa totalmente razoável de fazer. indicar que não estava pronto, poisNone
é tão falsa quantoFalse
.fonte