Ruby code整理系列 if...else
儘管Ruby on Rails的程式碼已經非常精簡,但對新手來說還是會有很多邏輯上的問題,導致寫出很長的程式碼。許多專家針對此提出整理的方法,refactor代表『重新架構』,讓整體程式看起來更乾淨俐落。
『重新架構』的目的並不是要把code縮減到越少越好,而是要讓所有code各司其職,符合物件導向(object-oriented),也符合Rails的邏輯。Ryan Bigg講過一句話:『不要因為程式碼太長而去refactor,因為當程式規模很大的時候,程式碼很長是必然的。』
本篇先從最簡單的Ruby語法談起,簡單利用if...else說明幾個可以讓程式碼縮減的方法:
將if放在後方
如果今天的程式碼是:
if a > 10
puts 'big'
end
那我們可以將if放到第一行,省去end,變成:
puts 'big' if a > 10
這是最簡單的縮減方法,讀起來很像口語英文,很爽
將if...else寫在同一行
一般撰寫 if..else...end 的情況都是:
if a > 10
puts 'big'
else
puts 'small'
end
在邏輯很簡單的情況下,還硬把他寫成5行,實在不是很爽快。等整個程式發展到100行以上時,這5行就會讓人感到很困擾。
以上邏輯可以簡單撰寫成以下寫法:
if a > 10 then puts 'big' else puts 'small' end
使用符號縮寫
像剛剛的寫法,雖然成功的把if...else縮減為一行,但密密麻麻的字,看起來很讓人困擾。身為專業的Ruby開發人員,怎麼可以讓程式碼充滿那麼多字呢?聰明的我們可以使用三元運算子(ternary operator ?:),將以上的用法縮寫為:
a > 10 ? puts 'big' : puts 'small'
問號(?)以左是判斷式,只要回傳true,就會執行冒號(:)左邊的code,否則執行右邊。聰明的各位不用我解釋應該也知道邏輯大概是如此,這時候就要學Tim Cook在iPhone6發表會上講的:"It's pretty cool."
指定數值給變數 assign value to variable
假設我們要判斷a的大小,並將結果指定給變數result,最基本的寫法如下:
if a > 10
result = "big"
else
result = "small"
end
可以使用剛才的方法縮減如下:
a > 10 ? result = "big" : result = "small"
這樣就可以把判斷的結果指定給result。但千萬記得Ruby的原則是DRY (Dont' Repeat Yourself),這種情況我們可以讓他更為縮減:
result = a > 10 ? 'big' : "small"
在等號(=)後面的判斷式只要回傳true,b就等於前面的數值,如果不是的話就等於後面的數值。
多重條件判斷
剛才的情況只能判斷一個if...else,如果我們要判斷以下內容:
if a > 10
result = "big"
elsif a > 5
result = "bigger than 5"
elsif a > 3
result = "bigger than 3"
else
result = "small"
end
像這樣多重的判斷更讓人想吐血,因為明明邏輯很簡單,卻要寫成9行,根本就是浪費螢幕空間!這樣的狀況,可以利用以下寫法來縮減:
result = ("big" if a > 10) || ("bigger than 5" if a > 5) || ("bigger than 3" if a > 3) || "small"
看得出來邏輯嗎?每一個or分隔符號(||)都是一個判斷式,最右邊則是else的內容。或者整個邏輯反過來變成:
result = (a > 10 && "big" or a > 5 && "bigger than 5" or a > 3 && "bigger than 3" or "small")
如果你喜歡把條件放在後面,請選第一個方案,反之請選第二個方案。
相信光是這幾種if...else的寫法,就可以讓大家省掉不少code的空間了!不過切記,遇到複雜邏輯請務必要分行寫,不然未來維護時只會折磨死自己而已,畢竟分行寫的邏輯還是比較清楚的。