作者CloudyWing (孤單ㄉ翼)
看板Soft_Job
標題Re: [討論] 寫三元判斷式code review被打槍
時間Wed Dec 28 00:16:05 2022
這邊不針對效能,也不針對說階層太多,應該用什麼方式重構之類的
只是看到有人提到巢狀的三元運算子,閱讀性太差,應該改回用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
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