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