重构丑陋的ruby代码

时间:2013-04-10 04:50:58

标签: ruby refactoring

下面的代码会获得一些文字,找到逗号,并返回一个没有逗号的拆分版本的数组。

class A
  def separate_comma_values(text)
    txt_len = text.length
    if txt_len == 0
      return [""]
    end
    final = []
    sub_arry = ""

    for i in (0...txt_len)
      ch = text[i]
      if ch == ","
        final << sub_arry
        final << ""
        sub = ""
      else
        sub_arry += ch
      end
    end
    return final
  end
end

这是一个示例输入和输出:

s = A.new
print s.separate_comma_values("dh,,,dhhd,jhb")
# => ["dh", "", "dh", "", "dh", "", "dhdhhd", ""]

虽然它做了我想做的事情,但我觉得有些事情是不对的。它只是很脏。

我知道我可以使用ruby提供的内置方法来实现拆分。

编辑:我想这是我原来的帖子编辑的。这背后的动机是应用我在阅读红宝石书后发现的知识。

4 个答案:

答案 0 :(得分:1)

Ruby中有一种方法可以满足您的需求。

http://ruby-doc.org/core-2.0/String.html#method-i-split

2.0.0p0 :001 > "dh,,,dhhd,jhb".split(',')
 => ["dh", "", "", "dhhd", "jhb"]

因此,您的代码最终可能会像

一样简单
def separate_comma_values(text)
  text.split(',')
end

更新:抱歉,我错过了您提及的split部分。糟糕。

答案 1 :(得分:0)

这有点干净,虽然正如@depa所指出的那样,如果你试图基于逗号进行拆分,那么有一种更简单的方法,而你的(以及这个)代码也无法正常工作。

class A
  def separate_comma_values(text)
    return [""] if text.empty?

    final = []
    sub_arry = ""

    text.each_char do |ch|
      if ch == ","
        final << sub_arry
        final << ""
      else
        sub_arry += ch
      end
    end

    return final
  end
end

s = A.new
print s.separate_comma_values("dh,,,dhhd,jhb")
puts

此输出

["dh", "", "dh", "", "dh", "", "dhdhhd", ""]

就像你一样。

以下是我实现算法的方法:

class A
  def separate_comma_values(text)
    return [""] if text.empty?

    array = []
    value = ""

    text.each_char do |c|
      if c == ","
        array << value
        value = ""
      else
        value += c
      end
    end

    array << value if !value.empty?

    array
  end
end

s = A.new
print s.separate_comma_values("dh,,,dhhd,jhb")
puts

此输出

["dh", "", "", "dhhd", "jhb"]

答案 2 :(得分:0)

就像一个看起来更好的小技巧(在我看来),你应该能够跳过方法末尾的'return'这个词,你的'seperate_comma_values(text)'可能只是'seperate_comma_values text'没有parens(在你的文本编辑器中,语法颜色突出显示使这根本不是一个明确的问题)

答案 3 :(得分:0)

显然,重构代码的唯一正确方法是使用String#split

虽然,只是为了好玩:

def separate_comma_values(text)
  text.each_char.reduce(['']) do |splitted, char|    
    if char == ','
      splitted << ''
    else
      splitted.last << char
    end    
    next splitted    
  end    
end