自从铁人赛后休息了几日
因为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...enddef new_some_helper input, input2 #almost sameend
里面相同的部分可以抽出来
在使用上的好处是旧的地方不用更动
只需要在新的地方使用新的方法即可
原本使用之处<%= 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 %>
就可以吃到新的逻辑,但又不会分两只方法不好维护
是不是很神奇呢?