您为什么要私有封装私有常量?

时间:2019-02-26 15:55:00

标签: ruby constants private encapsulation

我遇到了以下代码:

class Foo < Bar
  SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
  private_constant :SM_CONSTANT

  private

  def some_constant
    SM_CONSTANT
  end

我不知道用 private方法封装私有常量的目的。我为什么要这样做?

1 个答案:

答案 0 :(得分:2)

private_constant的原因是为了防止其他代码直接访问该常数。

some_constant今天可能会返回该常量,但是没有义务这样做。如果是按合同进行编程,则必须以这种形式返回散列,该散列的来源无关紧要。

例如,您今天拥有该代码,但是明天它将演变为:

class Foo < Bar
  SM_CONSTANT = {
    a: { name: 'A', priority: 2 },
    b: { name: 'B', priority: -1 }
  }.freeze
  private_constant :SM_CONSTANT

private
  def some_constant
    SM_CONSTANT.map { |k,o| [ k.to_s, o[:name] ] }.to_h
  end
end

内部结构已完全更改,但外部代码没有任何更改的地方,相同的调用会产生相同的结果。这就是封装很重要的原因。它使您可以在特定的上下文中自由地迭代和重做代码,而不必担心破坏其他事情。

如果直接访问SM_CONSTANT的代码,则必须重新编写代码以接受此新结构。

相关问题