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的空間了!不過切記,遇到複雜邏輯請務必要分行寫,不然未來維護時只會折磨死自己而已,畢竟分行寫的邏輯還是比較清楚的。