【问题标题】:Use Constant or Class Variable?使用常量还是类变量?
【发布时间】:2012-02-04 17:03:01
【问题描述】:

我在一个页面上显示了许多导航链接。 它将在应用程序中修复,但将来可能会更改,但不会以交互方式更改,就像新版本更改它一样。因此在使用中的应用程序中固定。

链接的数量设置为在控制器中的许多不同操作中使用。

我应该使用类级别变量@@number_of_links 使其留在类中并允许同名的其他用途(不同的控制器和模型说)没有冲突(即作用域),还是应该使用类似的常量NumberOfLinks?

我在这两个方面都得到了建议,并想确认我对第一个的偏好。

【问题讨论】:

  • 不确定你在问什么;如果它是一个应用程序范围的常量,它应该是一个应用程序范围的常量。如果是类级常量,则应该是类级常量。
  • 嘿,戴夫,谢谢 +1。当您说类级常量时,实际上这是否仅表示在任何方法之外声明的变量?有什么前缀吗?大写?
  • 我应该提供更多关于它如何变化的信息。为了更清楚,我会补充一点,它会稍微改变一下

标签: ruby-on-rails ruby scope constants class-variables


【解决方案1】:

就像 Iain 所说.. 使用 类实例变量.. 但您可以使用 attr_accessor 减少该代码

class Foo
  class << self; attr_accessor :number_of_links; end
  self.number_of_links = 10 #default value..
end

puts Foo.number_of_links
# => 10
Foo.number_of_links = 20

puts Foo.number_of_links
# => 20

【讨论】:

    【解决方案2】:

    如果它只会随着软件的新版本而改变,那么让它成为一个常数。这更好地反映了该价值的意图。

    应用程序逻辑不会更改的值不需要是瞬态变量。我尽可能避免使用类变量(和类实例变量),因为许多开发人员难以理解两者之间的区别、何时使用它们等。

    【讨论】:

      【解决方案3】:

      除非它是常数,否则它绝对不是常数!

      我建议使用类实例变量,而不是类变量。您可以获得类变量的所有好处,并具有更好的作用域(该类的其他成员不会破坏该值,并且访问也更容易。

      class Foo
      
        class << self
          def number_of_links
            @number_of_links ||= 10 # or some sensible default, you might make this a constant to highlight the number when you're reading the code.
          end
      
          def number_of_links=( n )
            @number_of_links = n
          end
        end
      end
      
      puts Foo.number_of_links
      # => 10
      Foo.number_of_links = 20
      
      puts Foo.number_of_links
      # => 20
      

      更多信息请参见http://blog.codegram.com/2011/4/understanding-class-instance-variables-in-ruby

      【讨论】:

      • 谢谢。 +1 我会查看链接。
      【解决方案4】:

      如果您不打算使用应用程序逻辑进行修改,那么您应该使用一个常量。

      如果您希望它随着类的状态而改变(如果它是根据数据库交互的状态推断出来的),您应该使用类变量。

      从性能的角度来看,这并不重要,在这种情况下,以上述方式使用它,您可以使用变量类型来假设意图,这使得贡献的开发人员更容易理解而无需“解码”。

      【讨论】:

      • 一个常量听起来不错,但我在想,如果 num_of_links 曾在其他地方使用过,最好将其范围限定为此类。好像会更安全?
      • 是的,NUM_OF_LINKS 有点模棱两可。常量必须以大写字母开头,因此唯一可能产生“冲突”的方法是重新分配常量,这在 ruby​​ 中是可能的。再一次,惯例胜于聪明。如果它不会改变,其他人可以通过评估您的应用程序的常量来了解您的应用程序的很多信息。
      【解决方案5】:

      假设你需要更新链接的数量,如果你在常量 ruby​​ 上执行它会发出这样的警告“警告:已经初始化常量 NumOfLinks”

      在这种情况下,你应该坚持使用类变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-27
        • 2011-03-17
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多