大家写代码时喜欢用 Guard Clause 还是一条路径走到底?

2018-07-03 01:00:52 +08:00
 agagega

前两天 Code Review 的时候被指出了这个问题。

如题,是

bool func() {
  if (xxx) return false;
  if (xxx) return true;
  xxx;
  return true;
}

还是

bool func() {
  if (xxx) {
    if (xxx) return false;
    else return true;
  } else {
    xxx;
    return true;
  }
}

好像前者一般比较清爽,缩进层次也少。我只看过王垠在他的博客里强烈支持过第二种。

5267 次点击
所在节点    程序员
32 条回复
blueskit
2018-07-03 01:02:58 +08:00
王垠为什么支持呢?
VVVVVEX
2018-07-03 01:08:31 +08:00
你给的两个例子,逻辑都不一样。
至于使用那种形式,还是看逻辑啊。
如果是并列条件,使用第一种,如果是前提条件,使用前套逻辑。这样的代码符合人类的思维,好懂。
王垠又不是啥权威,写文章很多,无论是工业产品,还是开源项目,并没有什么建树,并不觉得他说什么就有道理。
我觉得除了 80 列是个铁律,别的都不是完全的定死的。
df4VW
2018-07-03 01:26:10 +08:00
Guard 有时候会因为逻辑 上没思考全导致部分条件没有覆盖而进入之后的代码流程,强制 if else 2 分能确保覆盖所有情况,养成习惯之后能保证处理到所有 case,不管是有意还是无意。再加上王垠用的是 java,用 if else ide 能提示有些 case 没处理

用这种习惯之后几乎没有负担的被动技能来减少代码出错的可能性其实也是比较务实的做法
1010011010
2018-07-03 03:07:23 +08:00
我喜欢第一种,过程比较清晰
sugarsalt
2018-07-03 03:16:21 +08:00
case 多的话,switch
lightening
2018-07-03 04:29:37 +08:00
代码首先要反映程序员的逻辑,怎么想就怎么写。

两种常见情景:

1 )写到这里,哎呀这个变量如果是 b 就不对了,先 return 掉
2 )写到这里,发现有以下两种可能的情况

显然 1 )应该用 early return,2 )应该用 if else
watzds
2018-07-03 07:00:54 +08:00
@VVVVVEX 80 列算什么铁律,那是以前的显示器一行只能显示这么多,现在 120 也没问题
tamlok
2018-07-03 08:16:03 +08:00
@watzds 左右分屏的时候你就知道 80 好还是 120 好。而且 80 还有另一个意义,间接地控制代码的嵌套层级。
jatesun
2018-07-03 08:44:30 +08:00
第一种,第二种可读性不高
jorneyr
2018-07-03 08:46:12 +08:00
bool func() {
if (xxx) { return false };
if (xxx) { return true };
xxx;
return true;
}
Nick66
2018-07-03 08:52:48 +08:00
一会简写一会不简写最恶心
whileFalse
2018-07-03 08:56:17 +08:00
if (xxx) return false;
else return true;

这个代码太骚了。
VVVVVEX
2018-07-03 09:00:29 +08:00
GCC LLVM
Linux *BSD
QEMU
Python Django
node
Vim
Firefox Chrome
React
Rust
这些项目都是遵循 80 列,有比 90 后年龄大的,也有比 90 后年轻的。
别的项目我不太清楚,gayhub 上的总会有很多超过 80 列的个人项目,数量上一定是取胜的。
crayygy
2018-07-03 09:19:25 +08:00
就你提供的代码风格来看,这第二种写出来会被打的...不管哪种语言,if else 还是尽量都应该括号保证有合理的 scope,也方便以后添加逻辑,除非是保护性的代码,if ==null return 这种我觉得不需要括号,直接一行话搞定。
liuxey
2018-07-03 09:25:33 +08:00
第二种是真的神奇,一会有括号,一会没括号,而且逻辑和第一个也不一样,我更喜欢 #10 的写法
sagaxu
2018-07-03 09:31:41 +08:00
10 个变量二分就是 1024 种组合,来个 10 层嵌套吗?

形式上的完整覆盖,和逻辑上的完整覆盖,目的是哪个?
chenyu8674
2018-07-03 09:42:04 +08:00
跟代码没关系,本质上还是看写代码的人怎么理解这段判断关系
zarte
2018-07-03 09:48:43 +08:00
第二种,
只返回一个的时候第一种
watzds
2018-07-03 09:53:45 +08:00
@tamlok 我不觉得 120 就比 80 好,只是觉得这不是铁律
qY3209HZitEb5Zty
2018-07-03 09:58:02 +08:00
```
bool func() {
if (xxx) {
return xxx ? false : true;
}

xxx;
return true;
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/467641

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX