我遇到了以下代码:
class Foo < Bar
SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
private_constant :SM_CONSTANT
private
def some_constant
SM_CONSTANT
end
我不知道用 private方法封装私有常量的目的。我为什么要这样做?
答案 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
的代码,则必须重新编写代码以接受此新结构。