2

对于 if 语句,我有相当复杂的逻辑。我目前正在使用:

if(numerical_evaluation) {

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

其中 boolOne、boolTwo 和 boolThree 是逻辑操作(可能是x < y“myObject->getBool”等)。

我不知道如何在不将||条件嵌套在第三条if语句中的情况下使其易于阅读的更好方法。

我遇到困难的原因是or运营商使它看起来if可能需要第三个陈述。

一种选择是这样做。

或者,我可以做类似的事情

if(x <= y) {

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

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

甚至可以创建一个单独的函数来尝试将所有内容或组合验证为单个返回值?

或者,我可以尝试以不需要的方式重组代码,这可能需要大量时间来完成。

我的问题:格式化复杂问题的最佳方式是什么if- 其中包括更复杂的评估而不仅仅是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一个好的描述性名称,这种分解复杂表达式和命名子表达式的方法可以使代码更具可读性、更容易理解和更容易调试。

如果一个复杂的表达式在多个地方使用,应该使用一个函数来封装公共逻辑。但是,如果表达式仅在一个地方使用,则最好在本地分解表达式并使用命名的 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
}

当然,正如其他人所说,boolOne,boolTwoboolThree不是很有帮助的名字。

于 2012-08-27T22:20:41.610 回答
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 回答
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 回答