Согласно Reek, создание переменной класса считается «кодовый запах». Какое объяснение стоит за этим?
Почему использование переменной класса в Ruby считается «запахом кода»?
Ответы (2)
Как вы можете найти в их документации по переменным класса:
Переменные класса являются частью глобального состояния среды выполнения и, таким образом, позволяют одной части системы случайно или непреднамеренно зависеть от другой части системы. Таким образом, система становится более склонной к проблемам, когда изменение чего-то здесь ломает что-то там. В частности, переменные класса могут затруднить настройку тестов (поскольку контекст теста включает все глобальное состояние).
По сути, это проявление глобального состояния, которое почти повсеместно считается злом, потому что это усложняет тесты и приводит к гораздо более хрупкой структуре класса/программы.
Также стоит прочитать этот вопрос о переполнении стека, который показывает основную проблему с переменными класса : если какой-либо класс наследуется от вашего класса и изменяет переменную класса, изменяется каждый экземпляр этой переменной, даже от родителя! Понятно, что это дает вам возможность легко выстрелить себе в ногу, поэтому лучше избегать их, если вы не очень осторожны.
Также стоит сравнить переменные класса с переменными экземпляра класса. В этом вопросе есть несколько хороших примеров, иллюстрирующих различия в использовании, но по сути, переменные класса являются общими, тогда как переменные экземпляра класса не используются совместно. Поэтому, чтобы избежать нежелательных побочных эффектов, переменные экземпляра класса почти всегда являются тем, что вам нужно.
Вкратце, это:
class Shape
@@sides = 0
def self.sides
@@sides
end
end
class Pentagon < Shape
@@sides = 5
end
puts Shape.sides # oops ... prints 5