iT邦幫忙

0

無痛增加方法的參數,以helper為例

自從鐵人賽後休息了幾日
因為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 %>

就可以吃到新的邏輯,但又不會分兩隻方法不好維護
是不是很神奇呢?


尚未有邦友留言

立即登入留言