Sua suposição de que o código é um vazamento de segurança pode ou não ser verdadeira dependendo do idioma que você está usando. No código C, pode ser um problema (principalmente porque em C um booleano é apenas um int que não é zero ou zero) - mas nas linguagens mais fortemente tipadas (ou seja, verificação do tipo de tempo de execução) se a passwordCheck
variável foi declarada como booleana, não há como atribuir outra coisa a ele. De fato, tudo em um if
predicado deve resolver para um booleano, se você usa os operadores booleanos ou simplesmente usa o valor. Se você conseguisse ter outro tipo de objeto vinculado ao passwordCheck
tempo de execução, lançaria algum tipo de exceção de conversão ilegal.
Construções simples if / else são muito mais fáceis de ler do que construções if / if - e menos propensas a problemas inadvertidos se alguém tentar inverter a construção. Vamos dar o mesmo exemplo por um segundo:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
O significado das cláusulas mutuamente exclusivas que você deseja executar acima está perdido. É isso que a construção if / else transmite. Dois ramos de execução mutuamente exclusivos, onde um deles sempre será executado. Essa é uma parte importante da segurança - garantindo que não haja comoletThemIn
fazê-lo após a ligação denyAccess
.
Para fins de clareza do código e para garantir que as seções críticas sejam mais protegidas, elas devem estar dentro da cláusula primária (a if
parte). O comportamento padrão não conforme deve estar na cláusula alternativa (a else
parte). Por exemplo:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
NOTA: ao trabalhar com idiomas diferentes, desenvolvi um habbit de codificação que ajuda a evitar a pergunta "e se for uma string?" Essencialmente, é colocar a constante em primeiro lugar na expressão booleana. Por exemplo, em vez de verificar passwordCheck == false
, estou verificando false == passwordCheck
. Isso também evita o problema de atribuição acidental possível em C ++. Usando essa abordagem, o compilador reclamará se eu digitar=
vez de ==
. Em linguagens como Java e C #, o compilador trataria a atribuição na cláusula if como um erro, mas o C ++ aceitará com satisfação. É por isso que também costumo fazer verificação nula com a null
primeira.
Se você muda rotineiramente os idiomas, colocar a constante em primeiro lugar é muito útil. No entanto, na minha equipe, é oposto ao padrão de codificação e o compilador captura esses problemas de qualquer maneira. Pode ser um hábito difícil de quebrar.