基于多个条件将多个项推入数组的干净方式



代码如下:

def call
banners = []
banners.push(banner1) if condition1?
banners.push(banner2) if condition2?
banners.push(banner3) if condition3?
banners
end
def banner1
{
type: BANNER1,
display_value: 'banner_1'
}
end

有更干净的方式来写这个吗?可能是用更少的代码行?

不像人类编译器的一种方法是使用循环:

def call
[:banner1, :banner2, :banner3].filter_map do |name|
send(name) if send("#{name}?")
end
end

这假定在你想要调用的方法的名字和预判方法之间存在某种关联。

如果不使用散列:

def call
{
banner1: :condition1?,
banner2: :condition2?,
banner3: :condition3?
}.filter_map do |method, condition|
send(method) if send(condition)
}
end

当然,这确实回避了一个问题:这些方法是否可以被DRY:ed成一个接受参数的方法,或者是否需要进行其他重构。

如果您可以将条件移动到banner方法中:

def call
[banner1, banner2, banner3].reject(&:empty?)
end
def banner1
return {} unless condition1?
{
type: BANNER1,
display_value: 'banner_1'
}
end
def banner2
return {} unless condition2?
{
type: BANNER2,
display_value: 'banner_2'
}
end
def banner3
return {} unless condition3?
{
type: BANNER3,
display_value: 'banner_3'
}
end

最新更新