Lei da dupla negação: a regra que todo programador deveria saber.
27/04/2023
Luca Poe
Dentre as discussões da bolha dev¹, uma das mais famosas é a que diz respeito à matemática². Porém, há algo que aparenta ser um ponto pacífico: a lógica é vital para todos os devs. Sabendo disso, apresento-lhes uma lei da lógica clássica que ajudará nos códigos.
Este texto foi originalmente publicado no X, clique aqui para visualizar.
isNaN, isNotEnabled, et al.
“Funções booleanas negativas” naturalmente acabam sendo mais confusas do que funções afirmativas como IsNumber()
. Observe o seguinte exemplo, onde uso a função isNaN()
para verificar se os valores são números:
const firstValue = 30;
const secondValue = "foo";
if(!isNaN(firstValue)){
console.log(`${firstValue} is a number`);
}
if(!isNaN(secondValue)){
console.log(`${secondValue} is a number`);
}
// output => "30 is a number"
A função isNaN
é nativa do Javascript e faz o papel de verificar se o valor passado no parâmetro é um NaN
(Not a Number), em outras palavras: ela verifica se o valor não é um número. No código, passo duas variáveis, a primeira é um número, a segunda não.
Entretanto, além de usar a função, acrescento um operador lógico de negação (!
) junto dela, que, traduzindo para o português, fica algo parecido com: “Não é o caso que não é um número”. Dessa forma, o número é printado e o texto não.
Soou confuso? Veja só:
Negação
Quando negamos algo estamos simplesmente invertendo seu valor-verdade. Se tomarmos P como verdadeiro, estamos tomando !P (não-P) como falso. Ao tomarmos P como falso, !P é verdadeiro.
Eis uma representação usando a tabela-verdade:
P | !P |
---|---|
V | F |
F | V |
Dupla negação
Agora podemos falar sobre o ponto chave para deixar de quebrar a cabeça com essas condições estranhas: a dupla negação.
É perfeitamente possível negar algo duas vezes. Se tomarmos !P como falso e negarmos !P, teremos !!P, que é verdadeiro.
Exemplo em linguagem natural:
Fórmula | Frase | Valor-verdade |
---|---|---|
P | Eu existo. | Verdadeiro |
!P | Eu não existo. | Falso |
!!P | Não é o caso que eu não existo. | Verdadeiro |
Percebam que, em termos de valor-verdade, !!P é equivalente a P. Na linguagem natural, dizer que "não é o caso que eu não existo" (!!P) é equivalente a dizer que "é o caso que eu existo" ou "eu existo" (P). Dessa forma, podemos concluir P de !!P.
Voltando ao código, sabemos que isNaN
(não é um número) é uma negação de isNumber
(é um número). Ao negarmos isNaN (!isNaN
) temos "não é o caso que não é um número", ou seja, "é o caso que é um número" (isNumber
).
Isso também vale para variáveis. Caso tivéssemos uma variável isDisabled
(não está habilitado) com o valor falso, significa que "não é o caso que não está habilitado" (!isDisabled
) ou "está habilitado" (isEnabled
) são verdadeiras e vice-versa.
Por fim, existem triplas, quádruplas, inúmeras negações possíveis. Caso tenha dúvidas: corte as duplas.
!!!P é equivalente a !P, basta cortar todos os pares de negação para chegar nesse resultado. Caso queira, faça você mesmo o teste com linguagem natural e de programação.
Notas
¹ Bolha dev é utilizado aqui como um termo para designar um grupo de desenvolvedores que interagem no X (antigo Twitter).
² Matemática é realmente necessária para ser um desenvolvedor? Constantemente discute-se o quão útil a matemática é na profissão, isso ocorre fora e dentro da bolha. Por outro lado, a necessidade da lógica parece ser um ponto pacífico neste meio.