编程过程中, 你是习惯提前返回, 还是统一返回。

2017-04-24 10:42:50 +08:00
 banli

在编程的过程中, 每个人都有每个人的编程习惯。 就比如在写一个函数的时候, 我就喜欢判断一下不符合预期的接口, 提前报错或者提前返回,这样写下了代码会容易看懂, 没有复杂的嵌套判断。 。

然而还一种习惯,就是习惯统一返回。这样就只有一个地方返回,比较好测试预估。但是相应的,代码的各种判断嵌套可能就比提前返回来的多了,看逻辑会吃力一些。

你觉得呢?

6703 次点击
所在节点    问与答
75 条回复
jhdxr
2017-04-24 16:07:26 +08:00
php/java: 取决于具体情况,但能够提前返回的时候绝对不会硬拖着到最后再统一返回(例如函数开头的异常情况判断)。
至于资源回收,不熟悉 c++不敢随便说话,但是 php/java 都可以通过 finally 来解决
Observer42
2017-04-24 16:10:27 +08:00
提前返回,减少嵌套层数,参照 4 楼的

c 没怎么写过, c++有 RAII ,而且自 11 以后 unique_ptr 可以少很多 new/delete ,性能基本不会是问题
geelaw
2017-04-24 16:13:13 +08:00
……不用 malloc 是不是没写过性能要求高的程序哇……用 vector 的更是,你们很理论计算机科学,常数统统扔掉

@rozbo 这个问题很简单,你可以

char *a = (char *)malloc(0x1000);

struct _free_a_tag
{
char const *ptr;
_free_a_tag(char const *p) : ptr{p} { }
~_free_a_tag() { free(ptr); }
} _free_a = a;

用得多就 refactor 一个结构到外面去咯。

如果你有一个 handle ,你可以写一个关闭 handle 的类似的玩意儿
geelaw
2017-04-24 16:13:38 +08:00
@geelaw 更正:把 char const * 改成 char * const
zacard
2017-04-24 16:27:54 +08:00
尽量提前返回
limhiaoing
2017-04-24 16:27:57 +08:00
@geelaw
真不知道说你什么好,性能高必须用 malloc ?
高性能程序都是用内存池的好吗?
另外 vector 有性能问题是你不会用。
jarlyyn
2017-04-24 16:44:36 +08:00
看这个帖子发现 go 的 defer 真是疼程序员
changwei
2017-04-24 16:47:26 +08:00
看是写什么代码,像 golang 等语言有 defer 关键词,各种提前返回可能会导致逻辑上的混乱,还是统一返回比较好。毕竟偷懒和优雅二者不可得兼。
geelaw
2017-04-24 17:13:39 +08:00
@limhiaoing 我应该更正为“只用 new/delete 和 vector<T>”,本意当然不是只能用 malloc ,比如你还可以 calloc ,或者 VirtualAlloc 。

另外如果希望提高 vector 的性能,需要写自己的 allocator (避免愚蠢的 new ,通常的实现),然后调用一次 reserve ,再祈祷编译器可以帮你把那些抽象都返朴归真(好在大多数编译器都可以搞定);反正我是不觉得在性能密集场景下 vector 比脱掉 vector 高明多少——如果要求期间不发生内存重新分配,那 vector 还有什么价值呢?
xiubin
2017-04-24 18:14:36 +08:00
不说使用场景的都是耍流氓吧

判断合法,不合法直接返回 nil :
if (para1 == nil) return
if (para2 == nil) return
if (para3 == nil) return

// para ...

return ...

根据不同条件会有不同结果:

id result;
if ..
result = ..
else if ..
result = ..

return result
ldp940622
2017-04-24 18:14:54 +08:00
自从使用了 swift ,就比较习惯使用 gurad 和 defer 了
sagaxu
2017-04-24 18:21:58 +08:00
@jhdxr Java7 开始都用 try-with-resource 了,不用在 finally 里 close
sagaxu
2017-04-24 18:24:34 +08:00
@changwei 你知道 defer 是干什么用的吗?就是为了提前返回的时候不让你忘记清理工作。有 defer 反而更适合提前返回。
xiaowangge
2017-04-24 18:53:05 +08:00
游戏行业的表示,一般来说,编码风格都是强制的提前返回 :-)
bumz
2017-04-24 18:57:12 +08:00
提前返回
jhdxr
2017-04-24 19:25:49 +08:00
@sagaxu 多谢,之前还真没注意到这个特性。。。比 finally 写着优雅多了。
0915240
2017-04-24 20:03:41 +08:00
orderc
2017-04-24 20:21:25 +08:00
提前返回,不用加一大堆 if else
mb4555
2017-04-24 20:45:22 +08:00
提前
ldp940622
2017-04-24 21:00:44 +08:00
@ldp940622 gurad -> guard

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

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

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

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

© 2021 V2EX