据说优秀的代码没有 else?

2018-04-18 18:53:08 +08:00
 GoPHP

多个 if else 嵌套的代码估计大家都见过。。。头疼!

但是其实很多 if else 可以简化成一个 if,不需要 else,举个例子:

$books = getByAFunc()
if($books) {
   do something ...
   return something
}else {
   do something ....
   return something
}

看上去没什么毛病,但是根据业务需求,大部分是可以这么写:

if($books) {
     do something...
     return something
}
do something...
return something

这只是举个例子,很多时候满足条件的只有一种情况,那我们就可以针对这一种情况处理,其他情况直接 return !

还要一种写法是先处理可能出现的异常错误,然后最后执行下来的就是正确情况!

16836 次点击
所在节点    程序员
147 条回复
k9982874
2018-04-18 20:30:23 +08:00
和我的观点一样,有没有 else 对机器来说一样,但是对代码阅读有很大好处。
zxybird
2018-04-18 20:34:06 +08:00
及早把异常情况排除,剩下的,就是正常流程的代码。这样,就只要写逻辑,不用考虑其它。
eg,没有登陆,直接检测,然后 return 掉,比 else 里面包下正常逻辑要好一点吧。
看侧重点吧。如果业务逻辑就是很复杂,if else 能够确保逻辑准确性。对于那些,不能继续往下执行的分支,及早 return 掉吧。
dobelee
2018-04-18 20:47:31 +08:00
我习惯倒置条件,把异常情况 return 出去,这样就不需要 else 了。没看出楼上说的有 if 必有 else 有啥好。
Jeremial
2018-04-18 20:53:54 +08:00
early return
Jeremial
2018-04-18 20:55:30 +08:00
```public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
int retval = SUCCESS;
if (someCondition)
{
if (name != null && name != "")
{
if (value != 0)
{
if (perms.allow(name)
{
// Do Something
}
else
{
reval = PERM_DENY;
}
}
else
{
retval = BAD_VALUE;
}
}
else
{
retval = BAD_NAME;
}
}
else
{
retval = BAD_COND;
}
return retval;
}```

```public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
if (!someCondition)
return BAD_COND;

if (name == null || name == "")
return BAD_NAME;

if (value == 0)
return BAD_VALUE;

if (!perms.allow(name))
return PERM_DENY;

// Do something
return SUCCESS;
}```
GooMS
2018-04-18 20:56:27 +08:00
如果 if 太多就不写 else 了
ostholz
2018-04-18 21:03:56 +08:00
很久很久以前, javaeye(iteye) 上有个贴子, 代码里如何不用 if. 他好像包装了 n 层, 最后还是逃不掉用 if.
cxbig
2018-04-18 21:09:13 +08:00
不要 else 主要是因为一些人在一个 function 里集合了特别复杂的嵌套逻辑,导致代码可读性下降。
所以推荐细化 function,尽量让它们做最简单的事情,把一些可复用的方法抽象出来,便于调用。
crist
2018-04-18 21:13:37 +08:00
我一般能不用 else 就不用 else,不过这样没啥可吹的。
MinQ
2018-04-18 21:19:23 +08:00
resharper 的规则里就是少用 else
des
2018-04-18 22:00:07 +08:00
不,优秀的代码没有代码
https://github.com/kelseyhightower/nocode
des
2018-04-18 22:07:11 +08:00
@cxbig
比如 if flag return true else return false 这样?
lihongjie0209
2018-04-18 22:11:40 +08:00
感觉是最初版本必须有 else, 不然在条件复杂的情况下你可能漏掉一些情况.

也许在你加入单元测试之后, 然后可以把 else 重构掉, 这样最保险.
muziki
2018-04-18 22:12:36 +08:00
一些菜鸡实在没有干货显摆自己的实力就扯这种言论,以讹传讹
brickyang
2018-04-18 22:28:11 +08:00
我就举一个例子。JavaScript 传统的回调函数通常长这样:(error, ...args) => {}

最正统的做法就是在函数体内先写错误处理部分:

{
if(error) { // oops }

// do something
}

如果有错误,先处理,这部分代码通常都很短(可能短至一行),接着写回调函数本身的逻辑,很清晰。

如果坚持完整的 if-else 结构,那么所有的回调函数都长这个样子:

{
if(error) {
// oops
} else {
// do something
}
}

不知道你们怎么样,反正我是拒绝的。

包括王垠和其他一些人宣称完整的(和嵌套的) if-else 更易于阅读,逻辑更清晰,但我自己的实践体验是:并非总是如此。

很多时候嵌套的 if-else 更难以阅读,远不如不嵌套的逻辑结构清晰。所以我认为合理的做法是使用最易于阅读的方式,而不是死抠嵌套或不嵌套的 if-else。
okzpy9425
2018-04-18 22:31:05 +08:00
死扣这个的才是搞笑呢。。。代码风格要结合你使用的语言,结合团队现有的代码规范,以及你自己写的是不是爽来决定。 代码只要读起来清晰易懂 用不用 else 又何妨呢?
hahawangcc
2018-04-18 22:34:55 +08:00
3
cxbig
2018-04-18 22:49:16 +08:00
@des
你是说放一行?如果逻辑简单,长度不超标,可以。
无 else 通常是:
如果一个条件只有 2~3 行就可以 return,那就写进 if 里;然后 else 的部分不用再缩进了。看上去缩进不多。
jukka
2018-04-18 22:53:47 +08:00
优秀的代码甚至连 if 都没有,只有 pattern matching..
zhangbohun
2018-04-18 23:00:04 +08:00
卫语句?

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

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

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

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

© 2021 V2EX