留下if / else空白的公约

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了留下if / else空白的公约相关的知识,希望对你有一定的参考价值。

放弃

我不完全确定这是否适合这个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 ++构造/方法。

答案

我倾向于用一个返回语句重写它[...]

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

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 ...),其中一个分支为空,请尝试重写它而不使用那个空分支。

以上是关于留下if / else空白的公约的主要内容,如果未能解决你的问题,请参考以下文章

20个简洁的 JS 代码片段

20个简洁的 JS 代码片段

4.3 合并重复的条件执行片段

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

应用程序在底部留下空白

JSTL的if-else表式