6
respostas

Lógica real invertida.

Já foi aberto outro tópico com a mesma dúvida e discordo da resposta dada pela instrutora.

No exercícios foi passado que: const chuva = false;

            if (!chuva) {
            console.log("Não está chovendo. Pode sair de casa.");
            } else {
            console.log("Está chovendo. Melhor ficar em casa.");
            }

Ainda que a lógica da operação esteja correta e retornado o primeiro log, no mundo real a ideia de que chuva = true deveria considerar que ESTÁ chovendo. O exercício induz a erro iniciantes, que pensarão que a variável chuva retornar o valor falso deveria apresentar o log "Não está chovendo". Não me parece que o exercício foi criado propositalmente para apresentar essa provocação.

6 respostas

Olá Kevin,

Talvez eu não tenha entendido a sua dúvida, mas tanto o código quanto a escolha do nome da variável (chuva) e os significados para os seus possíveis valores (true significa "está chovendo" e false significa "não está chovendo") estão a meu ver corretos e alinhados com o "mundo real". No código, veja que tem uma exclamação (!) na frente da variável chuva, que é o operador de negação. Portanto, deve-se ler "se não chuva...". Será que era isso que acabou passando batido?

Oi Roger, isso seria verdade se a própria variável chuva não já estivesse sido declarada como false no inicio. A partir do momento que se usa a negação !chuva, o valor passa a ser true, ou seja, deveria estar relacionado com "está chovendo". A lógica está invertida, no que consiste a nossa percepção humana, ainda que a do código em si esteja correta e devolvendo o primeiro log.

Oi Kevin,

A partir do momento que se usa a negação !chuva, o valor passa a ser true

Note que "valor" na sua frase se refere à expressão !chuva e não à variável chuva. Uma coisa é a variável chuva e outra coisa é uma expressão que usa a variável chuva pra representar algo. Usar a variável na expressão não muda o valor da variável. Ela continua sendo false e isso continua significando que não está chovendo.

ou seja, deveria estar relacionado com "está chovendo"

Não, pois o que está sendo avaliada é a expressão !chuva e não a variável simples chuva.

Vamos dar um passo pra trás. Veja se você concorda com a seguinte tabela:

VariávelValorSignificado
chuvatrueestá chovendo
chuvafalsenão está chovendo

A meu ver, ela é bem alinhada com a percepção humana, certo? Se até aqui tudo bem, vamos pro próximo passo, que é o "if"

A melhor maneira de "ler" if (!chuva) é "se não chuva", assim mesmo, literalmente. Trocando a variável pelo seu valor, fica: "se não falso". E "não falso" é a mesma coisa que "verdadeiro" (ou true). Então finalmente fica "se verdadeiro", o que faz a execução do código entrar no primeiro bloco e imprimir "não está chovendo".

Note que o valor da variável chuva não foi alterado, ele continua sendo false e isso continua significando que não está chovendo. O simples fato de se avaliar a expressão !chuva não muda a realidade, é apenas uma leitura.

Obviamente poderíamos mudar o código pra remover essa negação sem mudar em nada o resultado nem a semântica:

if (chuva) {
    console.log("Está chovendo. Melhor ficar em casa.");
} else {
    console.log("Não está chovendo. Pode sair de casa.");
}

Veja se ficou mais claro e nos conte se deu aquele "click" e tudo agora faz sentido, tipo, "aaaahhhh, óbvio.. rs..."

Oi Roger, veja

você colocou:

VariávelValorSignificado
Chuvafalsonão está chovendo

logo, a representação da variável chuva com um valor falso quer dizer que não chove, certo? ai é utilizado o operado !chuva, ou seja, você diz "caso não, não esteja chovendo", você opera uma dupla negação, que logicamente resulta em que? em um valor verdadeiro. O valor da variável não está sendo mudado, e é exatamente essa a questão. Pra deixar mais claro:

    const chuva = true //está chovendo
    
    if (!chuva) //se não chuva (se não estiver chovendo)
    
    const chuva = false //não está chovendo
    
    if (!chuva) //aqui considere que a leitura da expressão não diz só "se não chuva",  ela dá uma dupla negação, pois o valor é false.

Vou deixar mais claro:

    const nãoEstaChovendo = chuva //pois o valor é false, certo?
    if (!nãoEstaChovendo) { // se não, não estiver chovendo (significa que está chovendo).
    console.log('não está chovendo, pode ficar casa') // mas está chovendo! a operação acima acabou de negar a não chuva.

Como eu disse, lógica do código está correta porque ele compara se !chuva = true, então retorna o primeiro log, mas a frase do log não faz sentido. Basicamente, há duas leituras, considerar o valor da variável, e ai vai estar confuso, ou considerar o nome da variável somente, levando em conta que os valores servem apenas para retorno da operação (ai sim, nesse caso, !chuva é dizer "se não chove"). Espero ter conseguido me fazer claro. Agradeço :D

Oi Kevin, vamos lá. Que o espírito de George Boole esteja conosco!

"a representação da variável chuva com um valor falso quer dizer que não chove, certo? "

Certo!

"const nãoEstaChovendo = chuva //pois o valor é false, certo? "

Errado. No mundo em que o valor true na variável chuva significa que está chovendo, essa atribuição não faz sentido. Relembre a tabela acima. Pense que a variável "chuva" se chama na verdade "estáChovendo", acho que vai ajudar. A atribuição correta seria:

const nãoEstáChovendo = !chuva // independente do valor da variável chuva

A partir do momento que você escolhe usar variáveis pra representar valores em seu programa, você deve pensar na lógica do seu programa em termos dessas variáveis, independente de seus valores atuais. Por isso a escolha de nomes de variáveis em programação é tão importante. Na maior parte dos casos, os valores reais (no caso true/false) só serão determinados em tempo de execução do seu programa. Se fosse o contrário, não precisaríamos de "if"s pois já saberíamos os valores e nem precisaríamos de variáveis.

Talvez o que esteja te confundindo seja o const chuva = false. Num exemplo mais real, pense que o valor da variável chuva não esteja assim "cravado" no código, mas que ele venha de um sensor ou da resposta de uma API de previsão do tempo por exemplo.

Particularmente eu discordo. Fosse o caso de uma API retornando o valor, bastaria utilizar uma condicional com operador if (chuva === true) {console.log('tempo chuvoso'). A própria documentação do javascript determina que:

"Retorna false se seu único operando puder ser convertido em true; caso contrário, retorna true."

Ou seja, utilizar a dupla negação é a contra sensu. Mas obrigado pelo compartilhamento!