多个组合逻辑判断是 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
}


```
6153 次点击
所在节点    PHP
61 条回复
est
2015-09-01 10:32:40 +08:00
php 里难道没有 else if ?
niinaranpo
2015-09-01 10:32:49 +08:00
为什么不用 switch
feiyuanqiu
2015-09-01 10:34:44 +08:00
逻辑运算符哭晕在厕所...
function a () {
if ($is_pass_1 && $is_pass_2 && $is_pass_3 ) {

}
}
luban
2015-09-01 10:36:15 +08:00
这 2 段代码不等价,实现功能不一样
michaelzlies
2015-09-01 10:36:42 +08:00
l1905
2015-09-01 10:37:13 +08:00
@est 这些不是平级 的 if else
l1905
2015-09-01 10:45:03 +08:00
@feiyuanqiu 每个判断条件后 都会有部分逻辑处理, 上面我可能写的不太清楚
huijiewei
2015-09-01 10:52:16 +08:00
一个很方便的准则就是

尽早返回。。。

业务逻辑再理一理吧。 goto 这种东西不用也罢
poorguy
2015-09-01 10:55:42 +08:00
不清楚你具体业务,不过应该可以错误的先退出
```php
function b () {
if (!$is_pass_1 ) {
//不成立的逻辑处理
return;
}
//成立的逻辑处理
```
morefreeze
2015-09-01 11:09:58 +08:00
你可以用

```php
do{
if (!$cond1 ) break;
if (!$cond2 ) break;
while (0 );
```

来避免掉 goto ,虽然你现在用 goto 都只是往下跳的,但你不保证之后别人修改你代码会怎么样理解这段呢
l1905
2015-09-01 11:10:39 +08:00
@huijiewei 呃呃呃。。 goto 到最后 应该就是遵循的尽早返回。没找到 goto 在目前逻辑下太不合理的地方
l1905
2015-09-01 11:14:30 +08:00
@poorguy 目前遵循的是复杂逻辑下只有一个出口
otakustay
2015-09-01 11:17:33 +08:00
公用逻辑抽成另一个函数在各分支里调用就行,别用 goto
qian19876025
2015-09-01 11:19:43 +08:00
合适就行 为嘛一定要与趋势作对
alphonsez
2015-09-01 11:26:11 +08:00
goto 挺好的,尤其 C 错误处理的时候。
ether
2015-09-01 11:50:01 +08:00
function a () {
xxxxxx: #goto 到的位置
// result =
return result

}

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

xxxxxx: #goto 到的位置
return a ();
}
ibremn
2015-09-01 11:52:12 +08:00
举个 C 的例子吧。。
下面的函数是把图片数据解压成 iOS 可以直接显示的 Bitmap 。。。

第一种是遵循了"尽早返回"的原则。。。


第二种是用了 goto 。。。


在某些情况下,适当地用 goto 还是不错的,只要注意别出现 goto fail; goto fail; 这种 bug 就好蛤蛤蛤。。。
pathletboy
2015-09-01 11:54:47 +08:00
可以用 do while (0 );就别用 goto 了。
flowfire
2015-09-01 12:16:32 +08:00
@pathletboy do while (0 ) 什么鬼
ljbha007
2015-09-01 12:21:44 +08:00
switch case 就是为这种情况准备的啊

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

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

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

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

© 2021 V2EX