我遇到了这样的代码:
class Foo < Bar
SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
private_constant :SM_CONSTANT
private
def some_constant
SM_CONSTANT
end我不知道将私有常量封装在私有方法中的目的。我为什么要这么做?
发布于 2019-02-26 16:18:13
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,则必须重新编写才能接受这种新结构。
https://stackoverflow.com/questions/54889436
复制相似问题