2

ifステートメントのロジックはかなり複雑です。私は現在使用しています:

if(numerical_evaluation) {

    if ((!boolOne && boolTwo) || !boolThree){
        //do stuff
    }
}

ここで、boolOne、boolTwo、およびboolThreeは論理演算です(おそらくx < y、または'myObject-> getBool'など)。

3番目のステートメント||内に条件をネストせずにこれを簡単に読み取れるようにするためのより良い方法はわかりません。if

私が苦労している理由は、オペレーターが3番目のステートメントが正当orであると思われるようにするためです。if

1つのオプションはこれを行うことです。

または、私は次のようなことをすることができます

if(x <= y) {

    bool boolFour = false;
    if ((!boolOne && boolTwo))
        boolFour = true;

    if (boolFour || !boolThree){
        //do stuff
    }
}

たぶん、すべてまたは組み合わせを単一の戻り値に検証しようとする別の関数を作成することさえできますか?

または、これが不要な方法でコードを再構築することもできます。これには、かなりの時間がかかる場合があります。

私の質問:複雑な質問をフォーマットするための最良の方法は何ですか?これには、単なるバリエーションifよりも複雑な評価が含まれますか?ステートメントをステートメントと組み合わせて1行にif (!A && B && C)含めると、物事がどうしようもなく読めなくなるようです(特に、boolOne、boolTwoなどの複雑な評価がある場合) 。-複数の条件を持つifステートメントをフォーマットするための最良の方法-と同じ原則がここにも当てはまりますか、それともさまざまな論理演算子を使用するときに根本的な違いがありますか?||&&

4

6 に答える 6

13

これ:

bool boolFour = false;
if ((!boolOne && boolTwo))
    boolFour = true;

次のように、より明確に表現できます。

bool const boolFour = !boolOne && boolTwo;

わかりやすい名前を付けることboolFourで、複雑な式を分解し、部分式に名前を付けるこのアプローチにより、コードがはるかに読みやすく、理解しやすくなり、デバッグしやすくなります。

複雑な式が複数の場所で使用されている場合は、関数を使用して共通論理をカプセル化する必要があります。ただし、式が1つの場所でのみ使用される場合は、式をローカルで分割し、名前付きconst変数を使用して、ロジックを使用場所に近づけることが望ましいです。

于 2012-08-27T22:01:19.900 に答える
4

結合されたブール チェックをカプセル化するヘルパー関数を記述します。例えば:

bool isEligibleForReduction(int age) { return age < 12 || age >= 60; }
于 2012-08-27T22:02:16.183 に答える
0

可能であれば、私は通常次のようなことをします:

if(numerical_evaluation) { 

    meaningful_name = (!boolOne && boolTwo);
    other_meaningful_name = !boolThree;
    if (meaningful_name || other_meaningful_name){ 
        //do stuff 
    } 
} 
于 2012-08-27T22:03:21.227 に答える
0
if (!numerical_evaluation) {
    // nothing to do.
} else if (!boolOne && boolTwo || !boolThree) {
    // do whatever
}

もちろん、他の人が言ったように、boolOneboolTwo、およびboolThreeはあまり役に立たない名前です。

于 2012-08-27T22:20:41.610 に答える
0

これはパフォーマンス上の提案でしたが、複雑なブール式は、テーブル ルックアップとしてより適切に表現される場合があります。

次のような複雑なもの:

if( (a && !c) || (a && b && c )) 
{
    category = 1;
}
else if( (b && !a ) || (a && c && !b )
{
   category = 2;
}
else if( c && !a && !b ) 
{
   category = 3;
}
else
{
    category = 0;
}

なる:

static int categoryTable[2][2][2] = {
    // !b!c    !bc    b!c    bc
    0,         3,     2,     2,      // !a
    1,         2,     1,     1       // a
};
... 
category = categoryTable[a][b][c];

コード コンプリート 2 ページ 614 & 615、「複雑な式のテーブル ルックアップの置換」。

于 2012-08-27T22:31:24.020 に答える
0

最良の方法は、余白をうまく利用することです。

if( numerical_evaluation &&
    (
        (!boolOne && boolTwo) ||
        !boolThree
    )
  ) {
        //do stuff
}

きれいではありませんが、従うのは簡単です。関数を使用して if ロジックを非表示にすることもできます。

bool my_test( int numerical_evaluation, bool boolOne, bool boolTwo, bool boolThree ) {
    return
        numerical_evaluation &&
        (
            (!boolOne && boolTwo) ||
            !boolThree
        );
}

if( my_test( numerical_evaluation, boolOne, boolTwo, boolThree ) ) {
    // do stuff
}

些細なケースではない場合は、コメントを使用して、何をテストしているかを人々に知らせてください (C++ 構文を説明するだけのコメントは必要ありません)。if ロジックを問題なく読み取ることができたとしても、再確認できます。適切なコメントは、不必要な詳細やコードを読むことなく、プログラムの概要と多くのロジックをすばやく人々に伝えることができます。

于 2012-08-27T22:26:07.157 に答える