[請益] 比較值放左邊 變數放右邊

作者: k300plus (300plus)   2019-05-03 16:15:04
Hi 軟工板 All,
最近看到一種coding style如
if (True == var1)
就是比較的值放在左邊,變數放在右邊
一直覺得不太習慣
過往寫程式都是變數放左邊
想問各位大大這是有什麼好處
是跟lvalue, rvalue有關嗎 ?
還是其實根本沒差就是一種coding習慣而已 ?
想請各位解惑,謝謝
作者: WorkForFree (---)   2019-05-03 16:17:00
怕==寫成=而已
作者: AudiA4Avant (A4 Avant)   2019-05-03 16:18:00
可以避免一些crash的情況
作者: k300plus (300plus)   2019-05-03 16:20:00
豁然開朗!! 如果寫錯成= compiler就會噴error 感謝回答
作者: eatpupu (吃大便)   2019-05-03 16:20:00
這樣寫 compiler 可以幫你抓 == 寫成 =
作者: yyhsiu (hsiu)   2019-05-03 16:23:00
yoda notationwww.yinwang.org/blog-cn/2013/04/16/yoda-notation
作者: Gway (我愛的你 也愛我 好嗎?)   2019-05-03 16:28:00
其實不推薦這種 應該以可讀性為最重要 現在的compiler 設定warming as error 後這種typo都可以抓出來
作者: stkoso (Asperger)   2019-05-03 16:48:00
某些語言undefined變數這樣寫不會crash 反過來就會了
作者: shooter555 (shooter)   2019-05-03 16:50:00
原來有這種防呆的方式0.0 但覺得好不順眼
作者: DCTmaybe (竹竹人)   2019-05-03 16:56:00
好不順眼啊..頭痛
作者: sherees (ShaunTheSheep)   2019-05-03 16:56:00
yoda?
作者: hidog (.....)   2019-05-03 16:59:00
我是比較喜歡判斷式裡面不要塞等號啦XD
作者: deray (Deray)   2019-05-03 17:08:00
作者: crossdunk (推噓自如)   2019-05-03 17:22:00
我還看過等於放左右兩邊的咧=OO=
作者: yamakazi (大安吳彥祖)   2019-05-03 19:27:00
coverity這種靜態分析工具應該可以抓出來if(a=b)
作者: rhythm7321 (rhythm7321)   2019-05-03 19:27:00
都出來工作了 怎麼還會 == 寫成 =
作者: taikobo (勉強になるなぁ...)   2019-05-03 20:07:00
我也習慣倒過來寫,這樣有影響可讀性喔?
作者: Gway (我愛的你 也愛我 好嗎?)   2019-05-03 20:11:00
以前windows 派 code complete裡面推薦這種寫法 防衛性程式? 但後面出的軟體書 大部分都不推薦此法
作者: codehard   2019-05-03 20:14:00
有誰寫code不手殘
作者: groza (狗煞)   2019-05-03 20:16:00
等號內可以賦值的語言才會這樣寫有時要賦值 有時要做判斷 難免搞混if 內才對 打錯抱歉
作者: mithuang (阿明)   2019-05-03 20:33:00
很不直覺,第一次看覺得傻眼
作者: hidog (.....)   2019-05-03 20:44:00
if( a == 0 ) 不要用 if(a) 這是可以解決的看個人習慣囉這種寫作習慣沒對錯 沒bug 就好
作者: sourbait (sourbait)   2019-05-03 20:54:00
我都寫 = =
作者: twilighthook (嚕嘟)   2019-05-03 21:04:00
用.equals()會放左邊
作者: Darkword1987 (黑字)   2019-05-03 21:21:00
equals 常數放左邊避免null
作者: solonwu (絕對的信仰可以革新命運)   2019-05-03 21:21:00
避免有null的狀況發生
作者: philip80220 (花)   2019-05-03 21:25:00
if(a == 0) 跟if(a) 是不一樣的吧…
作者: s860134 (s860134)   2019-05-03 21:31:00
依照公司規定
作者: ChungLi5566 (中壢56哥)   2019-05-03 21:32:00
要習慣用.equals() 不然哪天手殘把Object拿來比
作者: LinuxKernel (Linus Torvalds)   2019-05-03 21:40:00
等你哪天發現bug是因為手殘寫成if(a=0)就知道惹...
作者: hidog (.....)   2019-05-03 21:43:00
給philip 我要打 if( a != 0 ), 打錯~
作者: debut (humming bird)   2019-05-03 22:01:00
那如果是(True != var1)呢, != 總不會打成=吧?
作者: invidia (莎莉竟然會飛)   2019-05-03 22:28:00
怕手殘阿
作者: pig2014 (Rocking Man)   2019-05-03 23:03:00
防止assignment expression,通常在C比較常用。這都不懂也想出來混
作者: alog (A肉哥)   2019-05-03 23:09:00
懂這個也沒有比較厲害啊 乾五叔要給人家這樣講_(:_」∠)_..回原po yoda conditions 用了三年,各種語言大至上都這樣用過 但最後還是不寫了一個是當初寫C#這樣寫很醜 二來是VS環境會提示三其他語言平常已經習慣寫test 所以很少碰到出錯把 == 寫成 = 的機會大約key了五十幾萬字出現一次 發現時是寫test發現的但沒有寫test以及尚未用慣yoda condition 的確有發生過不少次還有就是慎選字型跟字體大小。
作者: tvbic   2019-05-03 23:36:00
感覺很糟糕的寫法
作者: clamperni (肥宅牛牛)   2019-05-03 23:40:00
不會寫出來呢
作者: yyhsiu (hsiu)   2019-05-03 23:41:00
我個人覺得很糟糕,如果你可以習慣這種,那也可以習慣 ==如果不能100%習慣,那你也沒完全防止原本可能的失誤所以我不覺得是 防呆 vs 可讀,而是 呆 vs (呆+不可讀)另外 pig2014也不知道在兇幾點,原po有說要出來混嗎
作者: finn79426 (xixi)   2019-05-04 00:13:00
覺得邪教...
作者: hungys (hungys)   2019-05-04 00:19:00
如果寫 if ((a = 0) && (b > 5)) 有習慣加括號的話compiler 就抓不到了...
作者: devilkool (對貓毛過敏的貓控)   2019-05-04 00:35:00
沒想到.equals可以這樣用 受教了
作者: feeya (24 August 升格為鄉民)   2019-05-04 00:48:00
這種寫法很好 我每種語言都習慣這樣做
作者: ripple0129 (perry tsai)   2019-05-04 00:58:00
equals是一定要這樣用,可以避免null exception
作者: xpop777 (Archie)   2019-05-04 01:31:00
蠻有趣的觀點,長知識了
作者: xxtuoo (浪費時間不好QQ)   2019-05-04 02:35:00
防bug但是同事都不習慣 說反正bug那麼多也不差這一個 好像也有道理...就算了...XDD
作者: viper9709 (阿達)   2019-05-04 03:07:00
不直覺+1
作者: Cavalier (Cavalier)   2019-05-04 03:25:00
防 bug 的正確方式是寫 test, 不是這種 hack
作者: yangs0618 (阿彰)   2019-05-04 04:00:00
想問寫test是什麼意思
作者: yyhsiu (hsiu)   2019-05-04 04:09:00
test 有寫好,這種錯誤應該是抓得出來的
作者: Cavalier (Cavalier)   2019-05-04 04:12:00
意思就是你不該依賴 compiler 去告訴你 true = x 是錯的而是當你不小心寫了 x = true, unit test 會 fail
作者: dces4212 (flawless)   2019-05-04 05:41:00
@yangs unit test
作者: bakedgrass (蒙古烤小草)   2019-05-04 07:41:00
當你記得要把左右顛倒時,你怎麼還會忘記寫==寫程式寫一段時間以後,用==甚至===來比較已經很習慣雖然犯錯很多還很少犯這種錯
作者: WunoW (WunoW)   2019-05-04 09:46:00
很古老的新手寫法… 已經很久沒看到了與其計較這個,不如好好規範變數命名規則專案變大會讓人困擾的,這還排不上前10
作者: angusyu (〒△〒)   2019-05-04 10:41:00
以前看過才知道是防 null 但是最後自己還是只能接受一半
作者: flightheory (飛行原理)   2019-05-04 10:47:00
請問我寫C和C#的做法是bool isChecked=(varA==5); if isChecked {...}這樣不就兼顧防呆和可讀嗎?
作者: tommyptt (Alga)   2019-05-04 11:11:00
搜尋Yoda condition
作者: gilingking (精靈遊俠)   2019-05-04 11:18:00
我自己是不推薦啦 但如果出錯的確很好抓 不過經驗夠之後其實這種錯也很好抓
作者: rocwild (外國死小孩)   2019-05-04 11:23:00
如果真的寫錯應該在unit test就發現了吧?我選可讀性
作者: gugeegee (咕雞雞)   2019-05-04 12:07:00
這是面試必考題欸
作者: orz811017 (orz811017)   2019-05-04 12:37:00
看久就習慣了 自動兩邊swap...
作者: testPtt (測試)   2019-05-04 14:56:00
一般ide會設定if不能assign
作者: attraction (美安誠信經銷夥伴)   2019-05-04 16:02:00
面試白板題這樣寫 是加分的好嗎 紅明顯
作者: cuteSquirrel (松鼠)   2019-05-04 16:26:00
防禦性寫法 讓編譯器遇到 True = var 的typo報error
作者: t64141 (榕樹)   2019-05-04 16:42:00
個人也是不推薦這樣的寫法
作者: IhateOGC (我討厭)   2019-05-04 17:44:00
面試遇過這問題,顯示出公司code品質管理很差應該是地雷公司才會問
作者: clarkman (涼雨)   2019-05-04 18:16:00
以前會用這招,後來發現一些compiler或是ckeck coding style對這些寫法會跳warning, 後來就不寫了
作者: yyhsiu (hsiu)   2019-05-04 19:01:00
attraction 大 方便透露是哪家公司這樣寫可以加分嗎
作者: wilson6405 (KickAsson)   2019-05-04 19:07:00
話說防禦性寫法有沒有書籍或資料專門講的啊?
作者: nova06091   2019-05-04 19:58:00
==
作者: kckckckc (KC)   2019-05-04 20:56:00
有規則是可以抓 if條件裡面只用一個=的嗎? 另外也有點好奇是什麼樣的情況下才會真的想要在if條件裡面賦值XD?
作者: bben900911 (Ben)   2019-05-04 21:01:00
不等於0就不進入的那種是可以啦。但有CodeReview的話多半會被擋下來吧....說錯,等於0就不進入
作者: ggBird (ggBird)   2019-05-04 21:31:00
映像中 code complete 有在講
作者: shortoneal (不告訴你咧)   2019-05-04 21:43:00
不順眼沒錯,但是編譯期就幫你防錯概念很好
作者: accessdenied (存取違規)   2019-05-04 23:38:00
不以為然的人,似乎都忘了對SQL和VB這些不用==做比對的語言,這種防禦是很有實際價值的
作者: bibo9901 (function(){})()   2019-05-05 00:10:00
重點不是 == 寫成 =, 重點是 = (assign operator) 有回傳值. VB和SQL跟本沒這問題, 有個屁價值?
作者: KanzakiHAria (神崎・H・アリア)   2019-05-05 18:16:00
跩成那樣 大概沒寫過其他語言 笑死
作者: TitanEric (泰坦)   2019-05-06 12:11:00
原來可以防bug 但很不習慣…
作者: usoko (time to face reality)   2019-05-07 16:03:00
我一直以來都無法理解會怕==寫成=的人到底是有什麼問題我知道有些語言可能沒有夠好的compiler跟IDE幫你擋掉但高階語言還在用這種寫法就讓人匪夷所思
作者: Dreamerrr (芋鴨芋鴨歐)   2019-05-18 01:53:00
同樓上

Links booklink

Contact Us: admin [ a t ] ucptt.com