Soft_Job 板


LINE

這邊不針對效能,也不針對說階層太多,應該用什麼方式重構之類的 只是看到有人提到巢狀的三元運算子,閱讀性太差,應該改回用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://webptt.com/m.aspx?n=bbs/Soft_Job/M.1672157770.A.D00.html
1F:→ saxontai: https://www.youtube.com/watch?v=CFRhGnuXG-4 12/28 00:18
2F:噓 MoonCode: 12/28 01:20
3F:噓 ben810514: 有 12/28 01:34
4F:噓 hegemon: 閱讀性差很多好嗎..... 12/28 01:45
5F:噓 unixxxx: 原Po認真? 明顯一閱讀性比較好 12/28 01:57
老實說我也是覺得明顯一比較好啊 只是看前面文章和推文,想說講差不多來測一下風向 XD
6F:推 Ericz7000: :( 12/28 03:35
7F:→ xxi511: 這種情況兩個都不適用,重寫好嗎 12/28 07:50
8F:→ cokellen: 覺得差很多 12/28 08:10
9F:→ knives: 寫成波動拳最棒 12/28 08:31
10F:→ testPtt: 通常會拆開多層 常遇到的問題是每層裡的程式碼一長串 12/28 08:42
11F:→ testPtt: 如果裡面都是這種簡單內容其實都OK 12/28 08:44
12F:推 LeoSW: 這種case 我會寫成function,把巢狀結構攤平,增加可讀性以 12/28 08:50
13F:→ LeoSW: 及維護性 12/28 08:50
實務上來說我也是會用 Array Map,或是拆成 Function 來攤平巢狀結構 大部分的情況下寫到兩層就是極限 而且真寫成巢狀,以這案例會在 Condition 加 Not 來對調順序 所以從推文來看,問題點不在巢狀三元,而是只要是寫成多重巢狀都不好閱讀 有些情境在相同結構下,反而有人會覺得改寫 if else 卻降低可讀性
14F:→ sniper2824: 差很多== 12/28 09:20
15F:→ Lipraxde: Condition 加個 not 就可以攤成平的了... 12/28 10:03
就看到前面說巢狀三元可讀性劣於if else 所以故意寫一個很醜的結構來看一下相同結構下,是否真的三元比較難閱讀 XD
16F:推 YukiTW: 你這例子看起來(一)比較好懂 12/28 11:07
17F:→ YukiTW: 但實際上每個判斷式裡的function變多的話,就是(二)比較好 12/28 11:08
18F:噓 qwer338859: 都很醜 拆掉好嗎= = 12/28 11:14
19F:推 zxcasdjason1: 你看看你在說些什麼 XD 12/28 11:20
20F:噓 GLaDOS1105: 都超醜 12/28 11:33
21F:噓 timsheu: 寫成巢狀是wtf… 12/28 12:02
22F:噓 Alex548291: 醜到流湯 而且這串為啥要一直討論啊 啊就看自己公司規 12/28 12:30
23F:→ Alex548291: 定啊 幹嘛一直洗 12/28 12:30
※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 13:21:11
24F:→ leolarrel: 你的錯覺 12/28 13:21
※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 13:41:25
25F:→ abraxas: 舉一個正常人都會攤平的例子真的有效嗎? 12/28 13:36
我認真說,如果是專案公司,你可能高估了正常人的水平了 多的是能動就好(嘆氣 以我的經驗,我之前同事如果修改要在 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; }
26F:→ unixxxx: 用function的話 會影響效能 12/28 13:42
※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 14:20:13
27F:推 WaterLengend: 我曾經看過寫成這樣的可以當主管,聽說一年一百多, 12/28 14:23
28F:→ WaterLengend: 顆顆 12/28 14:23
29F:推 hidog: function造成的效能影響通常不大 12/28 14:40
30F:→ leolarrel: 在某padle效果器,if-else + function 的效能就差很大了 12/28 14:54
31F:→ leolarrel: 幹死老闆硬要用效能很差的MCU 12/28 14:55
32F:→ leolarrel: *pedal效果器 12/28 14:57
33F:噓 CoNsTaR: if else 有比較好閱讀 12/28 15:14
34F:推 gofigure: chatGPT:他們在吵什麼 12/28 15:57
35F:推 bear1414: 三元在硬體語言如VERILOG在邏輯電路寫法上比較方便 12/28 16:20
36F:→ testPtt: 畢竟硬體用goto很正常 到軟體就可能被罵 12/28 16:28
37F:→ unixxxx: goto js 很常見 12/28 16:35
38F:→ viper9709: 拜託別用第一種寫... 12/28 18:03
39F:噓 NCKUFatPork: 兩個寫法都很爛,請用guard clauses 12/28 18:50
剛 Google 一下,Guard Clauses 我也很愛用 只是我之前不知道它叫 Guard Clauses
40F:噓 MoonCode: 什麼語言沒有 elseif 且沒有替代品 12/28 20:22
這邊來說明一下 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 這個關鍵詞
41F:推 kyoe: guard clauses+1 12/28 21:22
42F:→ DendiQ: 寫那樣 SonarQube 會叫 12/28 22:00
43F:推 pot1234: if else一定要弄三層?寫法一也很討厭 12/28 22:12
本文一開始就加一堆但書,並註名只是舉例,非實務上的寫法 XD 實際上當然是 Array Map、Function 和 Guard Clauses 等方法來優化寫法 XD 推文提到的比較好的寫法,才是我實務上真正在寫的 大部分情況我最多只會寫到兩層,且不會用成波動拳結構 我只是因為前面文章有推文提到巢狀三元運算子容易漏看,且不好閱讀 而改回寫成 if else 關於容易漏看這部分我是疑惑為什麼會容易漏看 至於可讀性部分,兩種方法當然都很糟 但看起來也不是每個人都認為巢狀 if else 可讀性優於巢狀三元運算子 實際上真正影響閱讀的多層巢狀這件事,真的多層巢狀起來 if else 和 三元運算子都不好閱讀 ※ 編輯: CloudyWing (203.204.160.44 臺灣), 12/28/2022 23:35:33
44F:→ viper9709: 巢狀的三元會是一場災難...腦袋要轉兩次@@ 12/28 23:40
45F:噓 BlueBird5566: 就是習不習慣的問題啊= = 12/29 00:07
46F:→ BlueBird5566: 1、2的可讀性其實根本一樣 就是習慣問題 12/29 00:07
47F:→ BlueBird5566: 說巢狀難讀的是指全寫在一行 沒像你這樣排版的 12/29 00:08
48F:→ BlueBird5566: 有的還是JAVA + HTML + JSTL 組出來 12/29 00:10
49F:→ pot1234: 覺得寫法1比較困難閱讀的原因是沒括號又少見,要稍微想 12/29 01:24
50F:→ pot1234: 一下。if else雖然縮三層很煩但不太可能看錯。會寫出這 12/29 01:24
51F:→ pot1234: 種code的話排版大概也不會都排的跟你一樣,要多花一下時 12/29 01:24
52F:→ pot1234: 間找冒號,個人感覺啦。 12/29 01:24
53F:推 Sunal: 實務上都還是會用formatter吧,review時不會看到這種特殊 12/29 04:03
54F:→ Sunal: 排版 12/29 04:03
55F:噓 MoonCode: 高手 12/29 04:07
56F:→ ezaki: 自己舉的例看不出差別,有點可怕 12/29 08:38
57F:→ lycantrope: 高手境界 12/29 12:40
58F:推 GoalBased: 你的例子,我覺得可讀性差不多,但我會寫2 12/29 13:45
59F:→ GoalBased: 如果說以後這段都不改,就沒差,會被改2我覺得好一點 12/29 13:46
60F:→ GoalBased: 中斷點也好下一點 12/29 13:46
61F:→ GoalBased: 可讀性本來就要根據現實情況做判斷 12/29 13:47
62F:→ GoalBased: 跟你說怎樣一定好的,多數是見樹不見林 12/29 13:48
63F:→ ku72: 老實說 只要沒事先規範兩個做法我都會接受 如果都只看自己愛 12/29 21:02
64F:→ ku72: 看的code style那接手到爛code或者工作需要得去看別人的code 12/29 21:02
65F:→ ku72: 能保證都是自己要的寫法? 12/29 21:02
66F:→ hongsiangfu: 第一種寫法用反邏輯別縮排 12/30 07:08
67F:→ hongsiangfu: cd1?1:(換行)cd2?2:(換行)...(cdn)cdn:n:m 12/30 07:11
68F:→ hongsiangfu: 曾在verilog語法看過類似排版 12/30 07:12
69F:→ hongsiangfu: 更正cdn?n:m 12/30 07:12
70F:→ ku399999: 巢狀三元分沒有明確分界線 需靠排版維持 即使不討論是否 12/30 09:18
71F:→ ku399999: 好讀 巢狀三元更難改也是不爭的事實 12/30 09:18
72F:推 kyoe: php 現在都用 ?: 跟 ?? 香~ 12/30 12:04
73F:→ acgotaku: 第一種看到會想吐吧,寫多層判斷就很噁心了,再寫成這樣 12/30 16:38







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP