作者k300plus (300plus)
看板Soft_Job
标题[请益] 比较值放左边 变数放右边
时间Fri May 3 16:15:04 2019
Hi 软工板 All,
最近看到一种coding style如
if (True == var1)
就是比较的值放在左边,变数放在右边
一直觉得不太习惯
过往写程式都是变数放左边
想问各位大大这是有什麽好处
是跟lvalue, rvalue有关吗 ?
还是其实根本没差就是一种coding习惯而已 ?
想请各位解惑,谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.250.185.98
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1556871309.A.605.html
1F:→ WorkForFree: 怕==写成=而已 05/03 16:17
2F:推 AudiA4Avant: 可以避免一些crash的情况 05/03 16:18
3F:→ k300plus: 豁然开朗!! 如果写错成= compiler就会喷error 感谢回答 05/03 16:20
4F:→ eatpupu: 这样写 compiler 可以帮你抓 == 写成 = 05/03 16:20
5F:推 yyhsiu: yoda notation 05/03 16:23
6F:→ yyhsiu: www.yinwang.org/blog-cn/2013/04/16/yoda-notation 05/03 16:23
有趣
7F:推 Gway: 其实不推荐这种 应该以可读性为最重要 现在的compiler 设定 05/03 16:28
8F:→ Gway: warming as error 後这种typo都可以抓出来 05/03 16:28
的确可读有点差,但若是内部写的compiler不一定那麽完善
9F:→ stkoso: 某些语言undefined变数这样写不会crash 反过来就会了 05/03 16:48
10F:→ shooter555: 原来有这种防呆的方式0.0 但觉得好不顺眼 05/03 16:50
11F:推 DCTmaybe: 好不顺眼啊..头痛 05/03 16:56
12F:→ sherees: yoda? 05/03 16:56
13F:推 hidog: 我是比较喜欢判断式里面不要塞等号啦XD 05/03 16:59
这个也会有问题吧
例如非零值在if内都会是True,这个不见得是预期的结果
15F:推 crossdunk: 我还看过等於放左右两边的咧 05/03 17:22
16F:→ crossdunk: =OO= 05/03 17:22
天赋不够高,这是啥意思XDDD
17F:推 yamakazi: coverity这种静态分析工具应该可以抓出来if(a=b) 05/03 19:27
18F:推 rhythm7321: 都出来工作了 怎麽还会 == 写成 = 05/03 19:27
越是简单的bug越是可怕啊wwww
19F:推 taikobo: 我也习惯倒过来写,这样有影响可读性喔? 05/03 20:07
20F:推 Gway: 以前windows 派 code complete里面推荐这种写法 防卫性程式 05/03 20:11
21F:→ Gway: ? 但後面出的软体书 大部分都不推荐此法 05/03 20:11
防呆 vs 可读性 都几?
22F:推 codehard: 有谁写code不手残 05/03 20:14
23F:推 groza: 等号内可以赋值的语言才会这样写 05/03 20:16
24F:→ groza: 有时要赋值 有时要做判断 难免搞混 05/03 20:17
25F:→ groza: if 内才对 打错抱歉 05/03 20:17
※ 编辑: k300plus (180.177.0.139), 05/03/2019 20:30:51
26F:推 mithuang: 很不直觉,第一次看觉得傻眼 05/03 20:33
27F:推 hidog: if( a == 0 ) 不要用 if(a) 这是可以解决的 05/03 20:44
28F:→ hidog: 看个人习惯罗 05/03 20:45
29F:→ hidog: 这种写作习惯没对错 没bug 就好 05/03 20:45
30F:→ sourbait: 我都写 = = 05/03 20:54
Build code team就= =
31F:→ twilighthook: 用.equals()会放左边 05/03 21:04
32F:→ Darkword1987: equals 常数放左边避免null 05/03 21:21
了解
33F:推 solonwu: 避免有null的状况发生 05/03 21:21
34F:推 philip80220: if(a == 0) 跟if(a) 是不一样的吧… 05/03 21:25
35F:→ s860134: 依照公司规定 05/03 21:31
36F:→ ChungLi5566: 要习惯用.equals() 不然哪天手残把Object拿来比 05/03 21:32
37F:推 LinuxKernel: 等你哪天发现bug是因为手残写成if(a=0)就知道惹... 05/03 21:40
38F:推 hidog: 给philip 我要打 if( a != 0 ), 打错~ 05/03 21:43
我刚误解你不要打等号的意思是if(a),if(a)根本超confused啊
我同意可以用 != 来达到跟 == 相同逻辑
※ 编辑: k300plus (180.177.0.139), 05/03/2019 22:03:17
39F:推 debut: 那如果是(True != var1)呢, != 总不会打成=吧? 05/03 22:01
对对如上回覆,不过你应该是要表达用 != 就可以写成 (var1 != True) 啦 XD
※ 编辑: k300plus (180.177.0.139), 05/03/2019 22:06:26
40F:→ invidia: 怕手残阿 05/03 22:28
41F:嘘 pig2014: 防止assignment expression,通常在C比较常用。这都不懂 05/03 23:03
42F:→ pig2014: 也想出来混 05/03 23:03
43F:→ alog: 懂这个也没有比较厉害啊 乾五叔要给人家这样讲_(:_」∠)_.. 05/03 23:09
44F:推 alog: 回原po yoda conditions 用了三年,各种语言大至上都这样用 05/03 23:10
45F:→ alog: 过 但最後还是不写了 05/03 23:10
46F:→ alog: 一个是当初写C#这样写很丑 二来是VS环境会提示 05/03 23:11
47F:→ alog: 三其他语言平常已经习惯写test 所以很少碰到出错 05/03 23:12
48F:→ alog: 把 == 写成 = 的机会大约key了五十几万字出现一次 发现时是 05/03 23:15
49F:→ alog: 写test发现的 05/03 23:15
50F:→ alog: 但没有写test以及尚未用惯yoda condition 的确有发生过不少 05/03 23:16
51F:→ alog: 次 05/03 23:16
52F:→ alog: 还有就是慎选字型跟字体大小。 05/03 23:17
53F:推 tvbic: 感觉很糟糕的写法 05/03 23:36
54F:推 clamperni: 不会写出来呢 05/03 23:40
55F:→ yyhsiu: 我个人觉得很糟糕,如果你可以习惯这种,那也可以习惯 == 05/03 23:41
56F:→ yyhsiu: 如果不能100%习惯,那你也没完全防止原本可能的失误 05/03 23:42
57F:→ yyhsiu: 所以我不觉得是 防呆 vs 可读,而是 呆 vs (呆+不可读) 05/03 23:43
58F:→ yyhsiu: 另外 pig2014也不知道在凶几点,原po有说要出来混吗 05/03 23:44
59F:→ finn79426: 觉得邪教... 05/04 00:13
60F:推 hungys: 如果写 if ((a = 0) && (b > 5)) 有习惯加括号的话 05/04 00:19
61F:→ hungys: compiler 就抓不到了... 05/04 00:19
62F:推 devilkool: 没想到.equals可以这样用 受教了 05/04 00:35
63F:推 feeya: 这种写法很好 我每种语言都习惯这样做 05/04 00:48
64F:推 ripple0129: equals是一定要这样用,可以避免null exception 05/04 00:58
65F:推 xpop777: 蛮有趣的观点,长知识了 05/04 01:31
66F:推 xxtuoo: 防bug但是同事都不习惯 说反正bug那麽多也不差这一个 好像 05/04 02:35
67F:→ xxtuoo: 也有道理...就算了...XDD 05/04 02:35
68F:→ viper9709: 不直觉+1 05/04 03:07
69F:→ Cavalier: 防 bug 的正确方式是写 test, 不是这种 hack 05/04 03:25
70F:推 yangs0618: 想问写test是什麽意思 05/04 04:00
71F:推 yyhsiu: test 有写好,这种错误应该是抓得出来的 05/04 04:09
72F:→ Cavalier: 意思就是你不该依赖 compiler 去告诉你 true = x 是错的 05/04 04:12
73F:→ Cavalier: 而是当你不小心写了 x = true, unit test 会 fail 05/04 04:13
74F:推 dces4212: @yangs unit test 05/04 05:41
75F:推 bakedgrass: 当你记得要把左右颠倒时,你怎麽还会忘记写== 05/04 07:41
76F:推 bakedgrass: 写程式写一段时间以後,用==甚至===来比较已经很习惯 05/04 07:43
77F:→ bakedgrass: 虽然犯错很多还很少犯这种错 05/04 07:44
78F:→ WunoW: 很古老的新手写法… 已经很久没看到了 05/04 09:46
79F:→ WunoW: 与其计较这个,不如好好规范变数命名规则 05/04 09:48
80F:→ WunoW: 专案变大会让人困扰的,这还排不上前10 05/04 09:49
81F:→ angusyu: 以前看过才知道是防 null 但是最後自己还是只能接受一半 05/04 10:41
82F:→ flightheory: 请问我写C和C#的做法是bool isChecked=(varA==5); i 05/04 10:47
83F:→ flightheory: f isChecked {...}这样不就兼顾防呆和可读吗? 05/04 10:47
84F:推 tommyptt: 搜寻Yoda condition 05/04 11:11
85F:→ gilingking: 我自己是不推荐啦 但如果出错的确很好抓 不过经验够 05/04 11:18
86F:→ gilingking: 之後其实这种错也很好抓 05/04 11:18
87F:→ rocwild: 如果真的写错应该在unit test就发现了吧?我选可读性 05/04 11:23
88F:推 gugeegee: 这是面试必考题欸 05/04 12:07
89F:→ orz811017: 看久就习惯了 自动两边swap... 05/04 12:37
90F:→ testPtt: 一般ide会设定if不能assign 05/04 14:56
91F:嘘 attraction: 面试白板题这样写 是加分的好吗 红明显 05/04 16:02
92F:推 cuteSquirrel: 防御性写法 让编译器遇到 True = var 的typo报error 05/04 16:26
93F:→ t64141: 个人也是不推荐这样的写法 05/04 16:42
94F:推 IhateOGC: 面试遇过这问题,显示出公司code品质管理很差 05/04 17:44
95F:→ IhateOGC: 应该是地雷公司才会问 05/04 17:44
96F:推 clarkman: 以前会用这招,後来发现一些compiler或是ckeck coding s 05/04 18:16
97F:→ clarkman: tyle对这些写法会跳warning, 後来就不写了 05/04 18:16
98F:推 yyhsiu: attraction 大 方便透露是哪家公司这样写可以加分吗 05/04 19:01
99F:→ wilson6405: 话说防御性写法有没有书籍或资料专门讲的啊? 05/04 19:07
100F:推 nova06091: == 05/04 19:58
101F:推 kckckckc: 有规则是可以抓 if条件里面只用一个=的吗? 另外也有 05/04 20:56
102F:→ kckckckc: 点好奇是什麽样的情况下才会真的想要在if条件里面赋值 05/04 20:56
103F:→ kckckckc: XD? 05/04 20:56
104F:推 bben900911: 不等於0就不进入的那种是可以啦。 05/04 21:01
105F:→ bben900911: 但有CodeReview的话多半会被挡下来吧.... 05/04 21:01
106F:→ bben900911: 说错,等於0就不进入 05/04 21:01
107F:→ ggBird: 映像中 code complete 有在讲 05/04 21:31
108F:推 shortoneal: 不顺眼没错,但是编译期就帮你防错概念很好 05/04 21:43
109F:→ accessdenied: 不以为然的人,似乎都忘了对SQL和VB这些不用==做比 05/04 23:38
110F:→ accessdenied: 对的语言,这种防御是很有实际价值的 05/04 23:38
111F:推 bibo9901: 重点不是 == 写成 =, 重点是 = (assign operator) 有回 05/05 00:10
112F:→ bibo9901: 传值. VB和SQL跟本没这问题, 有个屁价值? 05/05 00:12
113F:推 KanzakiHAria: 跩成那样 大概没写过其他语言 笑死 05/05 18:16
114F:推 TitanEric: 原来可以防bug 但很不习惯… 05/06 12:11
115F:推 usoko: 我一直以来都无法理解会怕==写成=的人到底是有什麽问题 05/07 16:03
116F:→ usoko: 我知道有些语言可能没有够好的compiler跟IDE帮你挡掉 05/07 16:04
117F:→ usoko: 但高阶语言还在用这种写法就让人匪夷所思 05/07 16:04
118F:推 Dreamerrr: 同楼上 05/18 01:53