以更干净的方式重写代码

时间:2014-01-06 17:14:35

标签: ruby

我正在使用其中一个心理块,我有一段代码,我想在一个方法中保持一个干净的方式。

这就是这个想法;

def self.number_price(user_id,to)
    user = User.find(user_id)   
    user_prices = user.prices
    user_prices.each do |price|
      if to =~ /^(#{price.prefix})/
        return price.send("price_#{user.currency.downcase}").to_f
      end   
    end
end

但是,如果下面这个循环没有返回任何我想要返回的内容;

return DefaultPrices.send("price_#{user_currency.downcase}").to_f

否则,该方法默认返回user_prices = user.prices

的结果

有人建议采取一些干净的方式来做这件事。 谢谢

3 个答案:

答案 0 :(得分:4)

def self.number_price(user_id, to)
  user = User.find(user_id)   
  price = user.prices.find {|price| to =~ /^(#{price.prefix})/ } || DefaultPrices
  price.send("price_#{user.currency.downcase}").to_f
end

答案 1 :(得分:1)

显而易见的是什么问题? (Delta处理未找到的用户。)

def self.number_price(user_id, to)
  user = User.find(user_id)   
  user.prices.each do |price|
    return price.send("price_#{user.currency.downcase}").to_f if to =~ /^(#{price.prefix})/
  end

  DefaultPrices.send("price_#{user_currency.downcase}").to_f
end

答案 2 :(得分:1)

我认为使用Enumerable#find就是你要找的。我可能会这样做:

def self.number_price(user_id,to)
    prices = User.find(user_id).prices
    price = prices.find {|p| to =~ /^(#{p.prefix})/} || DefaultPrices

    price.send("price_#{user.currency.downcase}").to_f
end

但如果可能的话,我想重构user_id并传递给用户。这样,这个类不需要知道User的实现方式,只知道它有价格方法。

def self.number_price(user,to)
    price = user.prices.find {|p| to =~ /^(#{p.prefix})/} || DefaultPrices

    price.send("price_#{user.currency.downcase}").to_f
end

你可以更进一步,但这似乎是处理它的好方法。