首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要私有封装私有常量?

为什么要私有封装私有常量?
EN

Stack Overflow用户
提问于 2019-02-26 15:55:00
回答 1查看 287关注 0票数 2

我遇到了这样的代码:

代码语言:javascript
复制
class Foo < Bar
  SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
  private_constant :SM_CONSTANT

  private

  def some_constant
    SM_CONSTANT
  end

我不知道将私有常量封装在私有方法中的目的。我为什么要这么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-26 16:18:13

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

some_constant今天可能会返回常量,但它没有义务这样做。如果按合同编程,则有义务以该形式返回一个散列,该散列的来源与此无关。

例如,您现在已经有了该代码,但是明天它会发展为:

代码语言:javascript
复制
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,则必须重新编写才能接受这种新结构。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54889436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档