PTT評價

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

看板Soft_Job標題Re: [討論] 寫三元判斷式code review被打槍作者
CloudyWing
(孤單ㄉ翼)
時間推噓 推:13 噓:13 →:47

這邊不針對效能,也不針對說階層太多,應該用什麼方式重構之類的

只是看到有人提到巢狀的三元運算子,閱讀性太差,應該改回用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 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.204.160.44 (臺灣)
PTT 網址

MoonCode12/28 01:20

ben81051412/28 01:34

hegemon12/28 01:45閱讀性差很多好嗎.....

unixxxx12/28 01:57原Po認真? 明顯一閱讀性比較好

老實說我也是覺得明顯一比較好啊 只是看前面文章和推文,想說講差不多來測一下風向 XD

Ericz700012/28 03:35:(

xxi51112/28 07:50這種情況兩個都不適用,重寫好嗎

cokellen12/28 08:10覺得差很多

knives12/28 08:31寫成波動拳最棒

testPtt12/28 08:42通常會拆開多層 常遇到的問題是每層裡的程式碼一長串

testPtt12/28 08:44如果裡面都是這種簡單內容其實都OK

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

LeoSW12/28 08:50及維護性

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

sniper282412/28 09:20差很多==

Lipraxde12/28 10:03Condition 加個 not 就可以攤成平的了...

就看到前面說巢狀三元可讀性劣於if else 所以故意寫一個很醜的結構來看一下相同結構下,是否真的三元比較難閱讀 XD

YukiTW12/28 11:07你這例子看起來(一)比較好懂

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

qwer33885912/28 11:14都很醜 拆掉好嗎= =

zxcasdjason112/28 11:20你看看你在說些什麼 XD

GLaDOS110512/28 11:33都超醜

timsheu12/28 12:02寫成巢狀是wtf…

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

Alex54829112/28 12:30定啊 幹嘛一直洗

※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 13:21:11

leolarrel12/28 13:21你的錯覺

※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 13:41:25

abraxas12/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; }

unixxxx12/28 13:42用function的話 會影響效能

※ 編輯: CloudyWing (61.216.190.109 臺灣), 12/28/2022 14:20:13

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

WaterLengend12/28 14:23顆顆

hidog12/28 14:40function造成的效能影響通常不大

leolarrel12/28 14:54在某padle效果器,if-else + function 的效能就差很大了

leolarrel12/28 14:55幹死老闆硬要用效能很差的MCU

leolarrel12/28 14:57*pedal效果器

CoNsTaR12/28 15:14if else 有比較好閱讀

gofigure12/28 15:57chatGPT:他們在吵什麼

bear141412/28 16:20三元在硬體語言如VERILOG在邏輯電路寫法上比較方便

testPtt12/28 16:28畢竟硬體用goto很正常 到軟體就可能被罵

unixxxx12/28 16:35goto js 很常見

viper970912/28 18:03拜託別用第一種寫...

NCKUFatPork12/28 18:50兩個寫法都很爛,請用guard clauses

剛 Google 一下,Guard Clauses 我也很愛用 只是我之前不知道它叫 Guard Clauses

MoonCode12/28 20:22什麼語言沒有 elseif 且沒有替代品

這邊來說明一下 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 這個關鍵詞

kyoe12/28 21:22guard clauses+1

DendiQ12/28 22:00寫那樣 SonarQube 會叫

pot123412/28 22:12if else一定要弄三層?寫法一也很討厭

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

※ 編輯: CloudyWing (203.204.160.44 臺灣), 12/28/2022 23:35:33

viper970912/28 23:40巢狀的三元會是一場災難...腦袋要轉兩次@@

BlueBird556612/29 00:07就是習不習慣的問題啊= =

BlueBird556612/29 00:071、2的可讀性其實根本一樣 就是習慣問題

BlueBird556612/29 00:08說巢狀難讀的是指全寫在一行 沒像你這樣排版的

BlueBird556612/29 00:10有的還是JAVA + HTML + JSTL 組出來

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

pot123412/29 01:24一下。if else雖然縮三層很煩但不太可能看錯。會寫出這

pot123412/29 01:24種code的話排版大概也不會都排的跟你一樣,要多花一下時

pot123412/29 01:24間找冒號,個人感覺啦。

Sunal12/29 04:03實務上都還是會用formatter吧,review時不會看到這種特殊

Sunal12/29 04:03排版

MoonCode12/29 04:07高手

ezaki12/29 08:38自己舉的例看不出差別,有點可怕

lycantrope12/29 12:40高手境界

GoalBased12/29 13:45你的例子,我覺得可讀性差不多,但我會寫2

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

GoalBased12/29 13:46中斷點也好下一點

GoalBased12/29 13:47可讀性本來就要根據現實情況做判斷

GoalBased12/29 13:48跟你說怎樣一定好的,多數是見樹不見林

ku7212/29 21:02老實說 只要沒事先規範兩個做法我都會接受 如果都只看自己愛

ku7212/29 21:02看的code style那接手到爛code或者工作需要得去看別人的code

ku7212/29 21:02 能保證都是自己要的寫法?

hongsiangfu12/30 07:08第一種寫法用反邏輯別縮排

hongsiangfu12/30 07:11cd1?1:(換行)cd2?2:(換行)...(cdn)cdn:n:m

hongsiangfu12/30 07:12曾在verilog語法看過類似排版

hongsiangfu12/30 07:12更正cdn?n:m

ku39999912/30 09:18巢狀三元分沒有明確分界線 需靠排版維持 即使不討論是否

ku39999912/30 09:18好讀 巢狀三元更難改也是不爭的事實

kyoe12/30 12:04php 現在都用 ?: 跟 ?? 香~

acgotaku12/30 16:38第一種看到會想吐吧,寫多層判斷就很噁心了,再寫成這樣