如果在ruby代码中,则返回早期

时间:2016-06-17 11:40:31

标签: ruby coding-style guard-clause

我看到两种写同样的东西:

def find_nest(animal)
  return unless animal.bird?
  GPS.find_nest(animal.do_crazy_stuff)
end

VS

def find_nest(animal)
  if animal.bird?
     GPS.find_nest(animal.do_crazy_stuff)
  end
end

哪一个更正确/更可取/遵循最佳做法?或者没关系?

3 个答案:

答案 0 :(得分:17)

根据Ruby style guide

  

当您可以声明无效数据时,首选保护条款。保护条款   是一个函数顶部的条件语句,它被剔除   尽快。

# bad
def compute_thing(thing)
  if thing[:foo]
    update_with_bar(thing)
    if thing[:foo][:bar]
      partial_compute(thing)
    else
      re_compute(thing)
    end
  end
end

# good
def compute_thing(thing)
  return unless thing[:foo]
  update_with_bar(thing[:foo])
  return re_compute(thing) unless thing[:foo][:bar]
  partial_compute(thing)
end

答案 1 :(得分:3)

这显然是个人偏好的问题。但我更喜欢早期回归。它不仅使代码变得更平坦,而且更加平坦。并且更容易阅读,它也可以很好地适应检查的数量。例如:

  def create_terms_of_service_notification
    return if Rails.env.test?
    return if current_user.accepted_tos?
    # imagine 5 more checks here. 
    # Now imagine them as a mess of nested ifs.

    # create the notification
  end

答案 2 :(得分:0)

这:}

def find_nest(animal)
  GPS.find_nest(animal.do_crazy_stuff) if animal.bird?
end