ruby - 重构if else语句

时间:2016-02-08 17:24:25

标签: ruby-on-rails ruby refactoring

我已经尝试阅读一些关于重构的教程,我正在努力解决条件问题。我不想使用三元运算符,但也许这应该在方法中提取?或者有一种聪明的方式来使用地图吗?

detail.stated = if value[:stated].blank?
                  nil
                elsif value[:stated] == "Incomplete"
                  nil
                elsif value[:is_ratio] == "true"
                  value[:stated] == "true"
                else
                  apply_currency_increment_for_save(value[:stated])
                end

4 个答案:

答案 0 :(得分:4)

如果将此逻辑移动到某个方法中,由于早期return(以及关键字参数),它可以变得更加清晰:

def stated?(stated:, is_ratio: nil, **)
  return if stated.blank? || stated == "Incomplete"
  return stated == "true" if is_ratio == "true"
  apply_currency_increment_for_save(stated)
end

则...

detail.stated = stated?(value)

答案 1 :(得分:1)

stated = value[:stated]
detail.stated = case
  when stated.blank? || stated == "Incomplete"
    nil
  when value[:is_ratio] == "true"
    value[:stated] == "true"
  else
    apply_currency_increment_for_save stated
end

发生了什么:如果在没有表达式的情况下使用case,它就会成为if ... elsif ... else ... fi.

的文明等价物

您也可以使用其结果,就像if...end一样。

答案 2 :(得分:0)

将代码移至apply_currency_increment_for_save 并做:

def apply_currency_increment_for_save(value)
  return if value.nil? || value == "Incomplete"
  return "true" if value == "true"
  # rest of the code. Or move into another function if its too complex
end                         

逻辑被封装,只需要2行

答案 3 :(得分:0)

我喜欢@Jordan的建议。然而,似乎电话不完整 - ' is_ratio'参数也是从值中选择但未提供。

仅仅为了争论,我建议你可以更进一步,提供一个,它非常专注于评估一个"陈述的"值。这似乎是极端的,但它符合单一责任的概念(责任正在评估"价值"陈述 - 而'细节'对象可能专注于其他事情而仅仅是制造使用评估)。

它看起来像这样:

@require_login
def get(self):
    ....

请注意,这可以使用Rails' StringInquirer class