首页 > 解决方案 > 为什么要私有封装私有常量?

问题描述

我遇到了这段代码:

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

  private

  def some_constant
    SM_CONSTANT
  end

我无法弄清楚将私有常量封装私有方法中的目的。我为什么要这样做?

标签: rubyconstantsprivateencapsulation

解决方案


原因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直接访问代码,则必须重写以接受这种新结构。


推荐阅读