goto or 异常 or 函数?

2014-07-29 18:17:27 +08:00
 liberize
假设有一个函数,

void foo ()
{
// complex conditions
if (...) {
...

if (...) {
...
goto next;
}

if (...) {
...
goto next;
}

...
}
else if (...) {
...

if (...) {
...
goto next;
}
...
}
else {
...
}

next:
// print log, clean and return
...
}

需要判断很多复杂的情况,最后都要执行最后的 print log, clean and return 部分,请问使用以下哪种方式比较合适?

1. 继续使用 goto
2. 使用异常
3. 将 print log, clean and return 部分写成一个函数
1037 次点击
所在节点    C
12 条回复
cloveryume
2014-07-29 18:22:40 +08:00
可以试试do{} while(0), goto 换成break。
liberize
2014-07-29 18:30:06 +08:00
@cloveryume 不错,也是个好方法,但如果只在这三种里面选呢?
Mutoo
2014-07-29 18:32:49 +08:00
@liberize 如果支持异常:就用异常,不支持:用 do-while(0)
sivacohan
2014-07-29 20:12:57 +08:00
如果只向下跳跃。goto也是可以接受的。
baoyexi
2014-07-29 20:19:44 +08:00
看的懂就好。方便维护代码的人理解为优先。
vixvix
2014-07-30 00:09:33 +08:00
throwing exception的开销蛮大的,所以goto还是有意义的。
Ricepig
2014-07-30 01:04:04 +08:00
性能选goto

或许可以考虑使用函数指针实现伪函数式编程
gateswong
2014-07-30 04:30:19 +08:00
以前写命令行主循环时经常会这样写:

int main() {
init();
int op;

goto input;
while(op != EXIT) {
// Do things
input:
input_value(op);
}

}

跳过第一个循环的前半部份,直接输入数据
这样如果有很多输入的内容的话可以省下来好几行代码
c742435
2014-07-30 08:39:37 +08:00
我个人偏向于goto和函数。这里使用goto意义足够清晰,所以使用goto尚可接受。个人不喜欢在正常情况下使用异常。

另外如果可能的话,拆分函数以及整理思路使用较为清晰的if嵌套可能更符合我的风格。
bombless
2014-07-30 08:56:05 +08:00
异常是什么情况?
如果异常的话是上层代码处理了,问题是上层代码知道怎么处理么…
要么意思是把函数体用一个try-catch代替么。那就脱离异常的本意了…
我倾向于如果可以用raii处理资源回收就用raii,这样比较C++。
用一个函数来收尾的话这个函数的参数会不会很多?感觉不太现实。
williamx
2014-07-30 11:40:19 +08:00
不推荐用 do while(0)和异常,前者从定义了语法,后者让事情(调试)变得复杂。

考虑代码的可读性,可以直接用函数,但是如果函数 foo 合适的话,最好的处理方法是返回一个错误,然后在外面判断 foo 的返回值再调用清理函数进行清理————如果反复用到很多次,可以再多封装一个函数。
dong3580
2014-07-30 11:49:30 +08:00
不要用多了goto,这样多了让别人很难看懂的。

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

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

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

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

© 2021 V2EX