我看到两种写同样的东西:
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
哪一个更正确/更可取/遵循最佳做法?或者没关系?
答案 0 :(得分:17)
当您可以声明无效数据时,首选保护条款。保护条款 是一个函数顶部的条件语句,它被剔除 尽快。
# 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