尽早退出方法链执行

时间:2014-12-29 20:52:14

标签: ruby refactoring

这是一些简单的Ruby代码:

class Foo
  def initialize(args)
    @data = args[:data]
  end

  def perform
    quit_if_no_data
    print_message
  end

  def quit_if_no_data
    return unless @data
  end

  def print_message
    puts "You've got the data, congrats!"
  end
end


Foo.new({}).perform # want nil to be returned

如果在没有数据的情况下实例化对象,如何从nil返回的方法链执行中退出?我希望Foo.new({}).perform返回nil

1 个答案:

答案 0 :(得分:2)

在这种情况下,如果没有提供必需的参数,你可能想在构造函数中引发异常。

如果参数实际上是可选的,您需要稍微重新考虑如何构建程序。你应该删除quit_if_前缀,它永远不会起作用,而不是假设才能工作。你不能用这种方式发明新形式的程序流。你无法(或者应该)能够以这种方式跳出一种方法。如果您愿意,您需要更明确地使用raisethrowrescue / catch

正确执行此操作的方法是让quit_if_no_data方法实际调用should_quit?并简单地返回true / false,指示是否应该退出,然后有条件地退出调用方法:< / p>

  def perform
    return if should_quit?
    print_message
  end

  def should_quit?
    @data == nil
  end

因为Ruby是 Ruby ,你可以创建一些与你尝试用proc做的类似的东西,但它是一个非常过度的解决你的问题的方法,所以不要这样做

 def perform
   with_data do
     print_message
   end
 end

 def with_data
   yield if @data
 end