Ruby on rails 使用散列而不是条件散列的缺点是什么?

Ruby on rails 使用散列而不是条件散列的缺点是什么?,ruby-on-rails,ruby,refactoring,Ruby On Rails,Ruby,Refactoring,为了使代码更具声明性,我喜欢实现的一种模式是替换长条件,如下所示: def make_a_decision(value) if value == 1 "One" elsif value == 2 "Two" elsif value == 3 "Three" end end def make_a_decision(value) { 1 => "One", 2 => "Two", 3 => "Three" }[val

为了使代码更具声明性,我喜欢实现的一种模式是替换长条件,如下所示:

def make_a_decision(value)
  if value == 1
    "One"
  elsif value == 2
    "Two"
  elsif value == 3
    "Three"
  end
end
def make_a_decision(value)
  { 1 => "One",
    2 => "Two",
    3 => "Three"
  }[value]
end
使用如下哈希:

def make_a_decision(value)
  if value == 1
    "One"
  elsif value == 2
    "Two"
  elsif value == 3
    "Three"
  end
end
def make_a_decision(value)
  { 1 => "One",
    2 => "Two",
    3 => "Three"
  }[value]
end
我喜欢这样做,因为它用一个只需要响应
[]
的对象来替换条件。在我看来,它也更容易阅读,部分原因是散列的干燥性质

不过,我没有看到其他红宝石商这么做。为什么不呢

  • 此方法使用更多内存,因为每次调用此方法时,它都会创建一个新的哈希实例
  • 对我来说,它的可读性不如原始版本
  • 这段代码很可能会被更改,并且这一更改可能涉及到除简单相等之外的其他一些条件。然后,您必须重构整个过程来实现更改
  • 记住,干燥并不总是一件好事。在重复数据消除之前,请考虑更改代码的原因。干燥已经高度复制的东西,但不要过早

  • 我一直都是这样做的。除此之外,我将引用散列设置为冻结类常量(例如,
    FOO\u MAPPING
    ),只需执行
    FOO\u MAPPING[value]
    。主观上,我发现它可读性较差。客观地说(除非Ruby对其进行优化),每次调用函数时都会重新定义哈希对象。从我所看到的模式来看,这种模式非常常见,我经常使用它,但它是一个常量,而不是一个方法。我有时也会这样做,但也可以使用
    case
    注意,对于哈希,通过为1添加默认值()或proc(),可以模拟
    if…end
    子句中的
    else
    子句。将散列提取到冻结常量中。两个人。学一点红宝石。三个人。意大利面比普通的散列更难重构。4.干燥总是一件好事。五,<如果不是散列,则应使用code>case(散列仍然是这里的最佳方法。)
    elsif
    非常phpish。纯清除散列只允许引入相等。此外,哈希而不是条件显然不是rubysh。这里是一个关于干:。此外,如果必须以任何方式更改此结构、引入嵌套条件或添加一些其他检查,您将非常头疼。这个散列只是通过映射来转换值的一种方法,但是如果我们不得不添加一些东西,而不是简单的一对一转换,那么它将失败。