0

它是 Rails/Ruby。只是想知道是否有 DRYer 版本可以删除以下代码中的重复:

case params[:order]
when 'rating_ascend'
  order = {:order => 'rating_average ASC'}
when 'rating_descend'
  order = {:order => 'rating_average DESC'}
when 'distance'
  order = {:order => 'distance ASC'}
else
  order = {:order => 'distance ASC'}
end

谢谢。

4

6 回答 6

5

当然,有。

order = case params[:order]
  when 'rating_ascend'
    {:order => 'rating_average ASC'}
  when 'rating_descend'
    {:order => 'rating_average DESC'}
  else
    {:order => 'distance ASC'}
end

甚至这个(我不会这样写,但这是 DRYer)

order = {:order => case params[:order]
  when 'rating_ascend' then 'rating_average ASC'
  when 'rating_descend' then 'rating_average DESC'
  else 'distance ASC'
end}

当您将代码简化到这一点时,您会注意到您有双倍的“距离 ASC”结果。是错字还是故意的?

于 2012-08-10T12:57:05.043 回答
3
order = {}
order[:order] = case params[:order]
when "rating_ascend" then "rating_average ASC"
when "rating_descend" then "rating_average DESC"
else "distance ASC"
end
于 2012-08-10T12:57:49.363 回答
3
orders = {'rating_ascend' =>  'rating_average ASC', 'rating_descend' => 'rating_average DESC', 'distance' => 'distance ASC'}
Model.order(orders[params[:order]] || 'distance ASC')
于 2012-08-10T13:23:39.603 回答
2

使用“提取方法”重构模式:

def determine_order(order)
  case order
  when 'rating_ascend'
    'rating_average ASC'
  when 'rating_descend'
    'rating_average DESC'
  else
    'distance ASC'
end

order = {:order => determine_order(params[:order])}
于 2012-08-10T13:39:01.967 回答
1

您可以像以前的答案一样做,甚至为了使它更好,只需删除不需要的案例

  when 'distance'
    'distance ASC'

因为 else 部分将执行相同的操作。

order = {:order => case params[:order]
  when 'rating_ascend'
    'rating_average ASC'
  when 'rating_descend'
    'rating_average DESC'
  else
    'distance ASC'
end}
于 2012-08-10T13:02:27.253 回答
0

如何使用不同的选项创建哈希并使用 fetch 来查找选项,例如:

order = order_hash.fetch(params[:order], {:order => 'distance ASC'})

def order_hash
  {
    'rating_ascend' => {:order => 'rating_average ASC'},
    'rating_descend' => {:order => 'rating_average DESC'},
    'distance' => {:order => 'distance ASC'}
  }
end

而且由于 fetch 可以将默认选项作为第二个参数,因此您可以在案例结束时轻松解决 else 问题。

于 2014-11-07T22:45:07.920 回答