消除成员函数中的幻数的最佳实践

时间:2014-02-14 16:15:19

标签: ruby

我有一个重复使用幻数的方法,但只能在一种方法中使用。

class Foo
  def Bar(str)
     year = str[0..1].to_i + 2000
     month = str[2].ord - 48
     day = str[3].ord - 48
     hour = str[4].ord - 48
     min = str[5].ord - 48
     sec = str[6].ord - 48

     # ...
  end
end

[如果您想知道是否需要在此使用ord而不是to_i,您可能希望看到this other question了解更多背景信息。]

我想在此删除48幻数。唯一可以使用这个神奇数字的地方就是这个特定的方法。我无法将其声明为方法中的常量:

class Foo
  def Bar
    ADJ = 48
    month = str[2].ord - ADJ
    day = str[3].ord - ADJ
    hour = str[4].ord - ADJ
    min = str[5].ord - ADJ
    sec = str[6].ord - ADJ
    # ...
  end
end

因为这会导致dynamic constant assignment (SyntaxError)错误。由于此处ADJ仅适用于此方法,因此将其作为类变量对我来说没有多大意义。

此功能将被频繁调用;我希望解决方案至少不要慢。

在C ++中,我可能会在方法中将其设为static const unsigned,或将其移至未命名的namespace

Rubyist如何消除这个神奇数字?

2 个答案:

答案 0 :(得分:2)

您应该将此常量移动到类/模块定义。

最好将方法移动到模块并在那里添加常量:

module Foo
    XYZ = ...

    def bar
         ...
    end
end

答案 1 :(得分:2)

我的建议是只使用一个变量。

adj = 48

您没有得到保护常量会使您反对更改的值,但该变量仅限于单个方法。通过查看代码和单元测试来确保方法按预期运行应该不难。