Para o bem da minha discussão, um Bool pode ter 2 estados, Verdadeiro ou Falso. Qualquer outra coisa não está em conformidade com a especificação da linguagem de programação. Se a sua cadeia de ferramentas não estiver em conformidade com suas especificações, você será mangueira, não importa o que faça. Se um desenvolvedor criou um tipo de Bool com mais de 2 estados, é a última coisa que ele faria na minha base de código.
Opção A.
if (var == true) {
...
} else if (var == false) {
...
} else {
...
}
Opção B
if (var == true) {
...
} else {
...
}
Eu afirmo que a opção B é mais robusta .....
Qualquer twit pode dizer para você lidar com erros inesperados. Eles geralmente são fáceis de detectar de maneira trivalente quando você pensa neles. O exemplo que seu professor deu não é algo que poderia acontecer, por isso é um exemplo muito ruim.
É impossível testar A sem os chicotes de teste complicados. Se você não pode criá-lo, como vai testá-lo? Se você não testou o código, como sabe que funciona? Se você não sabe que funciona, não está escrevendo um software robusto. Eu acho que eles ainda chamam isso de Catch22 (ótimo filme, assista algum dia).
A opção B é trivial para testar.
Próximo problema, pergunte ao professor esta pergunta "O que você quer que eu faça sobre isso se um booleano não é verdadeiro nem falso?" Isso deve levar a uma discussão muito interessante ...
Na maioria dos casos, um dump principal é apropriado, na pior das hipóteses, irrita o usuário ou custa muito dinheiro. E se, digamos, o módulo for o sistema de cálculo de reinscrição em tempo real do ônibus espacial? Qualquer resposta, não importa quão imprecisa, não pode ser pior do que abortar, o que matará os usuários. Então, o que fazer, se você souber que a resposta pode estar errada, vá para o 50/50 ou aborte e vá para a falha de 100%. Se eu fosse um membro da tripulação, eu pegaria a 50/50.
A opção A me mata A opção B me dá uma chance uniforme de sobrevivência.
Mas espere - é uma simulação da reentrada do ônibus espacial - e depois? Abortar para que você saiba sobre isso. Parece uma boa ideia? - NÃO - porque você precisa testar com o código que planeja enviar.
A opção A é melhor para simulação, mas não pode ser implementada. É inútil A opção B é o código implementado, portanto a simulação executa o mesmo que os sistemas ativos.
Digamos que essa era uma preocupação válida. A melhor solução seria isolar o tratamento de erros da lógica do aplicativo.
if (var != true || var != false) {
errorReport("Hell just froze over, var must be true or false")
}
......
if (var == true){
....
} else {
....
}
Outras leituras - Máquina Therac-25 Xray, falha no Ariane 5 Rocket e outras (o link tem muitos links quebrados, mas informações suficientes para o Google ajudar)