根据选项调用方法(重构的最佳方法)

时间:2013-02-19 04:21:42

标签: ruby refactoring

我有一个函数,其中我传递一个字符串和一个选项,将其用作regexp

def regexp_this?(string, arg1, arg2, regx = false)
  if regx
    method1 %r{#{string}:someconstantstring}
    method2 %r{#{string}:someconstantstring:#{arg1}}
    method3 %r{#{string}:someconstantstring:#{arg1}:anotherconstant:#{#arg2}}
  else
    method1 "#{string}:someconstantstring"
    method2 "#{string}:someconstantstring:#{arg1}"
    method3 "#{string}:someconstantstring:#{arg1}:anotherconstant:#{#arg2}"
  end
end

method1method2method3是对expire_fragment的调用。我正在根据页面的当前状态构建缓存。如果声明了arg1或arg2,那么我有不同的缓存键,我需要过期。

有没有办法重构这个?

2 个答案:

答案 0 :(得分:2)

对于条件,至少,您应该能够做到这样的事情:

def regexp_this?(string, arg1, arg2, regx = false)
  # Select whether you want a String or Regexp parameter.
  argument_klass = (regx ? Regexp : String)

  method1 argument_klass.new("#{string}: ...")
  method2 argument_klass.new("#{string}: ...")
  method3 argument_klass.new("#{string}: ...")
end

答案 1 :(得分:0)

您对一种方法有多重责任,将它们分开并适当地命名。您在方法中有正则表达式验证,多个参数和多个方法。我建议阅读the SOLID principles