保留if / else空白的约定

时间:2019-03-29 09:11:00

标签: if-statement coding-style

免责声明

我不确定这是否适合此SE,但是无论如何我还是从这里开始。

背景

我早先读过this question,并在one of the answers中查看了此代码段

auto z = [&](){ static auto cache_x = x; 
    static auto cache_y = y; 
    static auto cache_result = x + y;
    if (x == cache_x && y == cache_y)
       return cache_result;
    else
    {
        cache_x = x; 
        cache_y = y; 
        cache_result = x + y;
        return cache_result;
    }
};

我个人倾向于使用一个return语句将其重写如下

auto z = [&](){ static auto cache_x = x; 
    static auto cache_y = y; 
    static auto cache_result = x + y;
    if (x == cache_x && y == cache_y)
    {
    }
    else
    {
        cache_x = x; 
        cache_y = y; 
        cache_result = x + y;
    }
    return cache_result;
};

但这会为if部分留出空白。

我们可以将if/else改写为if(!(x == cache_x && y == cache_y)),但这冒着被误解的风险(并且可能变得凌乱)。

我的问题

如果我们应该这样写,那么更容易接受的方式是什么

  • 具有多个return语句
  • if的正文留空
  • if条件重写为否定版本
  • 其他东西

请注意,我通常使用Java编写代码,而示例代码则使用C ++编写。与特定的C ++构造/方法相对,我对通常被接受的做事方式感兴趣。

1 个答案:

答案 0 :(得分:1)

  

我倾向于使用单个return语句将其重写[…]

这也是我的偏好。通过反转分支的条件,您可以更清楚地到达那里:

auto z = [&](){
    static auto cache_x = x; 
    static auto cache_y = y; 
    static auto cache_result = x + y;
    if (!(x == cache_x && y == cache_y)) {
        cache_x = x; 
        cache_y = y; 
        cache_result = x + y;
    }
    return cache_result;
};

通常,如果存在一个分支逻辑为空的分支逻辑(在这种情况下为if ... else ...),请尝试完全不使用该空分支来重写它。