C++嵌套If语句可读性

end*_*and 1 c++ if-statement coding-style code-readability

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

if(numerical_evaluation) {

    if ((!boolOne && boolTwo) || !boolThree){
        //do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

或者,我可以尝试以不需要的方式重构代码,这可能需要大量的时间.

我的问题:格式化复杂if问题的最佳方法是什么- 包括更复杂的评估而不仅仅是if (!A && B && C)变化?当你将||语句与&&语句组合成一行时,似乎事情变得无可救药(尤其是当你对boolOne,boolTwo等进行复杂的评估时).做同样的原则 - 格式化if语句的多种条件的最佳方法 - 在这里也适用,或者在使用各种逻辑运算符时存在根本差异吗?

Jam*_*lis 13

这个:

bool boolFour = false;
if ((!boolOne && boolTwo))
    boolFour = true;
Run Code Online (Sandbox Code Playgroud)

可以更明确地表达为:

bool const boolFour = !boolOne && boolTwo;
Run Code Online (Sandbox Code Playgroud)

通过提供boolFour一个好的描述性名称,这种分解复杂表达式和命名子表达式的方法可以使代码更易读,更容易理解,也更容易调试.

如果在多个位置使用复杂表达式,则应使用函数来封装公共逻辑.但是,如果表达式仅在一个地方使用,则最好在本地拆分表达式并使用命名的const变量,以使逻辑保持接近使用它的位置.

  • 描述性命名和[De Morgan定律](http://en.wikipedia.org/wiki/DeMorgan%27s_Law)的组合可以对表达式的可读性产生奇迹. (3认同)