1

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

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

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

我已经得到了关于这两个方面的建议,并想确认我对第一个的偏好。

4

5 回答 5

4

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

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

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

于 2012-01-07T03:36:59.167 回答
2

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

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

于 2012-01-07T04:53:21.360 回答
2

就像 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
于 2012-01-09T14:54:42.820 回答
1

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

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

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

于 2012-01-07T03:27:35.720 回答
0

假设您需要更新链接数量,如果您通过常量 ruby​​ 会发出这样的警告“警告:已经初始化常量 NumOfLinks”

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

于 2012-01-07T02:31:27.160 回答