无痛增加方法的参数,以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...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 %>

就可以吃到新的逻辑,但又不会分两只方法不好维护
是不是很神奇呢?


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章