我看到了两种编写同一件事的样式:
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
哪一个更正确/更可取/以下最佳赛车?还是没关系?
根据红宝石样式指南,
当您可以断言无效的数据时,请选择一个护罩子句。后卫条款是一个有条件的语句尽快。
# 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
这显然是个人喜好的问题。但是我更喜欢提早回报。它不仅使代码"扁平"且更易于阅读,而且还可以很好地缩放检查数量。例如:
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
this:}
def find_nest(animal)
GPS.find_nest(animal.do_crazy_stuff) if animal.bird?
end