私の議論のために、BoolはTrueまたはFalseの2つの状態を持つことができます。それ以外は、プログラミング言語仕様に準拠していません。ツールチェーンが仕様に準拠していない場合は、何をしても問題はありません。開発者が3つ以上の状態を持つタイプのBoolを作成した場合、それは彼が私のコードベースで実行する最後のことです。
オプションA
if (var == true) {
...
} else if (var == false) {
...
} else {
...
}
オプションB
if (var == true) {
...
} else {
...
}
オプションBの方が堅牢であると断言します。....
任意のtwitは、予期しないエラーを処理するように指示できます。それらは通常、一度考えれば簡単に検出できます。あなたの教授が与えた例は、起こる可能性のあるものではないため、非常に貧弱な例です。
Aは、複雑なテストハーネスなしではテストできません。作成できない場合、どのようにテストしますか?コードをテストしていない場合、それがどのように機能するかをどのように知っていますか?動作がわからない場合は、堅牢なソフトウェアを作成していません。彼らはまだそれをCatch22と呼んでいると思います(素晴らしい映画、いつか見てください)。
オプションBは簡単にテストできます。
次の問題は、教授に「ブール値がTrueでもFalseでもない場合、それについて何をしてほしいですか?」と尋ねます。それは非常に興味深い議論につながるはずです.....
ほとんどの場合、コアダンプは適切であり、最悪の場合ユーザーに迷惑をかけたり、多額の費用がかかります。モジュールがスペースシャトルのリアルタイム再突入計算システムであるとしたらどうでしょうか?どのような不正確な答えであっても、ユーザーを殺す中絶よりも悪いことはありません。そのため、答えが間違っている可能性があることがわかっている場合は、50/50に進むか、中止して100%の失敗に進みます。私が乗組員だった場合、私は50/50を取るだろう。
オプションAは私を殺すオプションBは私に生存の機会を与えてくれます。
しかし、待ってください-それはスペースシャトルの再突入のシミュレーションです-そして何ですか?中止してください。良いアイデアのように聞こえますか?-NOT-出荷する予定のコードでテストする必要があるため。
オプションAはシミュレーションには適していますが、展開することはできません。無駄なオプションBはデプロイされたコードなので、シミュレーションはライブシステムと同じように実行されます。
これが有効な懸念事項であったとしましょう。より良い解決策は、エラー処理をアプリケーションロジックから分離することです。
if (var != true || var != false) {
errorReport("Hell just froze over, var must be true or false")
}
......
if (var == true){
....
} else {
....
}
さらに読む -Therac-25 Xrayマシン、Ariane 5 Rocketの障害など(リンクには多くのリンク切れがありますが、Googleが役立つ十分な情報があります)