TransWikia.com

"== true" é útil para alguma coisa? É melhor "!" ou "== false"?

Stack Overflow em Português Asked by Eduardo Mior on January 2, 2022

Colocar == true é útil nas verificações, ou é completamente inútil?

É melhor usar ! ou == false.

Exemplo:

if (pessoa.estaMorta() == false) ....
if (!pessoa.estaMorta()) ....

if (pessoa.estaViva() == true) ....
if (pessoa.estaViva()) ....

Dei uma pesquisada e não achei nada a respeito.

3 Answers

Acredito que isto seja bastante útil em linguagens de tipagem dinâmicas, onde um 0 e false são tratados igualmente.

Apenas para um efeito de exemplo, o PHP, existe uma função de strpos. Ele retorna a posição onde o texto procurado foi achado ou retornará false se não for achado o valor procurado na string. Isto parece normal, porém o valor procurado for encontrada no inicio da string ele retornará 0.

Uma vez que está lidando com uma linguagem onde 0 e false são iguais, você terá problemas nestas situações.

Pessoalmente, prefiro usar sempre o if($variavel === false), assim garanto que não terá um efeito indesejável em nenhum caso. Entretanto, em outras linguagens, usar simplesmente if(variavel) faz muito mais sentido, já que possivelmente variavel poderá ser apenas true ou false.

Answered by Inkeliz on January 2, 2022

Geralmente quando você vê um código em um if comparando com false ou true, está fazendo algo supérfluo, já que o if sempre espera um booleano, portanto, só pode ser esses 2 valores. Qualquer expressão que resulte um booleano satisfaz a necessidade.

O operador relacional, que estabelece se a grandeza é a mesma, diferente, maior, menor, sempre retorna um booleano, então também satisfaz a necessidade. De fato, na maioria dos casos, ele acaba sendo necessário porque o tipo da expressão usada não é booleano, e ele é a forma simples de gerar um booleano.

O que muitas pessoas não sabem é que o if não exige nada disso, só precisa um resultado booleano. Isto é válido:

if (true)

ainda que sem sentido prático. Outra forma:

valor = true
if (valor)

ou

totalDescontandoAcimaLimite = valorUnitario * quantidade * 0.9 > 100
if (totalDescontandoAcimaLimite)

que é totalmente desnecessário ter essa variável, porém a sua existência aumenta a legibilidade. Já

condicao = valorUnitario * quantidade * 0.9 > 100
if (condicao)

não é mais legível. As pessoas usam variáveis sem expressividade alguma só porque elas não entendem para que serve uma variável (não vou falar que falham em comunicação e expressão também).

Então entenda que as pessoas fazem coisas sem elas entenderem porque estão fazendo. E eu divido em duas categorias:

  • quem não sabe como o if funciona

    e confirmando que a única coisa especial é que ele exige receber como "argumento" um booleano, como se chega nele não importa, tem linguagens que aceitam até que se faça um cast ou um número normal seja promovido ao booleano automaticamente.

  • quem sabe isso e insiste em usar a forma redundante porque acreditam ser mais legível

    Entretanto essa crença vem porque ela tem entendimento parcial do que está fazendo. Claro que ela pode dizer que gosta assim, e ninguém pode questionar o gosto de alguém, mas se ela afirma que universalmente é legível, ou ela está sendo arrogante, ou está sendo ignorante, e está só repetindo o que algumas pessoas dizem.

Essas mesmas pessoas não fazem por exemplo

atual = estoque.contagem + 0

Ela justifica que usa o == true para ter certeza que é um booleano onde se espera um booleano. Pois bem, porque ela não usa um + 0 para indicar que é um inteiro em um lugar que não temos como saber se é ou não, só olhando esse código? É muito mais necessário assim para tornar legível qual é o tipo da expressão neste caso do que no if e ninguém o faz. É um caso clássico de "dois pesos, duas medidas" que em geral não é feito por má fé, é que a pessoa não consegue equalizar o que está fazendo.

Nunca vi alguém fazendo isto:

if (objeto instanceof Tipo == true)

Coloquei no GitHub para referência futura.

No mínimo a pessoa deveria ser consistente. Por que a pessoa não faz assim e nesse caso ela não usa o == true? Porque ela aprendeu usar esse operador desse jeito, e as pessoas tendem fazer as coisas por receitas de bolo e não porque entenderam o que é certo. Se ela acreditasse tanto assim na maior legibilidade de verificar de novo o que ela já sabe ela faria nesse caso também. O argumento dela é pura balela.

Eu acho menos legível ser explícito, e é o mesmo que dizer "subir pra cima". Leia a expressão fluentemente em português mesmo e me diga qual funciona melhor como texto coerente.

Só falta um do, ou then do logo após a expressão de condição para ficar mais fluido. Algumas linguagens mais derivadas do Pascal até o fazem assim e isso até pode-se falar que é mais legível sob um certo aspecto.

Linguagens mais derivadas de C preferem o jeito curto como forma de tornar mais legível, ela opta pela forma mais matemática. Se a pessoa gosta de verbosidade e escolhe a linguagem que evita fazer assim já escolheu a ferramenta errada.

Cavalo dentro de um carro de passeio

Tem linguagem, em geral as funcionais, onde seus usuários garantem ser mais legíveis que qualquer outra linguagem por ser tudo mais curto. E eu concordo, embora seja mais difícil aprender, e "assusta os mais fracos" por ser algo diferente, algo que precisa se dedicar para criar um fluxo natural na cabeça. Os melhores programadores que conheço usam linguagens funcionais e de baixo nível, onde a legibilidade natural não importa, e sim ser curta para ler.

O mesmo vale para preferir == false no lugar de !, a pessoa pode até ter aprendido matemática, afinal ela usa a aritmética de forma natural, quando chega na álgebra booleana ela não consegue ser natural, portanto, me perdoe, mas ela ainda não sabe programar.

Qualquer um pode achar diferente. Tentei fundamentar como cheguei nessa conclusão. Toda vez que escrevo isso e alguém discorda, fica só nisso, sem justificar.

Sugiro essas pessoas pararem de usar 2x+1 e usarem dois vezes xis mais um, é mais a cara delas. Mas podem escrever código como acharem melhor, dá no mesmo, funciona e está certo, só é horrível pro meu gosto.

Answered by Maniero on January 2, 2022

Se os métodos estaViva() e estaMorta() retornarem valores booleanos, é completamente redundante igualar a true ou false. Não que signifique que não se pode fazer, mas é desnecessário.

Se ambos os métodos já retornam um valor booleano, basta utilizar o retorno deles como condiçao para o if com if (!pessoa.estaMorta()) e if (pessoa.estaViva()), isso melhora a legibilidade do código.

Answered by user28595 on January 2, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP