这是编写此Ruby代码的最佳方式吗?

时间:2011-03-31 18:40:08

标签: ruby refactoring

有没有更好的方法来编写这个Ruby代码?请帮助重构。

def get_code(val)
    case val
    when 0..20 then 'E2'
    when 20..32 then 'E1'
    when 33..40 then 'D'
    when 41..50 then 'C2'
    when 51..60 then 'C1'
    when 61..70 then 'B2'
    when 71..80 then 'B1'
    when 81..90 then 'A2'
    when 91..100 then 'A1'
    else 'A0'
    end
 end

4 个答案:

答案 0 :(得分:2)

你的代码非常好。 为了好玩,您可以使用哈希而不是case

def get_code(val)
  my_hash = { 0..20 => 'E2',
    20..32 => 'E1',
    33..40 => 'D',
    41..50 => 'C2',
    51..60 => 'C1',
    61..70 => 'B2',
    71..80 => 'B1',
    81..90 => 'A2',
    91..100 => 'A1' }
  my_hash.select{ |k, v| k === val }.first[1] rescue 'A0'
end

或者更内联:)

def get_code(val)
  { 0..20 => 'E2', 20..32 => 'E1', 33..40 => 'D', 41..50 => 'C2', 51..60 => 'C1', 61..70 => 'B2', 71..80 => 'B1', 81..90 => 'A2', 91..100 => 'A1' }.select{ |k, v| k === val }.first[1] rescue 'A0'
end

并且,正如@Geo注意到的那样,你应该从方法中提取你的哈希值。

答案 1 :(得分:1)

如果这是这种模式的唯一实例,则不值得缩短;它非常清晰,并且不是很嘈杂。

答案 2 :(得分:1)

def get_code(val)
    if [31, 32].include?(val) then 'E1'
    else ['E2', 'E2', 'E1', 'D', 'C2', 'C1', 'B2', 'B1', 'A2', 'A1'][(val-1)/10] || 'A0'
    end
end

我不确定你是如何处理0,否定的。它看起来像一个评分系统。如果我的代码出错,我认为你可以修复它。

<强>更新 另一个版本:

def get_code(val)
    val += 1 if 0 == val
    val -= 2 if [31, 32].include?(val)
    ['E2', 'E2', 'E1', 'D', 'C2', 'C1', 'B2', 'B1', 'A2', 'A1'][(val-1)/10] || 'A0'
end

答案 3 :(得分:1)

不是重构,只是一种较短的编写方式:

def get_code(val)
    case val
    when 0..20
      'E2'
    when 20..32
      'E1'
    when 33..40
      'D'
    when 41..50
      'C2'
    # etc.
    else
      'A0'
    end
 end

或者你可以用分号代替然后

case val
  when  0..20; 'E2'
  when 20..32; 'E1'
  #etc
  else 'A0'
end