Há um colega meu que escreve constantemente:
if (someBool == true)
Me leva até a parede! Devo fazer um grande negócio ou simplesmente largar?
Há um colega meu que escreve constantemente:
if (someBool == true)
Me leva até a parede! Devo fazer um grande negócio ou simplesmente largar?
if (some_flag == true)
mas o implícitoif (is_something)
ouif (has_something)
. Observe os nomes das variáveis.someBool == true
também é booleano; portanto, pela mesma lógica que deveria serif ((someBool == true) == true)
.$var = (bool) some_expression
. E na maioria dos casos, isso nem importa, já que o PHP fará as conversões necessárias dinamicamente.Respostas:
É apenas código redundante, não vida ou morte. Contudo....
Se isso estiver acontecendo muito, pode haver um problema com o
someBool
nome. Um bom nome pode contribuir bastante para eliminar a necessidade de==true
ou
ou
por exemplo.
fonte
someBool == true
código legado várias vezes para maior clareza. Mas se eu escrever do zero,if (isSomething)
Quando vejo
someBool == true
, não consigo deixar de sentir que o programador não internalizou a ideia de avaliação , que é uma deficiência bastante fundamental.No entanto, minha perspectiva é distorcida porque passei vários verões na faculdade ensinando programação para crianças, que frequentemente escreviam expressões como essa porque realmente não dominavam o exercício mental de avaliar uma expressão. Depois que eles adotaram o conceito, a redundância se tornou óbvia.
Para um programador profissional competente, esse provavelmente não é o caso. Provavelmente é apenas um mau hábito que eles desenvolveram nos seus primeiros dias de programação e nunca se abalaram. Mas ainda me assustaria um pouco se fosse a primeira coisa que vi alguém fazer em uma entrevista.
fonte
if (c == true) return true; else return false;
, mas 99% do tempo (o 1% existe, já que nunca posso ter certeza de que não perdi alguns) notarei imediatamente e substituirei a coisa todareturn c
. Espero que a maioria dos programadores competentes faça algo semelhante se desenvolverem o hábito no início de sua carreira. O que eu não esperaria é uma resposta wtf.if (!someCondition) { someCondition = false; }
Eu já vi algumas (er, muitas) redundâncias, bem como algumas impossibilidades em nosso código, mas essa foi tão simples, mas tão irritante ao pensar que alguém realmente a escreveu. Várias vezes, até.if(x) x=true;
que não foram redundante, mas sim o equivalente ax=!!x;
(normalizar x a 0/1)Isso também me deixa louco, mas eu diria que mencione a redundância de uma maneira construtiva e a abandone, mesmo que não concorram.
Como alternativa, você pode tentar esta abordagem:
Você : Você pode começar a usar a seguinte convenção de código para avaliar os booleanos?
Eles: Por que faríamos isso? A segunda metade dessa afirmação é redundante, sempre avaliada como verdadeira.
Você: Por George, você está certo. Eu tolo. Vamos apenas seguir uma versão sem toda redundância. E se?
fonte
true=true
não compilar, você não pode atribuir atrue
;-)if(somebool == false)
ou!=
, mas sempre contra falso e não verdadeiro. Acho que é redundante, mas como o padrão de codificação insiste queif()
parece uma função chamar o espaço em branco entre os parênteses me ajuda a lê-lo. Sozinho, um bool é um bool, masif (somePointer)
não voa; Eu prefiro,if (somePointer != NULL)
pois um ponteiro não é um bool.Penso que, se algo tão trivial é o seu maior problema com seus colegas de trabalho, você deve se considerar bastante sortudo.
fonte
Você definitivamente deveria parar com esse mau hábito. Suavemente...
É fácil esquecer de escrever os dois sinais de igual, transformando o código em:
Em C #, por exemplo, isso produzirá apenas um aviso, não um erro. Portanto, a menos que você trate os avisos como erros, o código será executado, defina a variável como true e sempre insira a condição.
fonte
if (answer = 42) {}
simplesmente não é compilada porque a expressão não é booleana.Eu concordo com você, mas vou interpretar o advogado do diabo aqui:
Dependendo do idioma e do nome da variável, x == true é apropriado:
Considere a seguinte situação em um idioma com digitação estática e coerção de tipo para tipos integrais:
Alguém que esteja lendo esta seção do código pode não perceber imediatamente que actionsAllowed é uma variável booleana - também pode ser um número inteiro, representando o número de ações permitidas. Portanto, adicionando == true, fica claro que x é um booleano e não um número inteiro sendo coagido a um booleano:
fonte
actionsAreAllowed
.if (x) { ...
você já está afirmando quex
é um booleano ou é conversível em um booleano. O que você chama é irrelevante.E os bools anuláveis?
fonte
Normalmente, você não deseja fazer um grande acordo com as convenções de codificação, a menos que a convenção esteja de alguma forma impedindo o projeto de maneira significativa. Eu já vi muitos argumentos acalorados escalarem coisas tão pequenas quanto as regiões de código e os principais sublinhados.
Dito isto, não vejo problema em adicionar
== true
a uma declaração condicional. Por uma questão de fato, eu tenho o hábito de usar,== false
em oposição a um ponto de exclamação principal, ao testar condições negativas. Eu acho que é mais legível.Se houver uma convenção estabelecida, digo segui-la, a menos que haja motivos para mudar. No entanto, não vale a pena levantar muito.
fonte
(9 == True)
avalia como false em Python e eu imagino semelhante em C ++.Ack. Eu sou esse cara. A vergonha, a vergonha. É como eu aprendi, e é como eu "formato automaticamente" na minha cabeça. A única vez em que uso a sintaxe preferida de Joel é quando a variável bool tem um prefixo de verbo como "is". Eu preciso do verbo, seja "is", "can", "did", ou então preciso do == para fornecer o verbo "equals". Talvez eu nunca quebre esse hábito, então vou entender se você não me der um 'oi' na rua.
fonte
lembre-me do "código booleano da loucura", é como estes
Ao invés de:
fonte
Pessoalmente, não gosto muito da maneira de dizer "não" em idiomas baseados em C. Esse pequeno ponto de exclamação é fácil demais de ignorar.
Por isso, escrevo-o na íntegra:
Depois de ler isso por um tempo, quero simetria também com
Portanto, considere um artefato de C usando em
!
vez denot
.fonte
not
operador, e C (assim que você inclui o cabeçalho padrão<iso646.h>
). Se você não quer (ou não pode) usar este cabeçalho (ou se você está preso com Java ou C #), sugiro colocar um espaço após o ponto de exclamação:if (! condition)
. Isso o torna um pouco mais visível.not
não é uma opção.Depende do idioma, mas geralmente é uma má ideia ...
Em C, nunca faça isso. É muito fácil encontrar uma situação em que o valor que você está testando não é falso (diferente de zero), mas também não é igual ao valor único definido como "verdadeiro".
No Ruby, faça isso apenas se tiver certeza absoluta de que deseja falhar em tudo, exceto em Boolean true.
No C ++ e em outras linguagens estáticas com um tipo bool, é redundante e pode levar a erros de programação quando você digita incorretamente em
=
vez de==
ou a erros de promoção, conforme mencionado nos comentários.fonte
if (b == true) {
não é apenas redundante. Também é um pouco arriscado, porque você pode acidentalmente atribuídotrue
ab
.if (b == true)
eb
não é booleano, as conversões de tipo seguem o caminho errado. Abool
é um tipo integral que normalmente é promovido para um tipo integral apropriado com o valor 1. Se você escrever, digamos,int b(2); if (b == true)
setrue
torna umint
com 1 para fins de comparação, em vez deb
ser coagido no tipobool
, o que daria o resultado certo.==
.Você acha que isso é ruim? E se:
fonte
eu prefiro
ou
também, mas tenho medo de que isso surja irritar as pessoas, então meu conselho é esquecê-lo. Desculpa!
fonte
if (!bNotVal)
nemif (bNotVal)
mesmo em primeiro lugar. Ugh negativos nos nomes tornam tudo mais difícil de ler.você deve dizer a ele que ele está fazendo errado.
Está
if (true == someBool) {
}
se ele esquecer um = está com um grande problema no estilo de escrever.
fonte
E se
POR QUE ISSO É UMA CORDA ?!
fonte
if(preg_match('/title/', implode($_POST))){
. PHP, basta dizer, eu preciso encontrar um emprego melhor.x
vieram da entrada do usuário (arquivo de configuração ou serviço da web, por exemplo). No entanto, eu normalmente permito outros valores ilegais, então acaba sendo mais parecido comif x.lower().strip() in ["true", "yes", "on", "1"]
Na verdade, se for anulável, seria necessário testar x == true. :)
fonte
Eu escrevo código assim!
Aqui está o porquê:
"if bla == true" lê como uma frase, enquanto que "if bla" não ocorre em muitos casos. Parece errado, ao ler o código real.
Além disso, o compilador avisa sobre atribuições nos blocos if, portanto, não há realmente nenhum perigo em usar == true. (confundindo com =)
Também os caras que não escrevem "== true" usam esse "! ()" Para "== false"? Eu acho isso muito feio. E se você usar "== false", é muito consistente também usar "== true", em vez de ter duas maneiras distintas de verificar a verdade.
fonte
Lembre-se de que você está trabalhando como parte de uma equipe, por isso precisa resolver essas coisas juntos. "Se diverte com os outros" ainda é um importante traço de personalidade, mesmo depois do ensino fundamental :)
fonte
Geralmente omitirá o '== true', mas dificilmente vale um minuto para discuti-lo, a menos que você o inclua nos padrões de codificação da sua equipe.
fonte
Embora eu concorde como desenvolvedor principalmente de C #, não posso dizer que esse seja sempre o caso. Por exemplo, em Javascript, o === executará coalescência do tipo. Então, assumindo var x = 3 então:
enquanto
Eu acho que é diferente de ==, pois mesmo em JS eu não usaria se (x == true), mas apenas algo para pensar.
Esse tipo de toque em outro ponto que surgiu no meu escritório:
Em C #, bool b; seria suficiente e inicializaria b para falso . No entanto, é mais explícito escrever a linha acima e, de qualquer forma, deve ser arrancada pelo compilador durante a otimização.
Portanto, acho que meu argumento é que nem sempre é tão óbvio o que é e o que não é uma boa prática, e muito disso se resume à preferência, bem como às características / peculiaridades do idioma.
fonte
bool b;
somente inicializa como false quandob
é um campo. Você deve inicializar variáveis locais explicitamente.true
ou apenas "true". Por exemplo, qualquer string não vazia é considerada,== true
mas não=== true
em alguns idiomas.Ah sim, mas e se a variável for anulável? (bool?)
Alguns idiomas (C #) exigirão e converterão ou serão comparados com 'true'.
fonte
Os jovens conhecem as regras, mas os velhos conhecem as exceções;)
No mais recente
C#
, se você estiver lidando com umnull-able bool
, precisará:Se tristate não for um problema, geralmente não deve haver um motivo para comparar algo com
true
/True
. No entanto, emPython
vários idiomas, comoC/C++
você pode executar umaif
expressão não-booleana. Esses idiomas têm regras exclusivas para interpretar números inteiros, ponteiros, listas etc. como verdadeiros ou falsos. Às vezes você não quer isso. Por exemplo, neste trecho de código Python:Aqui
z
deveria estarTrue
, masz2
deveria estarFalse
. Agora, umaClojure
linguagem aborda isso de outra maneira - aand
função não necessariamente avalia como abool
, masif
pode lidar com isso.Independentemente do idioma, sempre que você se comparar a algo
True
ouFalse
, provavelmente vale a pena comentar.fonte
notExceptButHasX
,exceptNotButIsntY
,doNotUnlessIsExceptZ
? Como isso contribui para a legibilidade do seu problema? Se x, y, z foram nomeados com algo como "isEnabled", "isEffective", "hasProperty", então sua instrução se tornaisEnabled || isEffective || hasProperty
muito mais legível do que comparar comtrue
oufalse
.Essa codificação também teria me atrapalhado antes. Embora seu identificador de exemplo seja chamado "someBool", o uso inadvertido desse estilo de codificação em uma variável que não era garantida como booleana pode ter um comportamento não intencional. Se o valor de "someBool" não for exatamente "true" ou "false", o resultado será falso.
Eu encontrei um bug muito sutil no ano passado, causado por um estilo de codificação difícil de identificar, porque os olhos de alguém refletem essas construções. Você pensaria: "Como isso pode estar errado?" O mesmo vale para expressões bem compreendidas como "(var)" ou "(! Var)", que você as lê ou codifica sem verificar o comportamento delas.
Então, eu introduzi alguns padrões de codificação para reduzir a existência de tais erros na base de código e a probabilidade de que esses erros sutis se infiltrem acidentalmente em algum momento no futuro.
Ao limpar o código que não está em conformidade com o novo estilo, identifiquei e corrigi mais algumas instâncias desses erros sutis.
fonte
Tinha que usar isso o tempo todo no ActionScript 2 (agora reconhecidamente uma linguagem morta), porque:
Por isso, quase sempre era melhor ser específico.
fonte
Concordo. É uma construção redundante, especialmente em idiomas de tipos fortes.
Para adicionar outro uso indevido de booleanos, eu encontrei esse tipo de construção várias vezes em Javascript (especialmente em algumas funções de monstros semelhantes a espaguetes, como em mais de 100 linhas):
Parece que, devido à falta de uma definição estrita de tipo nessa linguagem, alguns programadores preferem não ter que mexer com os
false|undefined
valores.fonte
Eu tenho um colega que terá algum código como este:
E então, para algum tipo de teste / depuração, ele desejará não chamar esse bloco, então ele mudará para:
E então, ocasionalmente, ele muda para:
O pior é que esse tipo de depuração passou para mim de vez em quando e é muito ruim para outros desenvolvedores lerem!
fonte
Eu diria que a consistência é o rei em uma base de código. Portanto, você deve usar o estilo, usado principalmente em sua organização. Tente fazer do seu estilo preferido parte das diretrizes oficiais de codificação da empresa. Se já estiver nas diretrizes, basta segui-las.
(Dito isto, também me incomodaria muito - mas provavelmente não o suficiente para fazer um grande negócio com isso).
fonte
Prefiro não colocar o extra == true, mas às vezes eu o incluo acidentalmente e não percebo. A pessoa pode não ter percebido e colocado acidentalmente. Reli o meu código e, às vezes, percebo que coloquei o extra == true, então removo o == true. Às vezes, eu não percebo e gostaria de receber alguém que me disse que eu o coloquei de forma redundante.
fonte
que tal:
Sim, eu já vi.
fonte