多个组合逻辑判断是 if else 更合理 还是 goto 最后输出之前更合理?

2015-09-01 10:31:27 +08:00
 l1905
比方有如下两种例子

第一种写法

```
function a () {
if ($is_pass_1 ) {
if ($is_pass_2 ) {
if ($is_pass_3 ) {
//...
//业务代码处理
return result;
}
}
}
}
```
第二种写法

```
function b () {
if (!$is_pass_1 ) {
//逻辑处理
goto xxxxx;
}
if (!$is_pass_2 ) {
//逻辑处理
goto xxxxx;
}
if (!$is_pass_3 ) {
//逻辑处理
goto xxxxx;
}
//业务代码处理

xxxxxx: #goto 到的位置
// result =
return result
}


```
6173 次点击
所在节点    PHP
61 条回复
FrankFang128
2015-09-01 12:24:26 +08:00
你应该优化逻辑,不要出现这么多 if
hitmanx
2015-09-01 12:24:29 +08:00
想起了 Dijkstra 大神的那篇可能是最著名的文章<Go To Statement Considered Harmful>
zacard
2015-09-01 12:53:13 +08:00
优化逻辑,优先返回。
kobe1941
2015-09-01 13:10:38 +08:00
从开始学编程,所有的人包括老师和书籍都不让用 goto
msg7086
2015-09-01 13:13:58 +08:00
@flowfire do while 0 给你机会用 break 。

另外 Ruby 里推荐的方式是用 throw/catch 来解决。 C++/Java/PHP 的话也可以考虑用这种方法,比较干净。
当然最好的方法肯定是拆函数,只有实在不适合拆函数的时候才考虑 goto 。
narcotics
2015-09-01 13:37:43 +08:00
@msg7086 利用异常机制表达逻辑或许不是个好主意?
akagi
2015-09-01 13:48:29 +08:00
个人觉得可以试试表驱动?
21grams
2015-09-01 14:01:02 +08:00
goto 也可以适当的用一下,怕啥,不就是只恐龙嘛。
msg7086
2015-09-01 14:12:23 +08:00
@narcotics Ruby 里的异常是 raise/rescue 。 throw/catch 就是用来抛球接球的。

另外其实这种结构也算是异常。
undef404
2015-09-01 14:30:31 +08:00
@msg7086

c++里面不推荐用异常来做逻辑控制
l1905
2015-09-01 15:06:30 +08:00
@kobe1941 我也"从开始学编程,所有的人包括老师和书籍都不让用 goto" ,但遇到具体业务逻辑的用它的时候, 却没想到强有力不用它的理由,或者说是列不出用 goto 有哪些不能容忍的缺点
hitmanx
2015-09-01 15:13:38 +08:00
@l1905 如果功能简单的话确实没什么。不过假如未来这个函数的功能随着迭代更新变得越来越长,越来越复杂,加之如果后续维护的人并不是当初编写者时,就很容易出各种各样的问题,因为 goto 语句破坏了结构性。即使你现在很清楚你在干什么,也不保证后续模仿你的风格继续增加 goto 语句的人也像你这样清晰,一点小看法。
iosx
2015-09-01 16:04:50 +08:00
我觉的这个逻辑用 goto 处理很好啊,代码更简洁、更易读。 linux 内核里有很多 goto 啊,尤其是逻辑块多,函数返回前还需要一些处理时,用 goto 很方便。
computeramber
2015-09-01 16:26:32 +08:00
测试 crawl = =!
cxbig
2015-09-01 20:31:20 +08:00
twi3325831
2015-09-01 21:40:53 +08:00
楼主试过这种写法没

function b () {
do {
if (!$is_pass_1 ) {
//逻辑处理
break;
}
//逻辑处理
if (!$is_pass_2 ) {
//逻辑处理
break;
}
//逻辑处理
if (!$is_pass_3 ) {
//逻辑处理
break;
}
//逻辑处理

//业务代码处理
} while (0 );

// 错误处理
// result =
return result;
}
dorentus
2015-09-01 22:13:30 +08:00
说句题外话, Swift 2 为了支持尽早返回,提供了 guard 关键字来尽早返回,然后提供了 defer 关键字来解决返回导致的无法集中释放资源的问题。
asj
2015-09-01 22:14:50 +08:00
有些时候,看起来似乎今天一个程序员为软件写了 10 行代码,
其实他写了-1000 行代码
2015813
2015-09-01 22:47:58 +08:00
大师云:果断 if ,抛弃 goto ,它会让你晕头转向。
raincious
2015-09-01 23:07:07 +08:00
看了楼主的 Append 之后再看原来的,觉得一二两种方案的区别基本上就是第二种会被打更惨而已……

重构成这样应该就好多了:
https://gist.github.com/raincious/c2845e414d62832db861

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

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

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

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

© 2021 V2EX