Re: [討論] 因為空格~我離開了一間公司

看板Soft_Job (軟體人)作者 (張昱珩)時間11年前 (2014/09/14 20:16), 11年前編輯推噓4(4018)
留言22則, 9人參與, 最新討論串21/21 (看更多)
※ 引述《guest2008 (guest)》之銘言: : ※ 引述《changyuheng (張昱珩)》之銘言: : : 我所知的語言,function 的 return 值可以滿足 condition 就不會再做多餘的比較。 : : 例如 : : if (funcA()) : : 不會寫成 : : if (funcA() == true) : : 請問這樣寫有什麼特殊原因嗎? : : return 應該是 statement,所以後面接的括弧是給 expression 用的。 : : 但是 (true) 不就是 true 嗎? : 上面兩種寫法對編譯器來說它都可以吃,沒問題。 : 為什麼這樣寫? 沒什麼: : 一開始大家寫程式都一定是模仿書上的範例,全部的範例都這樣寫, : 寫習慣也沒特別去注意(所以真的就是純習慣性問題而已,這才是真正的真相), : 直到....。 : 程式寫多了,被很多莫名其妙你覺得不會錯的 bug 搞死, : 除非你就是太單純真的只會寫一種程式語言,不會又要你寫 : C/C++、PHP、JAVA、jquery......哩哩拉拉一大堆語言。 : 把敘述寫完整一點對你寫程式來說,真的花不了你幾豪秒鐘的, : 但可以避免很多不必要的困擾。 : 例如 if( A || B ) ..... 跟寫 if( (A) || (B) )... : 根本意思完全相同,但要是 A 是 複合詞,例如他是 2014 && 0xFF : 你沒加括弧就會出現恐怖的錯誤,而且這個錯誤你的編譯器永遠也檢查不出來。 : 習慣性加 (),不管他多簡單都習慣加括弧,就可以減免你未來 debug 時間, : 就這麼簡單而已,你要用你的寫法沒人說不行。 : 還有 if( funA() ) 寫 if( funA()==true) 通通都可以,但你的程式碼 : 交給後面維護的人,用後面的寫法,他可以只看這一行就夠了, : 不需要回去看你的 funA() 到底是什麼碗糕,是返回 float 還是 bool 還是參照。 : 反正寫習慣了,也沒特別去注意,但真的避開了很多麻煩, : 你要用你的寫法沒人說不可以,只要小心未來不要採到很深的隱藏地雷就好。 : 因為這些都會認為絕對不會錯,編譯器也絕對檢查不出來你真的要表達的意思, : 他一定會 pass,但最後你會被搞死,尤其你要寫很多種程式語言,各種程式語言 : 又有一點點小小小小差異時,寫完整一點根本就不會錯。 : 我舉兩個案例,你自己去思考 : 案例一: : 1.1 return(1); : return(99); ==> if( funA() == true) : if( funA() == 1 ) : 1.2 return(true); ==> if( funA() == true ) : if( funA() == 1 ) : 案例二: : #define A (32+64) : #define B (32+64); : return A+1000; : return B+1000; : return (A+1000); : retrun (B+1000); : 以上四個結果你自己去跑一下,當然案例二我真的是純搞笑, : 但不要你周遭的人還真的發生過這樣的事件..那我就無言了。 : 你就知道括弧的差異了。 這就看你的語言了,C 語言的 if statement 後面是接 boolean condition, function 的 return value 若不是 boolean 本就不該不加 operator 直接放在這邊, 就算有很多人這樣放,也都是在確信能夠正確 branch 的情況下做的偷懶。 還有,什麼才是 true? 雖然 C99 用 macro 定義了 TRUE = 1, 但是 boolean condition 判斷的仍是 0 或非 0。 funcA() == TRUE 這樣的寫法變成是判斷 funcA() 回傳的是 1 或非 1, 是會讓人困惑的, 因為 == TRUE 和語言認為的 true/false boolean condition 不同, 語言認為的是 != FALSE。 比較好的寫法是 funcA() == 1。 -- http://changyuheng.github.io/ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.141.116.107 ※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1410696990.A.AE9.html

09/14 20:38, , 1F
其實你不要去當認真狂人..純拿來舉例的東西讓人能理解
09/14 20:38, 1F

09/14 20:42, , 2F
要表達的事而已..結果在雞毛堆裡求真理.
09/14 20:42, 2F

09/14 20:45, , 3F
兩個案例都是故意找有爭執的案例..這是蓄意的
09/14 20:45, 3F

09/14 20:46, , 4F
只是要表達多打幾個字元會避免不必要的麻煩而已
09/14 20:46, 4F
挑這個打是有用意的, 因為我認為對 branch 的不嚴謹就是你說 guard 和 !funcA() 這兩種寫法不好的主因。 == true 並不能「多打幾個字元避免不必要的麻煩」,因為 if (funcA() == true) 和 if (funcA()) 在 C 語言中根本就不是等價的!

09/14 21:04, , 5F
若funcA有好好命名 就不需要啥funcA()==true了
09/14 21:04, 5F

09/14 21:06, , 6F
個人喜歡看到 if (isAAA()) 勝過 if (isAAA() == true)
09/14 21:06, 6F

09/14 21:07, , 7F
在良好的命名之下 '==true' 個人覺得是累贅
09/14 21:07, 7F

09/14 21:09, , 8F
推樓上,而且不要回傳1\0來當true false
09/14 21:09, 8F

09/14 21:09, , 9F
更甚至是回傳個4來當true..
09/14 21:09, 9F

09/14 21:12, , 10F
一般沒有 boolean 的語言會用兩個邏輯反向來正規化。
09/14 21:12, 10F

09/14 22:32, , 11F
用IsX()很好, 實際上.NET framework內有很多這樣的
09/14 22:32, 11F

09/14 22:32, , 12F
method/field.
09/14 22:32, 12F

09/15 12:51, , 13F
Linux世界裡function return 0代表正常返回,反而windows
09/15 12:51, 13F

09/15 12:52, , 14F
的code我常常看到別人用true=1 來回傳~
09/15 12:52, 14F

09/15 18:51, , 15F
有 boolean 的語言比較常看到回傳 true 當成功
09/15 18:51, 15F

09/16 00:47, , 16F
我碰到B社的code function回傳 SUCCESS(0) FAILURE(1)
09/16 00:47, 16F

09/16 00:48, , 17F
ERROR(2) 一開始知道SUCCESS值為0時 嚇了一大跳
09/16 00:48, 17F

09/16 00:50, , 18F
所以不能寫 if(funcA()) 一定得寫 if(funA()==SUCCESS)
09/16 00:50, 18F

09/16 08:49, , 19F
if (funcA() == SUCCESS) 這種沒問題不會造成困惑
09/16 08:49, 19F
※ 編輯: changyuheng (220.141.149.174), 09/16/2014 08:58:19

09/16 14:47, , 20F
我倒覺得SUCCESS為0比1更常見
09/16 14:47, 20F

09/16 14:49, , 21F
這又回到原原po問題一 原原po的寫法更適合用在SUCCESS
09/16 14:49, 21F

09/16 14:49, , 22F
為0時 if (funA()) err_handling(); 的寫法
09/16 14:49, 22F
文章代碼(AID): #1K5OSUhf (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1K5OSUhf (Soft_Job)