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

Согласно Reek, создание переменной класса считается «кодовый запах». Какое объяснение стоит за этим?


person Douglas    schedule 26.11.2016    source источник


Ответы (2)


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

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

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

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

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

person Aurora0001    schedule 26.11.2016

Вкратце, это:

class Shape
  @@sides = 0

  def self.sides
    @@sides
  end
end

class Pentagon < Shape
  @@sides = 5
end

puts Shape.sides  # oops ... prints 5
person Purplejacket    schedule 24.10.2019