Ultimamente, tenho trabalhado muito em PHP e especificamente dentro da estrutura do WordPress. Estou percebendo muito código na forma de:
if ( 1 == $options['postlink'] )
Onde eu esperava ver:
if ( $options['postlink'] == 1 )
Esta convenção foi encontrada em certos idiomas / estruturas? Existe alguma razão para a primeira abordagem ser preferível à segunda (de uma perspectiva de processamento, de uma perspectiva de análise ou de uma perspectiva humana?)
Ou é apenas uma questão de gosto? Sempre achei melhor, ao executar um teste, que o item variável sendo testado em relação a alguma constante estivesse à esquerda. Parece mapear melhor a maneira como faríamos a pergunta em linguagem natural: "se o bolo é chocolate" em vez de "se o chocolate é o bolo".
Respostas:
O principal motivo para fazer isso (chamado "condicional de Yoda") é evitar acidentes nos quais você acidentalmente usa um operador de atribuição (
=
) em vez do operador de comparação igual (==
).Ou seja, se você cometeu o erro de fazer:
A declaração será avaliada como
true
(ou, no caso de algumas linguagens - como PHP - um valor verdadeiro) e você terá um erro difícil de encontrar.Mas se você fez:
Você receberá um erro fatal porque não pode atribuir
$foo
a um número inteiro.Mas, como você apontou, reverter a ordem geralmente torna as coisas menos legíveis. Portanto, muitos padrões de codificação (mas não todos, incluindo o WordPress ) sugerem ou exigem,
$foo == 1
apesar dos benefícios da caça aos bugs1 == $foo
.Geralmente, meu conselho é seguir qualquer padrão de codificação estabelecido, se houver: para o WordPress, isso significa usar condicionais Yoda.
Quando não existe, e é impossível estabelecer um consenso com seus colegas, a escolha é do revendedor.
fonte
:=
o operador de atribuição (com==
teste de igualdade) para evitar esse tipo de problema.=
vez de==
. A diferença é tão acentuada em todos os lugares que eu nunca os confundi. Por outro lado, eu li muitos trechos de código que são confusos ou difíceis de entender. Como tal, eu colocaria as prioridades na legibilidade :). Independentemente, boa resposta.-Wall -Werror
ou o equivalente do seu compilador / intérprete. Existem muito poucas situações em que uma atribuição dentro de uma condição está correta, quanto mais legível. Muitos idiomas nem permitem.if($foo = 1)
avaliadotrue
em algumas linguagens, no PHP ele é avaliado como 1;if($foo = 20)
avalia para 20;if($foo = 0)
avalia como 0, o que, diferentemente dos outros, é falso. Isso pode adicionar uma camada completa de complexidade ao bug.É um mecanismo de codificação defensivo destinado a impedir o uso acidental do operador de atribuição.
Considere um uso indevido / erro do operador de atribuição no lugar do operador de igualdade
O condicional acima sempre retornaria verdadeiro, mas provavelmente não é o que o programador original tinha em mente. Considere, em seu lugar, este
Aqui, o PHP (e a maioria das outras linguagens) se recusaria a executar, pois é impossível atribuir qualquer coisa ao valor fixo de
1
. Ao codificar todas as instruções condicionais dessa maneira, você garante automaticamente nenhum uso acidental de um operador de atribuição em uma condicional.fonte
Eu gosto de usar essa convenção em java para remover a possibilidade de uma exceção de ponteiro nulo. Portanto, algo assim não causará problemas ou precisará de código extra:
fonte
Na prática, muitos compiladores lhe darão um aviso se você escrever "if (x = 1)" em vez de "if (x == 1)" porque provavelmente é um erro.
Com o Clang, você pode evitar o aviso dizendo efetivamente ao compilador "Eu quero dizer isso e sei o que estou fazendo", e isso é feito escrevendo "if ((x = 1))". Observe os parênteses extras. Isso funciona em outras situações também. declaração if (falsa); pode avisar que a instrução nunca é executada; declaração if ((false)); não dá esse aviso.
fonte
if ($array = getSomething()){ // ..so something with $array }