1. ホーム
  2. c++

[解決済み] 4つのブール値があるケースに一致するかどうかをチェックするロジックを改善するには

2022-08-26 15:58:51

質問

私は4つの bool の値があります。

bool bValue1;
bool bValue2;
bool bValue3;
bool bValue4;

許容される値は

         Scenario 1 | Scenario 2 | Scenario 3
bValue1: true       | true       | true
bValue2: true       | true       | false
bValue3: true       | true       | false
bValue4: true       | false      | false

ですから、例えばこのようなシナリオは受け入れられません。

bValue1: false
bValue2: true
bValue3: true
bValue4: true

今のところ、次のように考えています。 if ステートメントで悪いシナリオを検出するようにしました。

if(((bValue4 && (!bValue3 || !bValue2 || !bValue1)) ||
   ((bValue3 && (!bValue2 || !bValue1)) ||
   (bValue2 && !bValue1) ||
   (!bValue1 && !bValue2 && !bValue3 && !bValue4))
{
    // There is some error
}

この文のロジックは改善/簡略化できるのか?

どのように解決するのですか?

3つのシナリオがあるのだから、3つのifで処理すればいい。

bool valid = false;
if (bValue1 && bValue2 && bValue3 && bValue4)
    valid = true; //scenario 1
else if (bValue1 && bValue2 && bValue3 && !bValue4)
    valid = true; //scenario 2
else if (bValue1 && !bValue2 && !bValue3 && !bValue4)
    valid = true; //scenario 3

読みやすく、デバッグしやすい、IMHO。また、変数に whichScenario を進めながら if .

最初の3つの値が真であれば、4番目の値をチェックしないようにすることができます。

エレガントな解決策ではありません たぶん 確かにそうですが、この場合、簡単で読みやすいので大丈夫です。

ロジックがもっと複雑になったら、そのコードを捨てて、(Zladeckが提案しているように)異なる利用可能なシナリオを保存するためにもっと何かを使うことを検討してください。

で与えられた最初の提案が本当に好きです。 この回答 読みやすく、エラーが起こりにくく、保守しやすい。

(ほぼ)本題から外れますが。

私はStackOverflowであまり回答を書きません。上記の受理された回答が、私の歴史の中で圧倒的に最も評価された回答であることは本当に面白いことです (以前は 5-10 以上のアップヴォートを得たことはなかったと思います)。

しかし、シンプルであることはしばしば正しい方法であり、多くの人がそう考えているようで、私ももっとそう考えるべきです :)