0

我有一个函数,其中我传递一个字符串和一个将其用作正则表达式的选项

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

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

有没有办法重构这个?

4

2 回答 2

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
于 2013-02-19T04:35:34.940 回答
0

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

于 2013-02-19T04:31:51.373 回答