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

1つのメソッドに対して複数の責任があり、それらを分離して適切な名前を付けます。1つのメソッドには、正規表現の検証、複数の引数、および複数のメソッドがあります。SOLIDの原則を読むことをお勧めします。

于 2013-02-19T04:31:51.373 に答える