Почему использование переменной класса в Ruby считается "запахом кода"?

По словам Рика, создание переменной класса считается "запахом кода". Что за этим стоит?

1 ответ

Решение

Как вы можете найти в их документации по переменным класса:

Переменные класса являются частью глобального состояния времени выполнения и, таким образом, позволяют одной части системы случайно или непреднамеренно зависеть от другой части системы. Таким образом, система становится более склонной к проблемам, когда изменение чего-то здесь ломает что-то там. В частности, переменные класса могут затруднить настройку тестов (поскольку контекст теста включает в себя все глобальные состояния).

По сути, это проявление глобального состояния, которое почти повсеместно считается злом, потому что оно усложняет тестирование и приводит к гораздо более хрупкой структуре класса / программы.

Этот вопрос переполнения стека может также стоить прочтения, который показывает основную проблему с переменными класса: если какой-либо класс наследуется от вашего класса и модифицирует переменную класса, каждый экземпляр этой переменной изменяется, даже от родителя! Понятно, что это дает вам возможность легко выстрелить себе в ногу, поэтому лучше избегать их, если вы не будете очень осторожны.

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

Вкратце это:

class Shape
  @@sides = 0

  def self.sides
    @@sides
  end
end

class Pentagon < Shape
  @@sides = 5
end

puts Shape.sides  # oops ... prints 5
Другие вопросы по тегам