gpt4 book ai didi

ruby - 为什么要 private 封装一个私有(private)常量?

转载 作者:数据小太阳 更新时间:2023-10-29 08:56:28 25 4
gpt4 key购买 nike

我遇到了这段代码:

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

private

def some_constant
SM_CONSTANT
end

我不明白在私有(private)方法封装私有(private)常量的目的。我为什么要这样做?

最佳答案

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

some_constant 今天可能会返回常量,但它没有义务这样做。如果按契约(Contract)编程,则它有义务返回该形式的散列,其来源无关紧要。

例如,您今天拥有该代码,但明天它会演变成:

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,则必须重写它以接受这个新结构。

关于ruby - 为什么要 private 封装一个私有(private)常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com