Использовать константу или переменную класса? - PullRequest
1 голос
/ 07 января 2012

Я показываю несколько навигационных ссылок на странице. Это будет исправлено в приложении, но в будущем может измениться, но не в интерактивном режиме, просто если новая версия изменила его. Так исправлено в используемом приложении.

Количество ссылок установлено для использования во многих различных действиях в контроллере.

Должен ли я использовать переменную уровня класса @@number_of_link s, чтобы она оставалась в классе и позволяла другим использованиям (например, различным контроллерам и моделям) одного и того же имени без конфликта (то есть в области видимости), или я должен использовать константу, например NumberOfLinks

Мне дали совет по обоим вопросам, и я хотел бы подтвердить свое предпочтение первым.

Ответы [ 5 ]

4 голосов
/ 07 января 2012

Это определенно не константа, если она не константа!

Вместо переменной класса я бы предложил переменную экземпляра класса.Вы получаете все преимущества переменной класса, с еще лучшей областью видимости (другие члены класса не будут сокращать значение, а также упростят доступ.

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 для получения дополнительной информации.

2 голосов
/ 09 января 2012

Как говорит Иайн .. используйте переменные экземпляра класса .. но вы можете уменьшить этот код, используя 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 голосов
/ 07 января 2012

Если оно будет изменено только в новой версии программного обеспечения, сделайте его постоянным. Это лучше отражает цель этого значения.

Значения, которые не будут изменены логикой приложения, не обязательно должны быть временными переменными. Я избегаю переменных класса (и переменных экземпляра класса), когда это возможно, потому что многим разработчикам трудно понять разницу между ними, когда их использовать и т. Д.

1 голос
/ 07 января 2012

Если это что-то строгое, что вы не планируете модифицировать с помощью логики приложения, вы должны использовать константу.

Если это что-то, что вы ожидаете изменить с состоянием класса (еслион экстраполируется на основе состояния взаимодействия с базой данных) вы должны использовать переменную класса.

С точки зрения производительности это не имеет значения, в этом случае, используя описанный выше способ, вы можете принять намерениеиспользование типа переменной, облегчающей понимание разработчиками без «расшифровки».

0 голосов
/ 07 января 2012

Допустим, вам нужно обновить количество ссылок, если вы сделаете это с константой ruby, предупреждает как это "предупреждение: уже инициализированная константа NumOfLinks"

, в таком случае вам следует придерживаться переменной класса.

...