PTT推薦

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

看板Soft_Job標題[討論] 寫三元判斷式code review被打槍作者
a88241050
(再回頭已是百殘身)
時間推噓95 推:100 噓:5 →:109

小弟寫java的

以前常常寫三元判斷式

就比如說

String a;
if(con) {
a= "aaa";
} else {
a="bbb";
}

這樣就要佔掉六行

所以我通常都是寫

String a= con ? "aaa" : "bbb";

從五行變成一行

在我看來簡潔又方便

但最近給一個資深前輩code review的時候

他說不要用三元判斷式

因為不好閱讀

他工作那麼久也從來不用三元判斷式的

而且java有很多套件都可以用來取代三元判斷式

所以用三元判斷式真的不好嗎?

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.188.168 (臺灣)
PTT 網址

qwer33885912/14 00:48大部分情況都會變更難閱讀

orangelite12/14 00:49不會耶我覺得還好,不要有巢狀連續判斷的話我能接受

orangelite12/14 00:49

tsao121112/14 00:50如果短的話算很好讀吧

xam12/14 00:53看情況,如果確定只會是簡單狀態變換就沒差,但如果以後會變成a

xam12/14 00:53re a2 a3,b1 b2那我甘願一開始就用括號寫

dnabossking12/14 00:55缺點多多

TSW12/14 00:57邏輯簡單或是很短的方法裡面用短的三元OK

TSW12/14 00:57其他地方就有人會看漏

TSW12/14 00:59有些團隊是避免爭論所以完全禁用,所以不要用最省事

GLaDOS110512/14 01:00consistency 最重要 如果原本 codebase 就沒有用它就

GLaDOS110512/14 01:00不要用

humanfly12/14 01:00code style有規定就別用,大家一致

shomingchang12/14 01:14不一樣的東西吧 三元運算有回傳值

keel9013512/14 01:33判斷單一ok 不要判斷>2個就好

qwe7030212/14 01:36就怕嵌套多層,跟鬼一樣,看那一堆冒號直接中風

yyhsiu12/14 01:44佔掉六行真的沒那麼誇張… 不然 IDE 也可以處理

BlacksPig12/14 01:56如果有參與開發的任何一個人不懂,那就不要

k7ji91ab5m12/14 02:23這種比較簡單的 真的沒甚麼好避免的

wulouise12/14 02:28要:多:潮:有?多?巢? ;問回傳值為多少

Lhmstu12/14 02:36要看實際例子才準

alan310012/14 03:02目的是利於閱讀吧 行數根本不是重點

bill020512/14 06:02如果只有二元判斷那還好 如果是多重判斷 寧願你寫if el

bill020512/14 06:02se 甚至seitct更為好讀

bill020512/14 06:02switch

pttano12/14 06:49程度不好還學人review 啥小,可憐喔

Royne12/14 06:50他的問題

CoNsTaR12/14 07:01if else 加 log 方便,擴展邏輯也方便

CoNsTaR12/14 07:01ternary 除了少打幾個字以外有啥優點?

sakyle12/14 07:01你可以用 String a; a = "bbb"; if(con) a = "aaa";

sakyle12/14 07:02這樣只要四行,不過三元還是比較方便啦,不要三元裡面

sakyle12/14 07:02又塞三元就好

hidog12/14 07:32遵守團隊規範

s06yji312/14 07:33現在各種dis同事長官

aidansky098912/14 07:35一層可,多層不要

vencil12/14 07:39佔6行沒那麼嚴重,以後隨需求擴充或調整,code亂長更麻煩

Lomonosov12/14 07:39if-else裡面只有assign一個變數的話 很ok啊

Killercat12/14 07:40三元盡量只用一層就好

Killercat12/14 07:40你這個例子沒啥問題,有問題的是像這種

Killercat12/14 07:42a = a > b ? a : b > c ? b : c

Killercat12/14 07:44三元套娃算是很嚴重的bad smell

timTan12/14 07:44喜歡if else

loadingN12/14 08:08行數還好,但長度最好注意

cokellen12/14 08:12我覺得 if else 人眼閱讀速度較快

joery12/14 08:22考量到未來異動彈性,及閱讀性

pizzahut12/14 08:25看你公司有沒有規定coding style 啊

ericthree12/14 08:30沒有絕對的對錯 看誰比較大就聽誰的

YukiTW12/14 08:36推Killercat的例子,用太多層就有點討厭了

APTON12/14 08:38單純的T/F就算了,但是就是有人會繼續接下去寫。三元判斷裡

APTON12/14 08:38面再接一個三元判斷,所以建議少用。

bheegrl12/14 08:40如果寫成三元會太長我就會考慮改寫法

gs861378912/14 08:44不會比較好懂+1

stupid031912/14 08:48別鬧了,MSDN 一大堆三元運算

lllll12b5612/14 08:52真的討厭「?」

ttss409212/14 08:56if else 一票,除非公司現在和未來都是找高手

testPtt12/14 08:57有註解傳回什麼就好 基本不會去追內層

icydream12/14 08:58不要巢狀還好吧?

sharek12/14 09:04容易變得難閱讀,真的覺得很多行用function 包起來

B098869808812/14 09:04你不會問他推薦怎麼寫再拿上來給大家比較哦

linzomaa12/14 09:28短的很好讀啊,不然就加個註解

youtuuube00012/14 09:31用function包起來+1

lovdkkkk12/14 09:40簡單的情況可以用 不過規定不要用就別用

leolarrel12/14 09:44個人真的建議不要用.但是上班當狗就要聽老闆的

chchwy12/14 09:46我喜歡用,有時候會 讓程式變得好閱讀

bill020512/14 09:49有沒有人看過這樣寫的 var temp = con ? this.a() : thi

bill020512/14 09:49s.b(); 看到這種有點不知道該不該給他過

t6414112/14 09:59簡單時好用,太複雜不好,但怎樣算太複雜每個人都不一樣

a1283891012/14 10:03不要巢狀 就可以 之前同事寫過巢狀 傻眼qq

testPtt12/14 10:13我覺得寫這個都不行的大概也不能接受lambda

jobintan12/14 10:20Ninja Code?

jobintan12/14 10:21不過公司有Code review與coding style規範還是好事……

sniper282412/14 10:25兩層就寫啊 寫太多層才會不知道幹嘛 而且應該要包起來

aa0669712/14 10:26要看多長

vi00024612/14 10:34不要巢狀

vi00024612/14 10:35讀到這段如果花了一秒以上理解 就要重構

whatzup112412/14 10:40老實說這算基礎吧

tofuflower12/14 10:57看團隊規範啊 有 coding guideline 就照規定走

tofuflower12/14 10:57沒規範就先寫個 guideline

q0015312/14 10:58私以為,一個東西會存在就是有它的用處,適合的時候就用適

q0015312/14 10:58合的方法,極端的只用或不用都只是一個對自己有利的借口罷

q0015312/14 10:58了。

TSMCfabXX12/14 11:01談到 coding style 話語權才是唯一真理

jobintan12/14 11:04Indeed,只有Lead字輩,才能決定Coding style。

tsairay12/14 11:12看三元判斷式裡面的內容

tsairay12/14 11:12如果你的條件很長而不是單純的if a=b這種

tsairay12/14 11:12那的確就會難閱讀

jason22233312/14 11:14你是對的

bab717112/14 11:19這怎麼不好閱讀??

zxcasdjason112/14 11:29寫法就討論 團隊都能配合就好

dnabossking12/14 11:37尚未看到好的回答

zxcasdjason112/14 11:39蠻常見到新人會煩惱,像是看到前人的用 if-else if

zxcasdjason112/14 11:39 蓋個20幾樓,納悶怎不用 switch-case 重寫這類的

zxcasdjason112/14 11:39問題,經驗上,我認為重構效益大於局部寫法修正,

zxcasdjason112/14 11:39看得懂且性能差異不大的話別糾結太多

testPtt12/14 11:41通常我是左式ok就不care右式 除非右式內容常常改再分出來

zxcasdjason112/14 11:51原po 提得狀況,我認為可以使用,但如果是 String

zxcasdjason112/14 11:51a = cond1 ? "a" : (cond2?"c" : "d") 這種還是展

zxcasdjason112/14 11:51開來寫比較好

somefatguy12/14 11:57你這個case寫if else的我會叫他改成三元

knives12/14 12:00以可讀性來說,肯定是不行的

somefatguy12/14 12:00多層別用三元,但用if else也不好看,要包function用e

somefatguy12/14 12:00arly return

knives12/14 12:02其實我是覺得是那個資深前輩看不懂,如果一開始是很簡單的

knives12/14 12:03兩個簡單條件就還好

ke265379ke12/14 12:06出事誰扛責任就聽誰的

Lomonosov12/14 12:09對於一層判斷+assign 三元可以一眼就知道要做什麼 熟悉

Lomonosov12/14 12:09這種寫法後 讀if-else的負擔還比較大一點點

DarkIllusion12/14 12:21你前輩的理由沒有說服力 以這例子來說並沒有較難讀

DarkIllusion12/14 12:23但如果你團隊裡看code的都像你前輩這樣 那還是別用

NDark12/14 12:45如果有商業邏輯,寧願分清楚不要省行數

chrischen12/14 13:11宗教問題 不會有結論

veryGY12/14 13:28能力太差的才會看得慢 高手都是這樣寫才快

iamshiao12/14 13:46你是 owner 爽怎麼寫都行,不是那就人在屋簷下,我自己

iamshiao12/14 13:46是蠻喜歡三元的

ku39999912/14 13:49看到很多人連出現三元都不行我還蠻驚訝的 但照團隊規範

ku39999912/14 13:50走也很重要

TSMCfabXX12/14 14:04不用驚訝, 80/20法則 業界不是學校, 也不是在比行數

worf12/14 14:11不用省行數 ~

worf12/14 14:12重點是看起來怎麼樣

alan310012/14 14:21除非向lamba那種重於流程表達的寫法,不然你一般判斷簡寫

alan310012/14 14:24沒啥差,判斷太複雜難看,判斷簡單就只是自己看順不順眼

pot123412/14 14:25看了很煩@@

justin76100212/14 14:34這種短短都沒差,最怕是超過兩個螢幕寬度的三元...

justin76100212/14 14:35邏輯都一樣,易讀性差很多,我會選擇易讀性

htury12/14 14:42行數不是重點,重點是整個團隊易讀好維護可擴充

htury12/14 14:44今天再來個ccc條件,你怎麼辦?還不是要if else或when

windmax112/14 15:01可讀性跟效能才是最大重點 其他都次之

jackflu12/14 15:01所以他推薦怎寫? 有很多套件可以取代,可以舉例一下嗎?

windmax112/14 15:02跟你前輩溝通看看 簡單易懂的三元沒啥問題

jerry84062212/14 15:06只有一層感覺還好

mirror022712/14 15:09寫扣本來就是好維護第一

shooter55512/14 15:11(condition) ? "YES" : "NO" 這種很好用阿 要取代真的

shooter55512/14 15:11是要多好幾行code 看了就阿雜

shooter55512/14 15:12就跟goto很好用 改用if-else就是要多好幾行

acgotaku12/14 16:06我以前也因為這樣常被擋

acgotaku12/14 16:07不過其實應該只是為了 整份coding style 統一而已

acgotaku12/14 16:07這種被擋還好啦,style 問題都最好解決

acgotaku12/14 16:08最難解決的是思緒問題,每個人對pattern 喜好不一樣

acgotaku12/14 16:09這種觀念差異造成mr過不了。才最頭痛

clanguage12/14 16:10公司就是降...你寫的程式要讓不同智商的人能看懂...

kshieh12/14 16:35題外話,python 的 list comprehension 大家的見解是?

s06yji312/14 16:37個人2層以內接受。但是2層已經不太好讀了

testPtt12/14 17:13很多發明就是要1行:list.first(x==1).first(x==2)...

testPtt12/14 17:13拆開來寫感覺就很弱

TSW12/14 17:30perl系列的可以忽略這串XD

Tix12/14 17:43if else也可以寫成一行啊,呵呵

Burwei12/14 17:54有規範照規範,沒規範不刁難

NikonD512/14 18:04變得很難讀很痛苦

Nigger556612/14 18:06三元都看不懂是文組吧==

wulouise12/14 18:17goto現在c++23有scope_exit可以用啊

wulouise12/14 18:18喔等等這串java

internetms5212/14 18:29一層可以,多層不要,話說你們是沒有更重要的東西

internetms5212/14 18:29可以review了嗎…

lovdkkkk12/14 19:03選幾個估狗查東西時看順眼的 blog 爬他們的文章學跟練

lovdkkkk12/14 19:04或者歷年鐵人賽評價高的找有興趣的爬

lovdkkkk12/14 19:05回錯篇 0rz

Murasaki011012/14 19:29他大概是覺得未來會變多層

fanatics556612/14 20:08你這case單層賦值蠻適合用的

chbo199312/14 20:15你這個例子不用三元 之後會有人搞到a變成 null referen

chbo199312/14 20:15ce

shadow032612/14 20:19有時候用三元判斷式是為了RAII

EKman12/14 21:33省行數可以幹嘛?空白行都拿掉不是更省

jasonwung12/14 21:39寫長一點真的很難看

Kimheeche12/14 22:04還好啊 看團隊而已

WWIII12/14 22:14你這樣很容易就超長 笨方法

SRmoisTEH12/14 22:33三元用習慣很簡潔吧...

zebra1002912/14 22:56真的是宗教問題

purin8812/14 23:49老鳥太弱了,叫他做leetcode,leetcode十分常用三元

viper970912/15 00:00短的一層可以,多層不要+1

wugesmin12/15 00:43三元很好用,可以用的很漂亮

mrsix12/15 00:45三元判斷式若把一堆條件寫成超出螢幕的一行,之後也是得拆

mrsix12/15 00:45分問號冒號一行一行來維護。

mrsix12/15 00:48如果遇到那種三四個判斷式用一行三元判斷式實現而且沒有括

mrsix12/15 00:48號的,這種得非常小心,因為後續若要擴充功能很容易出事。

mrsix12/15 00:50當然最精彩的就是把巢狀用一行三元判斷式搞定

adsl1236712/15 01:07單層沒啥問題 蠻常用的 多層三元在debug容易造成困

adsl1236712/15 01:07

adsl1236712/15 01:07該拆的還是要拆

Sasha072012/15 02:26這種小事居然可以這麼熱烈討論

dooooris12/15 02:30一層可 常用的話會反射動作 秒讀懂

dooooris12/15 02:30多層不要

WaterLengend12/15 05:40要是只有一層又沒提前講好就他問題,顆顆

airtsubasa12/15 07:30這件事你上級主管說什麼就說什麼 sideproject你自己爽

airtsubasa12/15 07:30就好

airtsubasa12/15 07:31*說什麼就是什麼

MonyemLi12/15 07:41每間都不同,沒什麼對錯。google或speing程式碼在你們c

MonyemLi12/15 07:41ode review會過嗎?

TuChinJui12/15 08:15code跑起來沒問題,幫你maintain的人閱讀起來沒問題,

TuChinJui12/15 08:15那就沒問題。沒有對錯。協同合作不是寫一些自己爽的然

TuChinJui12/15 08:15後別人痛苦的事情。

wsad5023212/15 09:14字面簡潔 可是腦袋要多轉一圈 = 思緒不簡潔

a15975312/15 09:29看規定

gogogogo333312/15 10:00除非是團隊共識,不然一般不用

nicepeter12/15 10:26可以用,邏輯簡單的話不影響readability

stupid031912/15 11:31一人專案,團隊=我決定

pennymarkfox12/15 11:57拜託去看clean code好嗎

superpandal12/15 18:07java已經夠囉唆了 一兩層三元還可以 以前我剛入行都

superpandal12/15 18:07被這樣推薦 但是業務邏輯多了就知道無腦if else的壞

superpandal12/15 18:09處 如果是golang我可以接受沒三元 本身就比較簡潔

SHANGOYANYI12/15 20:07沒寫過前端語言吧 前端模板一堆這種東西

lauto12/16 11:53你現在是在工作,不是自爽

m9j00212/16 13:16就跟一夜情一樣,講好就好了

CloudyWing12/16 13:31糟糕,我很常寫巢狀的三元,不過有換行排版應該還好吧

nfsong12/16 14:57拆開比較好放中斷點

pig003812/16 15:45你前輩就是屬於永遠不會碰 GO/kotlin 的那種人

pig003812/16 15:45還是塊陶吧

pig003812/16 15:46我猜你們公司還停留在 java7,用 lambda 他還不馬上罵髒話

superpandal12/16 19:33工作就是看上頭爽不爽 能不能接受 如果上頭喜歡這樣

superpandal12/16 19:34你不爽也得用 這是雙方面的 但如果這都不能講那也就

superpandal12/16 19:35沒有所謂的溝通 基本上都有一些公司所謂的溝通是這樣

superpandal12/16 19:36很想講這不叫溝通好嗎

dalbuhr12/17 00:06說難讀的應該是文盲吧

Dnight12/17 11:56難讀懂的應該是說這種寫成一行吧 result=a?b?c:d:e?f:g

Dnight12/17 11:58不是說看不懂,但是寫成if else要看懂比較快阿