ruby - 为什么要私有封装私有常量?
问题描述
我遇到了这段代码:
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
今天可能会返回常量,但它没有义务这样做。如果按合同编程,则有义务以该形式返回散列,其来源无关紧要。
例如,您今天拥有该代码,但明天它会演变成:
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
直接访问代码,则必须重写以接受这种新结构。
推荐阅读
- ethereum - Remix IDE 出现错误“请在文件资源管理器中选择可以找到合约元数据的文件夹”
- angular - 在 Ionic4(或 Angular8+)中每次构建(服务或构建产品)后运行脚本
- javascript - fullCalendar eventResize 函数从未触发
- asp.net - 从弹出窗口添加和更新数据的方法
- python - 从不同的大文件中打乱数据的有效方法
- python - 如何从脚本中获取多个结果
- java - ClassCastException 使用 Primefaces PickList
- java - UTC 时间会自动添加到我的日期变量中
- azure - Azure IoT Hub MQTT 用户名和密码字符长度限制
- swift - 已发布的变量不会重新加载视图