自從鐵人賽後休息了幾日
因為30天以來養成的習慣,默默還是注意著可以分享的主題
上週五在工作中無意間發現這個做法
迫不及待想分享給大家
假設現在我有一個helper方法如下,有一個參數:
def some_helper input
#do something...
end
順帶一提,方法後面的括號可以省略
兩個以上的變數直接用逗號分隔
def some_helper input1, input2
#...
end
自從我知道後能不寫就不寫,使用時括號一樣可以省去
所以使用上像是這樣
<%= some_helper input %>
在實務上很常有一個情況
就是隨著專案的擴展,原本只需要一個參數的方法
為了盡可能重複利用程式碼,可能需要一個新的參數
不然就要有兩段幾乎複製貼上的code
如果是java,同名方法如果有不同參數數量的型態
會自動判別為不同方法,也就是可以透過參數數量決定使用哪一種方法
但rails並沒有
這種情況下可能有幾種常見的做法:
例如說將所有之前用到的地方改為
<%= some_helper input, input2 %>
加上第二個參數,為了與新的邏輯相容
但要去改所有的舊code是一件很麻煩的事
所以也可能有另一種做法
原本的方法不動,新增一個幾乎一樣的方法
def some_helper input
#do something...
end
def new_some_helper input, input2
#almost same
end
裡面相同的部分可以抽出來
在使用上的好處是舊的地方不用更動
只需要在新的地方使用新的方法即可
原本使用之處
<%= some_helper input %>
新的需求
<%= new_some_helper input, input2 %>
這種做法雖然讓舊code不需要調整
但是違反了dry的精神
這就是今天這篇文章要分享的重點
我寫出來後忍不住自己讚嘆自己XD
假設新的參數為布林值,用來區分新舊方法的不同
那可以改寫如下:
def some_helper input, input2 = true
if input2
#原本的code
else
#新的邏輯
end
#共同的部分拉出來統一執行
end
這樣等於是上面兩種方法好處的集合
舊的寫法不需要更動
<%= some_helper input %>
依然可以正常執行,不會出錯。
而新的邏輯只需要給第二個參數為false
<%= some_helper input, false %>
就可以吃到新的邏輯,但又不會分兩隻方法不好維護
是不是很神奇呢?