为什么要 private 封装一个私有常量?
Why would you private encapsulate a private constant?
我运行进入这段代码:
class Foo < Bar
SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
private_constant :SM_CONSTANT
private
def some_constant
SM_CONSTANT
end
我无法理解在私有方法中封装一个私有常量的目的。我为什么要这样做?
之所以private_constant
是为了防止其他代码直接访问常量。
some_constant
可能 return 今天不变,但它没有义务这样做。如果按合同编程,则它有义务 return 该形式的散列,其来源无关紧要。
例如,你今天有那个代码,但明天它会演变成:
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
,则必须重写它才能接受这个新结构。
我运行进入这段代码:
class Foo < Bar
SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
private_constant :SM_CONSTANT
private
def some_constant
SM_CONSTANT
end
我无法理解在私有方法中封装一个私有常量的目的。我为什么要这样做?
之所以private_constant
是为了防止其他代码直接访问常量。
some_constant
可能 return 今天不变,但它没有义务这样做。如果按合同编程,则它有义务 return 该形式的散列,其来源无关紧要。
例如,你今天有那个代码,但明天它会演变成:
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
,则必须重写它才能接受这个新结构。