有什么方法可以重构这个代码吗?

时间:2011-06-23 20:20:44

标签: ruby if-statement

我做了一个非常好的黑客并削减了原始代码,但是我没有看到任何方法来缩小这个较小的,而不将支票放入模块中的另一个文件。每当/ x /时,正则表达式文本都是不同的,所以它们不能再被我想到的任何组合

    case state
      when /OH|PA|MN/
        if @browser.text.include?("My text")
            raise "x" unless /foo/.match(@browser.text)
            raise "y" unless /foo2/.match(@browser.text)
            raise "z" unless /foo3/.match(@browser.text)
        else
            raise "x1" unless /foofoo/.match(@browser.text)
            raise "y1" unless /foofoo2/.match(@browser.text)
            raise "z1" unless /foofoo3/.match(@browser.text)
        end
      when /IL|VA/
        if @browser.text.include?("My text")
            raise "x" unless /foo/.match(@browser.text)
            raise "y" unless /foo2/.match(@browser.text)
            raise "z" unless /foo3/.match(@browser.text)
        else
            raise "x1" unless /foofoo/.match(@browser.text)
            raise "y1" unless /foofoo2/.match(@browser.text)
            raise "z1" unless /foofoo3/.match(@browser.text)
        end
      when /WI|SC|TN|IN|IA/
        if @browser.text.include?("My text")
            raise "x" unless /foo/.match(@browser.text)
            raise "y" unless /foo2/.match(@browser.text)
            raise "z" unless /foo3/.match(@browser.text)
        else
            raise "x1" unless /foofoo/.match(@browser.text)
            raise "y1" unless /foofoo2/.match(@browser.text)
            raise "z1" unless /foofoo3/.match(@browser.text)
        end
      when /SC/
        if @browser.text.include?("My text")
            raise "x" unless /foo/.match(@browser.text)
            raise "y" unless /foo2/.match(@browser.text)
            raise "z" unless /foo3/.match(@browser.text)
        else
            raise "x1" unless /foofoo/.match(@browser.text)
            raise "y1" unless /foofoo2/.match(@browser.text)
            raise "z1" unless /foofoo3/.match(@browser.text)
        end
      when /GA/
        if @browser.text.include?("My text")
            raise "x" unless /foo/.match(@browser.text)
            raise "y" unless /foo2/.match(@browser.text)
            raise "z" unless /foo3/.match(@browser.text)
        else
            raise "x1" unless /foofoo/.match(@browser.text)
            raise "y1" unless /foofoo2/.match(@browser.text)
            raise "z1" unless /foofoo3/.match(@browser.text)
        end
      else
        raise "Not a valid state"
      end

2 个答案:

答案 0 :(得分:1)

我认为它在你的真实代码中有所不同,所以你无法做到

if state =~/OH|PA|MN|IL|VA|WI|SC|TN|IN|IA|SC|GA/
    if @browser.text.include?("My text")
        raise "x" unless /foo/.match(@browser.text)
        raise "y" unless /foo2/.match(@browser.text)
        raise "z" unless /foo3/.match(@browser.text)
    else
        raise "x1" unless /foofoo/.match(@browser.text)
        raise "y1" unless /foofoo2/.match(@browser.text)
        raise "z1" unless /foofoo3/.match(@browser.text)
    end
else
    raise "Not a valid state"
end

因为现在你可以。所以,如果你真的想要一个答案,为什么你发布了可以轻松减少的假代码呢?

答案 1 :(得分:1)

raise "Not a valid state" unless %w[OH PA MN IL VA WI SC TN IN IA SC GA].include?(state)
if @browser.text.include?("My text")
  raise case @browser.text
  when /foo/; "x"
  when /foo2/; "y"
  when /foo3/; "z"
  end
else
  raise case @browser.text
  when /foofoo/; "x1"
  when /foofoo2/; "y1"
  when /foofoo3/; "z1"
  end
end