我有一个函数,其中我传递一个字符串和一个选项,将其用作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
method1
,method2
和method3
是对expire_fragment的调用。我正在根据页面的当前状态构建缓存。如果声明了arg1或arg2,那么我有不同的缓存键,我需要过期。
有没有办法重构这个?
答案 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。