Re: [討論] 寫三元判斷式code review被打槍

看板Soft_Job (軟體人)作者 (孤單ㄉ翼)時間1年前 (2022/12/28 00:16), 1年前編輯推噓0(131347)
留言73則, 40人參與, 1年前最新討論串13/15 (看更多)
這邊不針對效能,也不針對說階層太多,應該用什麼方式重構之類的 只是看到有人提到巢狀的三元運算子,閱讀性太差,應該改回用if else寫 我只是好奇兩者的可讀性有差很多嗎? 以下只是舉例,不是指實務上會真的這樣寫 (1) 三元運算子: int i = condition1 ? condition2 ? condition3 ? 1 : 2 : 3 : 4; (2) if else: int i; if (condition1) { if (condition2) { if (condition3) { i = 1; } else { i = 2; } } else { i = 3; } } else { i = 4; } 單就上面的範例來說,我覺得兩者可讀性差不多,還是只是因為我看習慣產生的錯覺 XD 以我自己的觀點來看,像這種條件式指派單一變數值的情境,三元寫起來比較順手 也不用擔心像在寫 if else 時,因漏寫了 else 導致有情況沒指派到值 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.204.160.44 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1672157770.A.D00.html

12/28 00:18, 1年前 , 1F

12/28 01:20, 1年前 , 2F
12/28 01:20, 2F

12/28 01:34, 1年前 , 3F
12/28 01:34, 3F

12/28 01:45, 1年前 , 4F
閱讀性差很多好嗎.....
12/28 01:45, 4F

12/28 01:57, 1年前 , 5F
原Po認真? 明顯一閱讀性比較好
12/28 01:57, 5F
老實說我也是覺得明顯一比較好啊 只是看前面文章和推文,想說講差不多來測一下風向 XD

12/28 03:35, 1年前 , 6F
:(
12/28 03:35, 6F

12/28 07:50, 1年前 , 7F
這種情況兩個都不適用,重寫好嗎
12/28 07:50, 7F

12/28 08:10, 1年前 , 8F
覺得差很多
12/28 08:10, 8F

12/28 08:31, 1年前 , 9F
寫成波動拳最棒
12/28 08:31, 9F

12/28 08:42, 1年前 , 10F
通常會拆開多層 常遇到的問題是每層裡的程式碼一長串
12/28 08:42, 10F

12/28 08:44, 1年前 , 11F
如果裡面都是這種簡單內容其實都OK
12/28 08:44, 11F

12/28 08:50, 1年前 , 12F
這種case 我會寫成function,把巢狀結構攤平,增加可讀性以
12/28 08:50, 12F

12/28 08:50, 1年前 , 13F
及維護性
12/28 08:50, 13F
實務上來說我也是會用 Array Map,或是拆成 Function 來攤平巢狀結構 大部分的情況下寫到兩層就是極限 而且真寫成巢狀,以這案例會在 Condition 加 Not 來對調順序 所以從推文來看,問題點不在巢狀三元,而是只要是寫成多重巢狀都不好閱讀 有些情境在相同結構下,反而有人會覺得改寫 if else 卻降低可讀性

12/28 09:20, 1年前 , 14F
差很多==
12/28 09:20, 14F

12/28 10:03, 1年前 , 15F
Condition 加個 not 就可以攤成平的了...
12/28 10:03, 15F
就看到前面說巢狀三元可讀性劣於if else 所以故意寫一個很醜的結構來看一下相同結構下,是否真的三元比較難閱讀 XD

12/28 11:07, 1年前 , 16F
你這例子看起來(一)比較好懂
12/28 11:07, 16F

12/28 11:08, 1年前 , 17F
但實際上每個判斷式裡的function變多的話,就是(二)比較好
12/28 11:08, 17F

12/28 11:14, 1年前 , 18F
都很醜 拆掉好嗎= =
12/28 11:14, 18F

12/28 11:20, 1年前 , 19F
你看看你在說些什麼 XD
12/28 11:20, 19F

12/28 11:33, 1年前 , 20F
都超醜
12/28 11:33, 20F

12/28 12:02, 1年前 , 21F
寫成巢狀是wtf…
12/28 12:02, 21F

12/28 12:30, 1年前 , 22F
醜到流湯 而且這串為啥要一直討論啊 啊就看自己公司規
12/28 12:30, 22F

12/28 12:30, 1年前 , 23F
定啊 幹嘛一直洗
12/28 12:30, 23F
※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 13:21:11

12/28 13:21, 1年前 , 24F
你的錯覺
12/28 13:21, 24F
※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 13:41:25

12/28 13:36, 1年前 , 25F
舉一個正常人都會攤平的例子真的有效嗎?
12/28 13:36, 25F
我認真說,如果是專案公司,你可能高估了正常人的水平了 多的是能動就好(嘆氣 以我的經驗,我之前同事如果修改要在 if 內部加判斷就直接加了 多半不會條件反轉 另外 else if 本身就是巢狀的,有些程式語言本身沒有提供 else if 語法 它們的 else if 是以下程式碼排版後產生看起來攤平的效果 if (condition1) { } else { if (condition2) { } } 而且兩種寫法都反轉後,if else 也真未必有比較好閱讀 例如: 三元運算子: int i = condition1 ? 1 : condition2 ? 2 : condition3 ? 3 : 4; if else: int i; if (condition1) { i = 1; } else if (condition2) { i = 2; } else if (condition3) { i = 3 } else { i = 4; }

12/28 13:42, 1年前 , 26F
用function的話 會影響效能
12/28 13:42, 26F
※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 14:20:13

12/28 14:23, 1年前 , 27F
我曾經看過寫成這樣的可以當主管,聽說一年一百多,
12/28 14:23, 27F

12/28 14:23, 1年前 , 28F
顆顆
12/28 14:23, 28F

12/28 14:40, 1年前 , 29F
function造成的效能影響通常不大
12/28 14:40, 29F

12/28 14:54, 1年前 , 30F
在某padle效果器,if-else + function 的效能就差很大了
12/28 14:54, 30F

12/28 14:55, 1年前 , 31F
幹死老闆硬要用效能很差的MCU
12/28 14:55, 31F

12/28 14:57, 1年前 , 32F
*pedal效果器
12/28 14:57, 32F

12/28 15:14, 1年前 , 33F
if else 有比較好閱讀
12/28 15:14, 33F

12/28 15:57, 1年前 , 34F
chatGPT:他們在吵什麼
12/28 15:57, 34F

12/28 16:20, 1年前 , 35F
三元在硬體語言如VERILOG在邏輯電路寫法上比較方便
12/28 16:20, 35F

12/28 16:28, 1年前 , 36F
畢竟硬體用goto很正常 到軟體就可能被罵
12/28 16:28, 36F

12/28 16:35, 1年前 , 37F
goto js 很常見
12/28 16:35, 37F

12/28 18:03, 1年前 , 38F
拜託別用第一種寫...
12/28 18:03, 38F

12/28 18:50, 1年前 , 39F
兩個寫法都很爛,請用guard clauses
12/28 18:50, 39F
剛 Google 一下,Guard Clauses 我也很愛用 只是我之前不知道它叫 Guard Clauses

12/28 20:22, 1年前 , 40F
什麼語言沒有 elseif 且沒有替代品
12/28 20:22, 40F
這邊來說明一下 else if 是怎麼來的 1. 完整程式長這樣: if (condition1) { } else { if (condition2) { } else { } } 2. 我們已知 else 後面只有單行可以不用加大括弧,而 if else 語句將之視為一個單行 所以我們將第一個 else 的大括弧去掉變成以下這樣 if (condition1) { } else if (condition2) { } else { } } 3. 最後再用排版將第二個 if 放置在第一個 else 後面,else if 就誕生了 if (condition1) { } else if (condition2) { } else { } 所以我前面說 else if 本質上還是巢狀結構,只是靠排版攤平 不過有些程式語言像 PHP 是真的有提供 elseif 這個關鍵詞

12/28 21:22, 1年前 , 41F
guard clauses+1
12/28 21:22, 41F

12/28 22:00, 1年前 , 42F
寫那樣 SonarQube 會叫
12/28 22:00, 42F

12/28 22:12, 1年前 , 43F
if else一定要弄三層?寫法一也很討厭
12/28 22:12, 43F
本文一開始就加一堆但書,並註名只是舉例,非實務上的寫法 XD 實際上當然是 Array Map、Function 和 Guard Clauses 等方法來優化寫法 XD 推文提到的比較好的寫法,才是我實務上真正在寫的 大部分情況我最多只會寫到兩層,且不會用成波動拳結構 我只是因為前面文章有推文提到巢狀三元運算子容易漏看,且不好閱讀 而改回寫成 if else 關於容易漏看這部分我是疑惑為什麼會容易漏看 至於可讀性部分,兩種方法當然都很糟 但看起來也不是每個人都認為巢狀 if else 可讀性優於巢狀三元運算子 實際上真正影響閱讀的多層巢狀這件事,真的多層巢狀起來 if else 和 三元運算子都不好閱讀 ※ 編輯: CloudyWing (203.204.160.44 臺灣), 12/28/2022 23:35:33

12/28 23:40, 1年前 , 44F
巢狀的三元會是一場災難...腦袋要轉兩次@@
12/28 23:40, 44F

12/29 00:07, 1年前 , 45F
就是習不習慣的問題啊= =
12/29 00:07, 45F

12/29 00:07, 1年前 , 46F
1、2的可讀性其實根本一樣 就是習慣問題
12/29 00:07, 46F

12/29 00:08, 1年前 , 47F
說巢狀難讀的是指全寫在一行 沒像你這樣排版的
12/29 00:08, 47F

12/29 00:10, 1年前 , 48F
有的還是JAVA + HTML + JSTL 組出來
12/29 00:10, 48F

12/29 01:24, 1年前 , 49F
覺得寫法1比較困難閱讀的原因是沒括號又少見,要稍微想
12/29 01:24, 49F

12/29 01:24, 1年前 , 50F
一下。if else雖然縮三層很煩但不太可能看錯。會寫出這
12/29 01:24, 50F

12/29 01:24, 1年前 , 51F
種code的話排版大概也不會都排的跟你一樣,要多花一下時
12/29 01:24, 51F

12/29 01:24, 1年前 , 52F
間找冒號,個人感覺啦。
12/29 01:24, 52F

12/29 04:03, 1年前 , 53F
實務上都還是會用formatter吧,review時不會看到這種特殊
12/29 04:03, 53F

12/29 04:03, 1年前 , 54F
排版
12/29 04:03, 54F

12/29 04:07, 1年前 , 55F
高手
12/29 04:07, 55F

12/29 08:38, 1年前 , 56F
自己舉的例看不出差別,有點可怕
12/29 08:38, 56F

12/29 12:40, 1年前 , 57F
高手境界
12/29 12:40, 57F

12/29 13:45, 1年前 , 58F
你的例子,我覺得可讀性差不多,但我會寫2
12/29 13:45, 58F

12/29 13:46, 1年前 , 59F
如果說以後這段都不改,就沒差,會被改2我覺得好一點
12/29 13:46, 59F

12/29 13:46, 1年前 , 60F
中斷點也好下一點
12/29 13:46, 60F

12/29 13:47, 1年前 , 61F
可讀性本來就要根據現實情況做判斷
12/29 13:47, 61F

12/29 13:48, 1年前 , 62F
跟你說怎樣一定好的,多數是見樹不見林
12/29 13:48, 62F

12/29 21:02, 1年前 , 63F
老實說 只要沒事先規範兩個做法我都會接受 如果都只看自己愛
12/29 21:02, 63F

12/29 21:02, 1年前 , 64F
看的code style那接手到爛code或者工作需要得去看別人的code
12/29 21:02, 64F

12/29 21:02, 1年前 , 65F
能保證都是自己要的寫法?
12/29 21:02, 65F

12/30 07:08, 1年前 , 66F
第一種寫法用反邏輯別縮排
12/30 07:08, 66F

12/30 07:11, 1年前 , 67F
cd1?1:(換行)cd2?2:(換行)...(cdn)cdn:n:m
12/30 07:11, 67F

12/30 07:12, 1年前 , 68F
曾在verilog語法看過類似排版
12/30 07:12, 68F

12/30 07:12, 1年前 , 69F
更正cdn?n:m
12/30 07:12, 69F

12/30 09:18, 1年前 , 70F
巢狀三元分沒有明確分界線 需靠排版維持 即使不討論是否
12/30 09:18, 70F

12/30 09:18, 1年前 , 71F
好讀 巢狀三元更難改也是不爭的事實
12/30 09:18, 71F

12/30 12:04, 1年前 , 72F
php 現在都用 ?: 跟 ?? 香~
12/30 12:04, 72F

12/30 16:38, 1年前 , 73F
第一種看到會想吐吧,寫多層判斷就很噁心了,再寫成這樣
12/30 16:38, 73F
文章代碼(AID): #1ZgnfAq0 (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1ZgnfAq0 (Soft_Job)