王垠的几道思考题,你的回答是?

2013-03-15 23:25:55 +08:00
 darasion
http://blog.sina.com.cn/s/blog_5d90e82f0101j529.html

先说我自己,
两道思考题中提到的风格,是我比较喜欢的。

第三道题,
暂时不太懂,半路出家没学过理论。
6932 次点击
所在节点    程序员
31 条回复
tioover
2013-03-16 15:39:22 +08:00
最后一题大概是:=
Xrong
2013-03-16 15:52:35 +08:00
希望有人解释下第二题,语义上感觉一样啊
Alex_L
2013-03-16 16:55:25 +08:00
@tioover := 有什么问题?
volCANo
2013-03-17 11:56:54 +08:00
@Xrong 我觉得第二道题这么改的意义在于:
不管这个方法的逻辑是怎样,是必须保证要有return的。
所以在你程序逻辑之外(if else),你需要有return。
y
2013-03-17 12:31:57 +08:00
@tioover += 也是一个吧。
alexrezit
2013-03-17 12:37:47 +08:00
1. 加上花括号是个好习惯;

2. 在某些编译器的默认设置里, 这样的结构是要给出一个 warning 的:
myFreakyFunction {
if (what) { return oo; }
else { return xx; }
}
必须要写成这样来消除这个 warning:
myFreakyFunction {
if (what) { return oo; }
else { return xx; }
return xx;
}
例如旧版本 Xcode 默认的编译器, 但现在最新版本已经不会给出 warning 了, 貌似是从 Apple LLVM 4.x 开始.

其实为了逻辑更清晰, 我自己现在已经尽量在每个 function / method 里只 return 一次了. 例如当 type 为 BOOL 时:
BOOL myFreakyFunction {
BOOL isXXX = NO;
if (what) { isXXX = YES; }
else { isXXX = NO; }
return isXXX;
}
而不是:
BOOL myFreakyFunction {
if (what) { return NO; }
else { return YES; }
}
或:
BOOL myFreakyFunction {
if (what) { return NO; }
return YES;
}
cassyfar
2013-03-17 12:54:37 +08:00
@alexrezit 什么version的编译器报warning啊?我用Gcc-redhat-4.1.2这种老编译器都没给出warning...
我觉得改了之后至少逻辑不清晰了,不能一眼看去就知道是个if else逻辑,我不会写被改成的第二个,也不知道第一个有什么错...
我赞成你的写法,保留一个return。

@volCANo 为什么return不能放if语句里? 只要if语句执行了,肯定就会有一个return被执行。
volCANo
2013-03-17 13:57:00 +08:00
@cassyfar 肯定有吗?又不是说if else 里面一定要有return,如果里面不写呢?
代码逻辑是没什么问题的,只是编码规范。你想想,如果if else里面的东西非常多,你去读甚至都找不到return在哪儿,那么你会觉得这代码不爽吗?应该会的,甚至你会说,这个函数没有返回,是错的。
所以在if else外面写return,别人读起来会容易些。这只是个编码规范问题。
还有第一个if后面只有一句代码也要加大括号,我一直有这个习惯,我的理由是:虽然你现在是只要一行,但以后非常有可能要添加逻辑,就不只是一行了,到时候也要加括号;况且,都加括号不是更一致吗?而且,很多编译器都帮你加好了,你写个if 后面的大括号都自动给你不气了。
for4
2013-03-17 14:09:54 +08:00
@Xrong
@cassyfar

赞同@volCANo 的说法

if {
return 1
} else {
return 2
}
这种在后面不再加个return x的话, golang就不会让编译通过
laskuma
2013-03-17 15:21:45 +08:00
不觉得他说的有道理 这只是纯粹的taste上的问题 你偏好哪一种 风格不差 看着不乱 易于理解就好了 他对++的分析我倒是很赞成 这种带side effect太多的语句写多了连debug的时候都会造成困难 但是关于if(){return}else{return}却是我不能接受的 个人还是觉得if(){return}return;的写法没有什么难理解的 代码一行行看下来也都明白 多写一个return反而会让人摸不着头脑
best1a
2013-03-17 15:33:22 +08:00
第二种写法还有一些别的好处,比如有时可以减少一下if的嵌套
qiukun
2013-03-17 15:50:31 +08:00
@for4 golang 毕竟是 google's lang
cassyfar
2013-03-17 17:02:09 +08:00
@volCANo 你理解错我最后一句了。

@for4 你这...例子举得
perrywky
2013-03-18 13:57:11 +08:00
其实他说的道理《代码大全》里都已经提到了,就是“代码是写给人看的”

1. 加上花括弧,块的边界更清晰,别人读起来更轻松
2. 去掉花括弧,语义发生了变化,第二个return从“其它情况”变成了“默认情况”,本来是很简单的互斥关系,现在第一个return成了特殊情况,读代码的人就会想,还有没有其他特殊情况呢?
GTim
2013-03-18 17:40:58 +08:00
1. 防止手贱在 if 后加了 分号(";");另外一个就是某些代码编辑器tab和space不分的情况下,某些人就会进入思维误区,为是并行还是串行想破脑袋;其它风格问题

2.语义上来说是不一样的,同样可以防止某些人手贱 把 else 写成 else if

3. 不要只研究i = i+1 和 i++两个表达式,而是要研究上下文!何况 i++ 与 ++i本身就是两种语境;举个例子:a = ++i; 和 a=i=i+1;哪种更好? a=i++;用一条语句怎么写加法的方式 ?

这三个问题,一般都是语义上的问题,计算机是死的,人是活的,但更悲剧的是计算机遵守交通规则,但人却不一定遵守交通规则;计算机的智力几乎都是一样的,但人的呢?千奇百怪,很多人就是转不过那个弯弯
GTim
2013-03-18 17:45:04 +08:00
针对第三个问题,有很多牛角尖可以钻的,仔细研究下去,可能永远出不了那个坑
guotie
2013-03-18 17:49:00 +08:00
i++ ++i单独写没有任何问题;

如果单独写i++ 也要改成i = i + 1就有点装逼了
iEverX
2013-03-18 23:47:21 +08:00
@guotie
同意

@perrywky
对于第二个,虽然是这样说,但是默认不就是意味着以上都不满足的情况吗?
if (...) { return ... }
return
还是感觉这样比较清爽、舒服、习惯
leafduo
2013-03-19 01:04:15 +08:00
第一个加括号是有必要的,改代码的时候不会忘记加,switch 里面的 break 语句同理。

第二个更多是 personal taste 的问题吧,另外就是有的版本的编译器对第一种写法会给 warning,最新版本的 clang 已经能识别两种了。

对于自增操作符这种,我都是觉得实践中哪个清楚、方便就用哪个,没歧义的时候就用自增,难理解了就拆开。
skydark
2013-03-19 08:48:22 +08:00
@tioover 同希望解释一下最后一题,thx~

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

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

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

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

© 2021 V2EX